7

我正在尝试使用一些自定义 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>

,由Spring初始化并传递给方法

tlsClientParameters.setCipherSuites()

不幸的是,我的客户端无法连接到我创建的存根服务器。我得到的例外是:

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

当我尝试一一删除密码套件时,每次都以不同的密码出现相同的异常,直到只剩下 SSL_RSA_WITH_RC4_128_MD5 。这是唯一一个似乎有效的方法。

我查看了如何控制 Tomcat 可用的 SSL 密码,这似乎是一个相同的问题,但我没有空格。

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

更新:我们迁移到 Java 7,但我仍然遇到同样的问题。我认为这与以下答案之一有关,即这些不是密码的标准名称,因此 java 无法识别。如果是这种情况,我怎样才能找到这些密码的标准名称?

4

4 回答 4

5

难道这个java版本不支持这些密码?

当然。记录了可用的密码套件。请参阅标准名称文档

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

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

于 2013-11-07T19:58:08.777 回答
2

查看:

太阳供应商

还,

默认情况下,/lib/security/ 下的local_policy.jarUS_export_policy.jar可能不会启用”您想要的密码套件。jre_home

要启用它们,请将这两个文件替换为此处找到的文件Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download

您应该无法使用 Sun 提供程序支持的密码套件。

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

于 2013-11-21T07:50:11.740 回答
2
// 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);
于 2014-05-15T19:25:55.080 回答
1

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

openssl ciphers -v 'ALL:!ADH:!EXPORT:!SSLv2:+HIGH:-MEDIUM:-LOW:-KRB5'. 

我从来没有找到如何将 openssl 密码列表转换为 java 7 支持的密码(或确认它们是否是相同的密码,只是名称不同)。我刚刚将我的密码列表更改为 Java 在此处提供的列表

http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html

一切正常。

于 2013-11-19T10:08:34.830 回答