Java 不支持的SSL密码套件

Java 不支持的SSL密码套件,java,ssl,encryption,Java,Ssl,Encryption,我正在尝试使用一些自定义SSL密码套件。具体来说,我的清单是 <util:list id="ciphers" value-type="java.lang.String"> <value>DHE-RSA-AES256-SHA</value> <value>DHE-DSS-AES256-SHA</value> <value>DHE-RSA-CAMELLIA256-SHA</value>

我正在尝试使用一些自定义SSL密码套件。具体来说,我的清单是

<util:list id="ciphers" value-type="java.lang.String">
    <value>DHE-RSA-AES256-SHA</value>
    <value>DHE-DSS-AES256-SHA</value>
    <value>DHE-RSA-CAMELLIA256-SHA</value>
    <value>DHE-DSS-CAMELLIA256-SHA</value>
    <value>AES256-SHA</value>
    <value>CAMELLIA256-SHA</value>
    <value>SSL_RSA_WITH_RC4_128_MD5</value>    <---this is the only one working
    <value>PSK-AES256-CBC-SHA</value>
    <value>EDH-RSA-DES-CBC3-SHA</value>
    <value>EDH-DSS-DES-CBC3-SHA</value>
    <value>DES-CBC3-SHA</value>
    <value>PSK-3DES-EDE-CBC-SHA</value>
    <value>DHE-RSA-AES128-SHA</value>
    <value>DHE-DSS-AES128-SHA</value>
    <value>DHE-RSA-CAMELLIA128-SHA</value>
    <value>DHE-DSS-CAMELLIA128-SHA</value>
    <value>AES128-SHA</value>
    <value>CAMELLIA128-SHA</value>
    <value>PSK-AES128-CBC-SHA</value>
</util:list>
不幸的是,我的客户端无法连接到我创建的存根服务器。我得到的例外是:

Caused by: java.lang.IllegalArgumentException: Unsupported ciphersuite DHE-RSA-AES256-SHA
at com.sun.net.ssl.internal.ssl.CipherSuite.valueOf(CipherSuite.java:171)
at com.sun.net.ssl.internal.ssl.CipherSuiteList.<init>(CipherSuiteList.java:62)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.setEnabledCipherSuites(SSLSocketImpl.java:1977)
at org.apache.cxf.transport.https.SSLSocketFactoryWrapper.enableCipherSuites(SSLSocketFactoryWrapper.java:101)
at org.apache.cxf.transport.https.SSLSocketFactoryWrapper.createSocket(SSLSocketFactoryWrapper.java:71)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:372)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:883)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1394)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1336)
at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:42)
at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1414)
... 41 more
原因:java.lang.IllegalArgumentException:不支持的密码套件DHE-RSA-AES256-SHA
位于com.sun.net.ssl.internal.ssl.CipherSuite.valueOf(CipherSuite.java:171)
位于com.sun.net.ssl.internal.ssl.CipherSuiteList。(CipherSuiteList.java:62)
在com.sun.net.ssl.internal.ssl.SSLSocketImpl.setenablediphonesuites上(SSLSocketImpl.java:1977)
位于org.apache.cxf.transport.https.SSLSocketFactoryWrapper.enableCipherSuites(SSLSocketFactoryWrapper.java:101)
位于org.apache.cxf.transport.https.SSLSocketFactoryWrapper.createSocket(SSLSocketFactoryWrapper.java:71)
位于sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:372)
位于sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
位于sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:883)
位于sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
位于org.apache.cxf.transport.http.httpconductor$WrappedOutputStream.handlehaderstrustcaching(httpconductor.java:1394)
位于org.apache.cxf.transport.http.httpconductor$WrappedOutputStream.onFirstWrite(httpconductor.java:1336)
位于org.apache.cxf.io.AbstractWrappedOutStream.write(AbstractWrappedOutStream.java:42)
位于org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
位于org.apache.cxf.transport.http.httpconductor$WrappedOutputStream.close(httpconductor.java:1414)
... 41多
当我尝试一个接一个地删除密码套件时,每次都会以不同的密码出现相同的异常,直到只剩下SSL_RSA_和_RC4_128_MD5。这是唯一一个似乎有效的

