【问题标题】:Unable to connect to RabbitMQ server using TLSv1.2 from Java 7无法使用 Java 7 中的 TLSv1.2 连接到 RabbitMQ 服务器
【发布时间】:2016-12-11 06:26:18
【问题描述】:

我有一个仅支持 TLSv1.2 和密码 {ecdhe_ecdsa,aes_256_cbc,sha384} 的 RabbitMQ 服务器(RabbitMQ 版本 3.6.0 和 Erlang OTP 18.1)。我正在尝试使用 AMQP 从 Java 客户端连接到它。源代码如下:

final SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
SSLContext.setDefault(context);
final String[] enabledCipherSuites = { "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384" };
final SSLParameters defaultParams = context.getDefaultSSLParameters();
defaultParams.setCipherSuites(enabledCipherSuites);
final SSLParameters supportedParams = context.getSupportedSSLParameters();
supportedParams.setCipherSuites(enabledCipherSuites);

ConnectionFactory factory = new ConnectionFactory();
factory.useSslProtocol(context);
factory.setHost(RABBITMQ_ADMIN_HOST);
factory.setPort(RABBITMQ_CLIENT_PORT_SSL);
factory.setUsername(RABBITMQ_ADMIN_USER);
factory.setPassword(RABBITMQ_ADMIN_PWD);
return factory.newConnection();

这是来自 RabbitMQ 配置文件的 sn-p:

{ssl_options, [{cacertfile, "cacert.pem"},
    {certfile, "cert.pem"},
    {keyfile, "key.pem"},
    {verify, verify_peer},
    {versions, ['tlsv1.2']},
    {ciphers, [{ecdhe_ecdsa,aes_256_cbc,sha384}]},
    {fail_if_no_peer_cert, true}]}

问题是,当客户端尝试连接服务器时,服务器不允许连接并出现以下错误:

=ERROR REPORT==== 4-Aug-2016::23:15:24 ===
SSL: hello: tls_handshake.erl:167:Fatal error: insufficient security

在客户端,我们看到一个 Java 异常被抛出,如下所示:

Received fatal alert: insufficient_security
Thread-1 sun.security.ssl.Alerts.getSSLException(Alerts.java:192),
sun.security.ssl.Alerts.getSSLException(Alerts.java:154),
sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1991),
sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1098),
sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1344),
sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:721),
sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122),
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82),
java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140),
java.io.DataOutputStream.flush(DataOutputStream.java:123),
com.rabbitmq.client.impl.SocketFrameHandler.sendHeader(SocketFrameHandler.java:129),
com.rabbitmq.client.impl.SocketFrameHandler.sendHeader(SocketFrameHandler.java:134),
com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:277),
com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:678),
com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:722)

这里有趣的是,尽管在默认和支持的 ssl 参数中设置了修改后的密码套件,但当我们记录支持和默认的密码套件时,它也会显示其他所有不应该被允许的内容! 我使用以下附加 Java 命令行参数启动客户端:

-Dhttps.protocols=TLSv1.2 
-Dhttps.cipherSuites=TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 
-Ddeployment.security.TLSv1.2=true 
-Ddeployment.security.TLSv1.1=false 
-Ddeployment.security.SSLv3=false

另外,在启动客户端时,我记录了启用和默认密码套件。它显示了一整套密码套件,而不仅仅是我指定的那个。

谁能帮我弄清楚如何解决这个问题?任何可以帮助我调试的指针都会非常有帮助。

【问题讨论】:

  • 你是在 Centos 上运行它吗?
  • 是的,我使用的是 centos 版本 7.2.1511

标签: java rabbitmq java-7 tls1.2 sslcontext


【解决方案1】:

问题可能与 Centos 上的 ECDHE 有关,请参阅此帖子: https://www.internetstaff.com/enable-elliptical-curve-diffie-hellman-ecdhe-linux/

问题在于 Diffie-Hellman 算法非常慢。这个可以 使用椭圆曲线 Diffie-Hellman 在很大程度上抵消 (ECDHE)。 Red Hat / CentOS / Fedora / Amazon Linux 的问题 用户是 Red Hat 故意禁用 ECDHE 密码(在 其他人),因为他们不确定围绕他们的专利问题。

我建议阅读这个:http://erlang.org/pipermail/erlang-questions/2013-December/076322.html

还有这个(我的)线程:http://erlang.org/pipermail/erlang-questions/2016-July/089797.html

我解决了一个类似的问题,避免使用 ECDHE 密码客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多