Java 无加密的sslengine cypher套件
Java 无加密的sslengine cypher套件,java,security,ssl,netty,sslengine,Java,Security,Ssl,Netty,Sslengine,我在使用Java的SSLEngine时遇到了一个小问题。我使用它在客户端和服务器之间创建SSL连接。这不是基于web的应用程序 我正在为我的产品开发人员创建一个框架,以便在客户端和服务器之间进行通信。根据他们的配置,我必须创建连接。如果需要加密,我必须创建一个加密通道并将其提供给他们;如果没有,我只需要创建一个没有加密但带有消息摘要的SSL通道,因此我需要启用的密码套件是SSL\u RSA\u with_NULL\u MD5。 如果需要加密,我将使用SSL\u RSA\u和\u\u SHA/MD
我在使用Java的
SSLEngine
时遇到了一个小问题。我使用它在客户端和服务器之间创建SSL连接。这不是基于web的应用程序
我正在为我的产品开发人员创建一个框架,以便在客户端和服务器之间进行通信。根据他们的配置,我必须创建连接。如果需要加密,我必须创建一个加密通道并将其提供给他们;如果没有,我只需要创建一个没有加密但带有消息摘要的SSL通道,因此我需要启用的密码套件是SSL\u RSA\u with_NULL\u MD5
。
如果需要加密,我将使用SSL\u RSA\u和\u\u SHA/MD5
我可以配置第二个…但无法配置SSL\u RSA\u和\u NULL\u MD5
。它给了我一个异常消息没有通用密码套件
。我用来开发这个的框架是Netty(jbossnetty)
有人能帮我吗
代码::
public static ChannelFuture doHandshake(Channel channel,boolean isServer){
if (isServer) {
SSLEngine engine = SslContextFactory.getServerContext().createSSLEngine();
engine.setUseClientMode(false);
//engine.setWantClientAuth(true);
engine.setNeedClientAuth(true);
System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");
String[] enabledSuites = engine.getEnabledCipherSuites();
//String[] sdf = engine.getSupportedCipherSuites();
engine.setEnabledCipherSuites(getWantedCyphers(enabledSuites, true));
engine.setEnableSessionCreation(true);
channel.getPipeline().addFirst(SSL_SERVER_HANDLER_NAME, new SslHandler(engine));
SslHandler sslHandler = (SslHandler) channel.getPipeline().get(SSL_SERVER_HANDLER_NAME);
sslHandler.setEnableRenegotiation(true);
return sslHandler.handshake();
} else {
SSLEngine engine = SslContextFactory.getClientContext().createSSLEngine();
engine.setUseClientMode(true);
engine.setEnableSessionCreation(true);
//engine.setWantClientAuth(true);
//engine.setNeedClientAuth(true);
System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");
String[] enabledSuites=engine.getEnabledCipherSuites();
//String[] sdf=engine.getSupportedCipherSuites();
engine.setEnabledCipherSuites(getWantedCyphers(enabledSuites,true));
channel.getPipeline().addFirst(SSL_CLIENT_HANDLER_NAME, new SslHandler(engine));
SslHandler sslHandler = (SslHandler) channel.getPipeline().get(SSL_CLIENT_HANDLER_NAME);
sslHandler.setEnableRenegotiation(true);
return sslHandler.handshake();
}
}
public static String[] getWantedCyphers(String[] enabledSuites,boolean isEnabled) {
List<String> wantedCyphers = new LinkedList<String>();
String[] finalEnabledCyphers = null;
if (!isEnabled) {
finalEnabledCyphers = new String[1];
finalEnabledCyphers[0] = "SSL_RSA_WITH_NULL_MD5";
return finalEnabledCyphers;
}
String configFilePath = TestConstants.CONFIG_FILE;
ConfigSAXParser configParser = new ConfigSAXParser();
<OurOwnConfigClass>config = null;
try {
config = (<OurOwnConfigClass>(configParser.parseFile(configFilePath));
} catch (SAXParserException spe){
}
<ourOwnConfigSubClass> communicationConfig = config.getCommunicationConfig();
String[] requestedCyphers = communicationConfig.getEncryptionAlgorithms();
for (int i=0;i<requestedCyphers.length;i++){
requestedCyphers[i] = "SSL_RSA_WITH_"+requestedCyphers[i]+"_SHA";
}
List<String> stList = new LinkedList<String>();
for (int i=0;i<enabledSuites.length;i++) {
stList.add(enabledSuites[i]);
}
for (int j=0;j<requestedCyphers.length;j++) {
if (stList.contains(requestedCyphers[j])) {
wantedCyphers.add(requestedCyphers[j]);
}
}
Object[] strings = wantedCyphers.toArray();
finalEnabledCyphers = new String[strings.length];
for (int k=0;k<strings.length;k++) {
finalEnabledCyphers[k] = (String)strings[k];
}
return finalEnabledCyphers;
}
公共静态通道未来握手(通道通道,布尔isServer){
如果(isServer){
SSLEngine engine=SslContextFactory.getServerContext().CreateSLengine();
engine.setUseClientMode(假);
//engine.setWantClientAuth(true);
engine.setNeedClientAuth(真);
System.setProperty(“sun.security.ssl.allowUnsaference”、“true”);
字符串[]enabledSuites=engine.getenablediphersuites();
//字符串[]sdf=engine.getSupportedCipherSuite();
engine.SetEnablediPhone套件(getWantedCyphers(EnabledSuite,true));
engine.setEnableSessionCreation(true);
channel.getPipeline().addFirst(SSL_服务器_处理程序_名称,新的SslHandler(引擎));
SslHandler SslHandler=(SslHandler)channel.getPipeline().get(SSL\服务器\处理程序\名称);
sslHandler.setEnableRenegotiation(true);
返回sslHandler.handshake();
}否则{
SSLEngine engine=SslContextFactory.getClientContext().CreateSLengine();
engine.setUseClientMode(真);
engine.setEnableSessionCreation(true);
//engine.setWantClientAuth(true);
//engine.setNeedClientAuth(真);
System.setProperty(“sun.security.ssl.allowUnsaference”、“true”);
字符串[]enabledSuites=engine.getenablediphersuites();
//字符串[]sdf=engine.getSupportedCipherSuite();
engine.SetEnablediPhone套件(getWantedCyphers(EnabledSuite,true));
channel.getPipeline().addFirst(SSL_CLIENT_HANDLER_NAME,新的SslHandler(引擎));
SslHandler SslHandler=(SslHandler)channel.getPipeline().get(SSL\u CLIENT\u HANDLER\u NAME);
sslHandler.setEnableRenegotiation(true);
返回sslHandler.handshake();
}
}
公共静态字符串[]getWantedCyphers(字符串[]EnabledSuite,布尔值isEnabled){
List wantedcypher=new LinkedList();
字符串[]finalEnabledCyphers=null;
如果(!isEnabled){
finalEnabledCyphers=新字符串[1];
finalEnabledCyphers[0]=“SSL\u RSA\u带空\u MD5”;
返回finalEnabledCyphers;
}
字符串configFilePath=TestConstants.CONFIG\u文件;
ConfigSAXParser configParser=新的ConfigSAXParser();
config=null;
试一试{
config=((configParser.parseFile(configFilePath));
}捕获(SAXParserException spe){
}
communicationConfig=config.getCommunicationConfig();
String[]requestedCyphers=communicationConfig.getEncryptionAlgorithms();
对于(int i=0;i您是否已将其添加到启用的密码套件中?无通用密码套件”消息表示服务器不接受客户端Hello消息中的任何密码套件。更重要的是,您试图使用不执行任何数据加密的空密码套件。默认情况下,大多数服务器不支持空密码套件,您必须显式启用此选项y、 是的..当我只添加到SetEnabledCypherSuite时。你将能够执行该操作。然后,只有它才能抛出一个异常,没有常见的密码套件。代码有点难…我可以看到问题..SetEnabledCypherSuite将只与我们从GetEnabledCypherSuite调用中获得的套件一起工作。结果是,我没有SSL\u RSA\u和\u NULL\u MD5。所以t这里应该有一种明确启用密码的方法。那就是我主要寻找的密码套件。我检查了该套件是否受支持。但请确保添加它,而不仅仅是替换所有已启用的密码套件。您需要向我们展示启用密码套件的代码,以及它与创建套接字和使用套接字的关系。im not使用套接字…im使用通道..使用NIO。在这种情况下,我必须替换rite..coz..如果需要加密..我不应该提供任何加密。如果我只是添加它。它可能会在服务器和客户端之间选择一个公共套件。如果它选择添加基于加密的套件,那么它将根据需要的wat出错…我创建了我的使用我所做的更改中的示例编写的代码是将密码套件添加到SSLEngine实例中。thts it.你能告诉我如何显式启用吗?实际上服务器和客户端只是普通机器。我们上下文中的服务器是我们产品的一个组件,可以向客户端发送一些数据。thts it.我可以是同一台机器,也可以是不同的机器租用机器。我尝试了这两种情况。没有用。如果你能告诉我如何显式启用,那将非常有帮助。在getWantedCyphers
的末尾,我看到你正在使用toArray()
然后将数组复制到不同类型的数组中。有一种更简单的方法!返回wantedCyphers.toArray(新字符串[wantedCyphers.size());
输入正确,速度更快。是的……是的。我知道……这只是一个示例。无论如何,谢谢:)……但我的担心完全不同:(