Javaクライアント(Eclipse Paho)からmosquittoブローカーへのSSL接続: "unknown_ca"

Sharon Ben Asher:

私たちはAndroid用のプッシュ通知プラットフォーム(GoogleのC2DMのフェイルオーバー)を調査しています。EclipsePaho Javaクライアントを使用して、Mosquittoブローカー(1.0.3)に接続しています。ブローカーはUbuntu 12.04(AWS EC2インスタンス)にインストールされています。暗号化されていないTCP接続を使用してクライアントをサーバーに正常に接続しました。ちなみに、カーネルパラメータを微調整した後、中規模のEC2マシン上の1つのブローカーインスタンスに対して100Kの同時クライアントを開くことができました。いい仕事、蚊!

現在、SSLを使用して安全な接続を設定しようとしています。クライアント証明書を使用してクライアントを認証したい。私はmosquito_tlsページの説明に従い、サーバーとクライアントのキーと自己署名証明書を生成しました。SSLを使用するようにサーバーを構成しました。

クライアント部分については、mosquitto_tls_setの署名を調べ、CA証明書、クライアントキー、および証明書ファイルが必要であることに注意しました。私は、クライアントがサーバーを認証するためにCA証明書が使用され、サーバーがクライアントを認証するためにクライアントキーと証明書が使用されることを理解しました。私は正しいですか?

だから私はここで私がJava側でやったことです:

  1. 弾む城を使用して、上記の3つのファイルをロードします。
  2. CA証明書をキーストアに配置し、それを使用してTrustManagerFactoryを作成します。
  3. クライアントの鍵と証明書を別の鍵ストアに入れ、それを使用してKeyManagerFactoryを作成します。
  4. SSLContextを作成し、2つのファクトリーで初期化しました。
  5. SSLContextからSSLSocketFactoryを作成し、PahoのMqttConnectOptionsに渡しました

接続すると、mosquittoから次のエラーが表示されます

OpenSSL Error: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
Socket read error on client (null), disconnecting.

編集:クライアント側で次の例外が表示されます

javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown_ca

これが完全なコードです

static SSLSocketFactory getSocketFactory (final String caCrtFile, final String crtFile, final String keyFile, final String password) throws Exception
{ 
    Security.addProvider(new BouncyCastleProvider());

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

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

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

    KeyStore caKs = KeyStore.getInstance("JKS");
    caKs.load(null, null);
    caKs.setCertificateEntry("ca-certificate", caCert);
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
    tmf.init(caKs);

    KeyStore ks = KeyStore.getInstance("JKS");
    ks.load(null, null);
    ks.setCertificateEntry("certificate", cert);
    ks.setKeyEntry("private-key", key.getPrivate(), password.toCharArray(), new java.security.cert.Certificate[]{cert});
    //ks.setKeyEntry("public-key", key.getPublic(), password.toCharArray(), new java.security.cert.Certificate[]{cert});
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(ks, password.toCharArray());

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

    return context.getSocketFactory();
}

mosquito.confは次のようになります

# general options
pid_file /home/ubuntu/mosquitto.pid

# persistence
queue_qos0_messages false
persistence false

# logging
log_dest stdout
connection_messages true
log_timestamp false

# default listener
# disable default listener (open only SSL listener)
#port 1883
#max_connections -1

# SSL listener
listener 1883
cafile /home/ubuntu/etc/ca.crt
certfile /home/ubuntu/etc/server.crt
keyfile /home/ubuntu/etc/server.key
require_certificate true
use_identity_as_username true
max_connections -1
Sharon Ben Asher:

了解しました。蚊の開発者(thx、Roger Light)からのサポートを受けて、問題を突き止めました。証明書の生成時に提供する詳細(会社、組織単位、共通名)は、CA、クライアント、およびサーバーの証明書で異なっている必要があります。それ以外の場合、コードはいくつかの小さな変更で動作します。わかりやすくするために、いくつかのコメントを付けて正しいコードをここに再投稿します。

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

import org.bouncycastle.jce.provider.*;
import org.bouncycastle.openssl.*;

static SSLSocketFactory 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() {
                public char[] getPassword() {
                    return password.toCharArray();
                }
            }
    );
    KeyPair key = (KeyPair)reader.readObject();
    reader.close();

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

    // client key and certificates are sent to server so it can authenticate us
    KeyStore ks = KeyStore.getInstance("JKS");
    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("PKIX");
    kmf.init(ks, password.toCharArray());

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

    return context.getSocketFactory();
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

glassfish SSLHandshakeException:致命的なアラートを受信:unknown_ca

分類Dev

javax.net.ssl.SSLHandshakeException:致命的なアラートを受信しました:unknown_ca

分類Dev

AWS RDS MySQLへ春ブーツ接続 - SSLHandshakeException:受信致命的な警告:unknown_ca

分類Dev

Paho MQTT(C ++)クライアントがMosquittoへの接続に失敗する

