0

私は Android アプリケーションを開発しており、独自の SSL 証明書を使用して SSL で保護された TCP サーバーを提供する必要があります。次のファイルがあります。

  • サーバー.crt
  • server.key (プライベート)
  • my-ca.crt

1) 証明書の作成:
この SO で説明されているように、コマンドライン ツール「keytool」を使用して、mycert.pem から BKS キーストアを作成しました。アプリケーションの /res/raw フォルダーに配置します。秘密鍵をどうすればよいかわかりませんが、証明書の作成には必要ありませんか?

2) サーバーコード:

String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
KeyStore.load(context.getResouces().openRawResource(R.raw.mykeystore), "mypass".toCharArray();

String keyalg = KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory kmf = KeyManagerFactory.getInstance(keyalg);
kmf.init(keyStore, "mypass".toCharArray());


SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, null);
SSLServerSocket serverSocket = (SSLServerSocket)sslContext.getServerSocketFactory().createServerSocket(3333);

SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();

//not shown: create BufferedReader from sslSocket.getInputStream(), while-loop for incoming messages

3) クライアント コード:
次のコードを含むダミーの Java クライアントを作成しました。

SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("192.168.2.101", 3333);
sslsocket.startHandshake();

そして、次のように呼び出して実行します。

java -Djavax.net.ssl.trustStore=keystore -Djavax.net.ssl.trustStorePassword=password クライアントは、サーバー用に作成したのと同じキーストアを渡します。

クライアントを呼び出すとstartHandshake()、「PKIX パスの構築に失敗しました: sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりません」という SSLHandshakeException がスローされます。

クライアントとサーバーの両方で、server.crt ファイルのみを含む同じキーストアを使用します。それが問題の根源ではないでしょうか?これを機能させるには、秘密鍵 (server.key) や ca-cert を使用する必要がありますか? 他の提案はありますか?

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1