ssl - Apache camel - 带 SSL 的 MQTT

标签 ssl apache-camel mqtt

在哪里可以找到 MQTT with SSL 的确切配置设置。官方文档只有一行“支持 SSL”,但我找不到任何关于如何配置它的信息。

我看过一些论坛,但我无法从中找出任何东西。

对此有一些帮助。

P.S:在你问我我试过什么之前。我刚刚用 mqtt 作为 Camel 的组件制作了一条路线。我有几个证书,我不知道如何在这里使用它们。

最佳答案

对于正在寻找甚至不存在的说明的每个人。这是我们使用 SSL 配置 MQTT 组件。

带客户端、CA 证书和 key 的 MQTT + SSL

路线

        MQTTEndpoint mqttEndpoint = null;
        MQTTComponent mqttComponent = new MQTTComponent();
        mqttComponent.setCamelContext( this.getContext()); //Set camel context

        mqttEndpoint = (MQTTEndpoint) mqttComponent.createEndpoint("mqtt://mqtt-queue"); //mqtt://<any-name>
        mqttEndpoint.getConfiguration().setHost( "ssl://<your-ssl-broker>" );

        SSLContext sc = SSLManager
                .getSocketFactory("<ca-certificate>.crt", "<trust-certificate>.crt", "<key>.key", <password>);
        mqttEndpoint.getConfiguration().setSubscribeTopicNames("<topic>");
        mqttEndpoint.getConfiguration().setSslContext( sc );

SSL上下文

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMReader;
import org.bouncycastle.openssl.PasswordFinder;

import java.io.*;
import java.nio.file.*;
import java.security.*;
import java.security.cert.*;
import javax.net.ssl.*;


public class SSLManager
{
    public static SSLContext getSocketFactory (final String caCrtFile, final String crtFile, final String keyFile,
                                              final String password) throws Exception
    {

        Security.addProvider(new BouncyCastleProvider());

        // load CA certificate
        PEMReader reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(caCrtFile)))));
        X509Certificate caCert = (X509Certificate)reader.readObject();
        reader.close();

        // load client certificate
        reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(crtFile)))));
        X509Certificate cert = (X509Certificate)reader.readObject();
        reader.close();

        // load client private key
        reader = new PEMReader(
                new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(keyFile)))),
                new PasswordFinder() {
                    @Override
                    public char[] getPassword() {
                        return password.toCharArray();
                    }
                }
        );
        KeyPair key = (KeyPair)reader.readObject();
        reader.close();

        // CA certificate is used to authenticate server
        KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());
        caKs.load(null, null);
        caKs.setCertificateEntry("ca-certificate", caCert);
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(caKs);

        // client key and certificates are sent to server so it can authenticate us
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(null, null);
        ks.setCertificateEntry("certificate", cert);
        ks.setKeyEntry("private-key", key.getPrivate(), password.toCharArray(), new java.security.cert.Certificate[]{cert});
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, password.toCharArray());

        // create SSL socket factory
        SSLContext context = SSLContext.getInstance("TLSv1.2");
        //Create socket factory if required
        //context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        //return context.getSocketFactory();
        return context;        
    }
}

Maven 依赖

<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk16</artifactId>
            <version>1.40</version>
        </dependency>

关于ssl - Apache camel - 带 SSL 的 MQTT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48357257/

相关文章:

apache 将非本地连接的 http 重写为 https

java - log4j JMSAppender 和 ActiveMQ 作为 Camel 端点

java - 在不同的类中创建 Camel 路线

mqtt - MQTT 代理可以配置为以不同的速率向订阅者发送数据吗?

ios - 如何将包含 pod 的框架添加到另一个项目中

java - onReceivedClientCertRequest 未被调用

cakephp - 使用 CakePHP 1.3,您如何处理实时 HTTPS URL 和开发人员的普通 HTTP URL?

ssl - 识别安全 html 请求中的不安全内容

java - Camel批处理文件消费者并删除完成的文件

ubuntu - 编译 [make] Mosquitto 1.4.8 时出错