java - 使用 SpringAMQP 时 RabbitMQ SSL 握手失败

标签 java ssl rabbitmq handshake spring-amqp

我使用以下配置安装了rabbitMQ

[
  {rabbit, [
     {ssl_listeners, [5671]},
     {ssl_options, [{cacertfile,"C:\\dev\\rabbitcert\\testca\\cacert.pem"},
                    {certfile,"C:\\dev\\rabbitcert\\server\\cert.pem"},
                    {keyfile,"C:\\dev\\rabbitcert\\server\\key.pem"},
                    {verify,verify_peer},
                    {fail_if_no_peer_cert,false}]}
   ]}
].

我正在实例化连接工厂(数据替换为虚拟):

private static ConnectionFactory getConnectionFactoryForQueue(){
        com.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();
        connectionFactory.setUsername("user");
        connectionFactory.setHost("MyIpAddress.0.1.1");
        connectionFactory.setPassword("pass");
        connectionFactory.setPort(5671);
        connectionFactory.setVirtualHost("/");
        SsmProtos.SSLDetails ssl = listener.getSslDetails();
        char[] keyPassphrase = "keyPassPhrase".toCharArray();
        try {
            KeyStore ks = KeyStore.getInstance("PKCS12");
            ks.load(new FileInputStream("path/to/keycert.p12"), keyPassphrase);

            KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
            kmf.init(ks, keyPassphrase);

            char[] trustPassphrase = "trustPassPhrase".toCharArray();
            KeyStore tks = KeyStore.getInstance("JKS");
            tks.load(new FileInputStream("path/to/trust/store"), trustPassphrase);

            TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
            tmf.init(tks);

            SSLContext c = SSLContext.getInstance("SSLv3");
            c.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
            connectionFactory.useSslProtocol(c);

        } catch (NoSuchAlgorithmException | CertificateException | IOException | 
                UnrecoverableKeyException | KeyStoreException | KeyManagementException e) {
            throw new IllegalArgumentException("Failed Setting up SSL",e);
        }
    return new CachingConnectionFactory(connectionFactory);
}

当我尝试连接时,我从 Java 端收到以下错误

Errors encountered:Error creating bean with name 'getSsmRequestAmqpAdmin' defined in class com.ixaris.ssm.server.service.ServerConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.amqp.core.AmqpAdmin com.ixaris.ssm.shared.busobject.ServerInfoConfiguration.getSsmRequestAmqpAdmin()] threw exception; nested exception is org.springframework.amqp.AmqpIOException: java.net.SocketException: Software caused connection abort: recv failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getSsmRequestAmqpAdmin' defined in class com.ixaris.ssm.server.service.ServerConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.amqp.core.AmqpAdmin com.ixaris.ssm.shared.busobject.ServerInfoConfiguration.getSsmRequestAmqpAdmin()] threw exception; nested exception is org.springframework.amqp.AmqpIOException: java.net.SocketException: Software caused connection abort: recv failed
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:597)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1094)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.amqp.core.AmqpAdmin com.ixaris.ssm.shared.busobject.ServerInfoConfiguration.getSsmRequestAmqpAdmin()] threw exception; nested exception is org.springframework.amqp.AmqpIOException: java.net.SocketException: Software caused connection abort: recv failed
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:188)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:586)
Caused by: org.springframework.amqp.AmqpIOException: java.net.SocketException: Software caused connection abort: recv failed
    at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:63)
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:195)

Caused by: java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)

rabbitMQ 日志中出现以下内容(192.168.24.75 是我的 IP)

=INFO REPORT==== 14-Aug-2014::11:25:07 ===
accepting AMQP connection <0.272.0> (192.168.24.75:49860 -> 192.168.24.75:5671)

=ERROR REPORT==== 14-Aug-2014::11:25:08 ===
SSL: certify: ssl_handshake.erl:1391:Fatal error: handshake failure

=ERROR REPORT==== 14-Aug-2014::11:25:13 ===
error on AMQP connection <0.272.0>:
{ssl_upgrade_error,{tls_alert,"handshake failure"}}

应用程序和队列目前都在我的计算机上。我已在防火墙上打开 TCP 端口 5671 和 5672。

我错过了什么吗?

最佳答案

问题不在于该代码,而在于我的 Keycert 的路径 我使用的是服务器证书而不是客户端证书。

关于java - 使用 SpringAMQP 时 RabbitMQ SSL 握手失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25304789/

相关文章:

linux - 将扩展名放入 OpenSSL 的证书中

ssl - 不安全的字体阻止了我的 https 网站

java - rabbitmq,Java 客户端通过 SSL 工作,但 .NET 客户端不能

java - 在使用 PreparedStatement 的同时使用 RabbitMQ 设计 Java OSGi 应用程序

java - 二叉树通用比较

java - 使用 JLists 和 ListModels

java - 在线程实例上使用 sleep(long) 的副作用

Java 多线程一次运行多个方法的最简单方法?

ruby-on-rails - 安装 ruby​​ gem 时出现 SSLV3 错误

javascript - RabbitMQ 在网站上向用户发送消息