我看了一下,这似乎是一个相同的问题,但我没有空白

编辑:作为旁注,我的系统是在Java1.5上运行的,难道这些密码在这个Java版本中不受支持吗?如果没有,有办法解决这个问题吗

更新:我们迁移到了Java7,我仍然遇到同样的问题。我认为这与下面的一个答案有关,即这些不是密码的标准名称,因此java无法识别。如果是这样,我怎样才能找到这些密码的标准名称

难道这些密码在这个java版本中不受支持吗

当然可以。记录了可用的密码套件。看

如果没有,有办法解决这个问题吗


除非您能找到另一个支持它们的实现。

为了将来的参考,我使用的密码列表来自,它们是由

openssl ciphers -v 'ALL:!ADH:!EXPORT:!SSLv2:+HIGH:-MEDIUM:-LOW:-KRB5'. 
我从未发现如何将openssl密码列表转换为支持java 7的密码(或者确认它们是否是相同的密码,只是名称不同)。我刚刚将我的密码列表更改为Java提供的列表

一切正常。

检查:

而且

默认情况下,
jre\u home
/lib/security/
下的local\u policy.jarUS\u export\u policy.jar可能无法“启用”所需的密码套件

要启用它们,请将这两个文件替换为此处找到的文件

您应该不能使用Sun Providers支持的密码套件

// Get the SSLServerSocket
SSLServerSocketFactory ssl;
SSLServerSocket sslServerSocket;
ssl = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
sslServerSocket = (SSLServerSocket) ssl.createServerSocket();

// Get the list of all supported cipher suites.
String[] cipherSuites = sslServerSocket.getSupportedCipherSuites();
for (String suite : cipherSuites)
  System.out.println(suite);

// Get the list of all supported protocols.
String[] protocols = sslServerSocket.getSupportedProtocols();
for (String protocol : protocols)
  System.out.println(protocol);

确保密码套件描述与Sun Providers下的描述相匹配。

您使用的密码名称似乎是非标准的(除有效的密码外),标准密码(从和)都以
TLS\uu
(或
SSL\u
为SSL)开头,因为您非常关心这一点,可以指定自定义密码套件,看在皮特的份上,移除RSA。大多数明智的人认为它只剩下几个月的生命了(即使它还没有被秘密破解)。那么根据这个说法,Java 7支持的密码中80%的密码都被破解了?对不起,我不是专业人士,我们刚刚升级到java 7,在java 7下我仍然得到相同的异常。你从哪里得到这些密码套件名称的?您期望任何实现都支持它们的基础是什么?openssl由openssl密码生成-v'ALL:!ADH:!出口:!SSLv2:+高:-中:-低:-KRB5'。我知道它们可能不受支持,但java在其他名称下不支持它们的(类似?)版本吗?请使用下划线而不是连字符来尝试它们。但是:标准名称和OpenSSL名称之间的映射现在在“密码套件名称”下已经进行了一半。从标准到开放SSL:对于普通RSA KX,去掉前导的
SSL
TLS
,去掉
RSA
,把
(EC)DH\u anon
换成
A(EC)DH
,用
去掉
,通常把
3DES\u EDE\u CBC
换成
DES-CBC3
,通常去掉其他
,删除一些其他非需要的位和一些
,并将剩余的
更改为
-
// Get the SSLServerSocket
SSLServerSocketFactory ssl;
SSLServerSocket sslServerSocket;
ssl = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
sslServerSocket = (SSLServerSocket) ssl.createServerSocket();

// Get the list of all supported cipher suites.
String[] cipherSuites = sslServerSocket.getSupportedCipherSuites();
for (String suite : cipherSuites)
  System.out.println(suite);

// Get the list of all supported protocols.
String[] protocols = sslServerSocket.getSupportedProtocols();
for (String protocol : protocols)
  System.out.println(protocol);