分類Dev

paho-mqttクライアントは同時に複数のブローカーに接続できますか?

分類Dev

ArtemisブローカーInterceptmqttクライアント接続

分類Dev

JavaゲームサーバーからクライアントへのTCPおよびUDP接続

分類Dev

DockerコンテナからプライベートIPへの発信接続をブロックする

分類Dev

APIへのローカルホストSSL接続ERR_SSL_PROTOCOL_ERROR

分類Dev

Eclipse Paho MQTTクライアント:既存の接続を確認する方法は?

分類Dev

sshローカルポートからローカルポートへの転送。接続拒否

分類Dev

AndroidからカスタムソケットサーバーへのSSL / TLS接続

分類Dev

Mqttオンラインブローカーへの接続中にNullPointerException

分類Dev

Mosquitto MQTT接続ソケットエラー(PLCから接続)

分類Dev

mysql onのインスタンスへの接続は、Javaクライアントアプリケーションからのものでした

分類Dev

SSL接続を介したSquirrelクライアントのDB2サーバーへの接続

分類Dev

ブラウザからサーバーへのZeroMQの接続

分類Dev

VerneMQクラスターへのクライアント接続

分類Dev

SSLハンドシェイクがAndroidクライアントからGoogleへの接続に失敗する

分類Dev

Sparkスタンドアロン接続ドライバーからワーカーへ

分類Dev

MQTTクライアントへのMQTTブローカー通信

分類Dev

パブリックIPアドレスからプライベートIPアドレスへの着信接続

分類Dev

ローカルコンピューターからサーバーへの接続-ssh

分類Dev

ローカルクライアントツールからopenshiftmongodbデータベースに接続したい

分類Dev

インターネットからサーバーへの要求されていない接続をブロックする無料のインターネットを備えたローカルネットワークのiptablesルール?

分類Dev

Java:Eclipseからのデータグラムクライアントとサーバーの作成

分類Dev

クライアント/サーバーJavaの接続

分類Dev

ローカルホストIIS8へのSSL接続は非常に遅いですが、ローカル以外の開始接続からは正常に機能します

分類Dev

5.3クライアントから7.4サーバーへのssh接続の問題

Related 関連記事

  1. 1

    glassfish SSLHandshakeException:致命的なアラートを受信:unknown_ca

  2. 2

    javax.net.ssl.SSLHandshakeException:致命的なアラートを受信しました:unknown_ca

  3. 3

    AWS RDS MySQLへ春ブーツ接続 - SSLHandshakeException:受信致命的な警告:unknown_ca

  4. 4

    Paho MQTT(C ++)クライアントがMosquittoへの接続に失敗する

  5. 5

    paho-mqttクライアントは同時に複数のブローカーに接続できますか?

  6. 6

    ArtemisブローカーInterceptmqttクライアント接続

  7. 7

    JavaゲームサーバーからクライアントへのTCPおよびUDP接続

  8. 8

    DockerコンテナからプライベートIPへの発信接続をブロックする

  9. 9

    APIへのローカルホストSSL接続ERR_SSL_PROTOCOL_ERROR

  10. 10

    Eclipse Paho MQTTクライアント:既存の接続を確認する方法は?

  11. 11

    sshローカルポートからローカルポートへの転送。接続拒否

  12. 12

    AndroidからカスタムソケットサーバーへのSSL / TLS接続

  13. 13

    Mqttオンラインブローカーへの接続中にNullPointerException

  14. 14

    Mosquitto MQTT接続ソケットエラー(PLCから接続)

  15. 15

    mysql onのインスタンスへの接続は、Javaクライアントアプリケーションからのものでした

  16. 16

    SSL接続を介したSquirrelクライアントのDB2サーバーへの接続

  17. 17

    ブラウザからサーバーへのZeroMQの接続

  18. 18

    VerneMQクラスターへのクライアント接続

  19. 19

    SSLハンドシェイクがAndroidクライアントからGoogleへの接続に失敗する

  20. 20

    Sparkスタンドアロン接続ドライバーからワーカーへ

  21. 21

    MQTTクライアントへのMQTTブローカー通信

  22. 22

    パブリックIPアドレスからプライベートIPアドレスへの着信接続

  23. 23

    ローカルコンピューターからサーバーへの接続-ssh

  24. 24

    ローカルクライアントツールからopenshiftmongodbデータベースに接続したい

  25. 25

    インターネットからサーバーへの要求されていない接続をブロックする無料のインターネットを備えたローカルネットワークのiptablesルール?

  26. 26

    Java:Eclipseからのデータグラムクライアントとサーバーの作成

  27. 27

    クライアント/サーバーJavaの接続

  28. 28

    ローカルホストIIS8へのSSL接続は非常に遅いですが、ローカル以外の開始接続からは正常に機能します

  29. 29

    5.3クライアントから7.4サーバーへのssh接続の問題

ホットタグ

アーカイブ