java - 使用 Java 连接到带有 key 、证书和 cacert 文件而不是 .p12 文件的 RabbitMQ (TLS)

标签 java node.js ssl rabbitmq tls1.2

我有一个关于如何使用 java 和 TLS 连接到远程 RabbitMQ 机器的问题。
在 java 中,如果我使用 .p12 key 和以下代码,我可以连接到 UAT 机器:

{
        char[] keyPassphrase = "password".toCharArray();
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(this.getClass().getClassLoader().getResourceAsStream("rmq.uat.p12"), keyPassphrase);

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

        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509ExtendedTrustManager() {
                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; }
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] xcs, String string, Socket socket) throws CertificateException {}
                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] xcs, String string, Socket socket) throws CertificateException {}
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] xcs, String string, SSLEngine ssle) throws CertificateException {}
                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] xcs, String string, SSLEngine ssle) throws CertificateException {}
                }
        };

        SSLContext c = SSLContext.getInstance("TLSv1.2");
        c.init(kmf.getKeyManagers(), trustAllCerts, null);

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(rmqHost);
        factory.setPort(rmqPort);
        factory.setUsername(rmqUsername);
        factory.setPassword(rmqPassword);
        factory.setVirtualHost(vhost);
        factory.useSslProtocol(c);
        // factory.enableHostnameVerification();

        conn = factory.newConnection();
        channel = conn.createChannel();
}
在我的 DEV RabbitMQ 机器上,我有一系列证书:rmq_ca.dev.crt(cacert)、rmq_cert.crt(证书)和 rmq_key.dev.key( key )。而且我找不到允许我使用这 3 个文件而不是 .p12 文件进行连接的 java 代码...
使用 nodejs 我可以使用以下代码进行连接:
let opts = {
    key: fs.readFileSync(path.join(appRoot, 'rmq_key.dev.key')),
    cert: fs.readFileSync(path.join(appRoot, 'rmq_cert.dev.crt')),
    ca: [fs.readFileSync(path.join(appRoot, 'rmq_ca.dev.crt'))],
    rejectUnauthorized: false
  };

...
const rmq_string = `${protocol}://${user}:${pass}@${hosts}:${port}/${vhost}`;
...

amqp.connect(rmq_string, opts, (error0, connection) => {
   ...
}
关于如何使其在 java 端工作的任何想法?谢谢 !

最佳答案

我确实找到了一种解决方法 - 从 3 个文件(rmq_key.dev.key、rmq_cert.dev.crt 和 rmq_ca.dev.crt)我可以使用以下命令生成一个 .p12 key 文件

openssl pkcs12 -export -out cert.p12 -inkey rmq_key.dev.key -in rmq_cert.dev.crt -certfile rmq_ca.dev.crt

Enter Export Password: password
Verifying - Enter Export Password: password
并在我的 java 程序中使用这个新生成的 key (cert.p12)。
我看到了一些答案,例如 Java p12 Generation from a existing keys它显示了如何直接从 java 程序而不是使用 OpenSsl 以编程方式生成 .p12 key ,但没有尝试它,因为我有一个可行的解决方案。

关于java - 使用 Java 连接到带有 key 、证书和 cacert 文件而不是 .p12 文件的 RabbitMQ (TLS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68557452/

相关文章:

Java:数据文件的相对路径

node.js - 是否建议使用 node.js 建立一个论坛?

javascript - Node.js Forver 不断停止同一机器上运行的其他服务

node.js - 使用 Electron 构建 Node ibm_db 包时遇到问题

java.net.SocketException : Software caused connection abort: recv failed when using different jre security 异常

java - 使用 Dagger 无法获得单例

java - 如何有效地为List的所有元素添加前缀?

apache - 如何通过 https 使用 Vagrant & Puppet

c++ - 使用带有poco的SecureStreamSocket连接TCP服务器时如何发送证书

java - Java中使用Socket时强制转换为接口(interface)