JSS SSLSocketの問題クライアント証明書の選択
-
27-10-2019 - |
質問
これは、Mozilla Crypto Dev MLのクロスポストです。誰かがそうであることを願っています org.mozilla.jss
. リンク:JSS -MDN
2つのクライアントソケットと2つの異なるクライアント証明書(クライアントCERT AとB)を使用して、リモートホストに2つの個別のHTTPSリクエストを作成しようとしています。私のテストプログラムは、の修正バージョンです ssltest.java
私のホストから、2つの異なるソケットでリモートホストに2つの接続を行うことができます。両方の個々の接続に対して、リモートWebサーバーから200 OKバックを受信することができます。
私の問題は、クライアント証明書「A」が接続「A」と「B」の両方に使用されていることです。
私は使用しています これ コンストラクタ:
public SSLSocket(java.lang.String host,int port,
java.net.InetAddress localAddr,
int localPort,
SSLCertificateApprovalCallback certApprovalCallback,
SSLClientCertificateSelectionCallback clientCertSelectionCallback)
インターフェイスも実装しました SSLClientCertificateSelectionCallback
(ソース)上記のコンストラクターを使用して、正しいクライアント証明書を渡すため。また、実装されたラインを配置しました SSLClientCertificateSelectionCallback
select()
コールバックが実行されたときにログを記録する機能。
アプリを実行してログをチェックすると、Select()メソッドは、最初のSSLSocket(クライアント証明書 'A'を選択)の作成中に1回しか呼び出されず、クライアントのCERT Bニックネームが指定されている場合は、将来のSSLSocketインスタンス化にはなりません。実際、私は自分のアプリを再起動する必要があります select()
再び実行される。
ネイティブコールバックコードを実行する方法はありますか select()
リモートサーバーによって証明書が要求されるのはいつですか?
ありがとう、
Pr
解決
セッションのキャッシュが行われているようです。 SSLSocketを使用すると言いました。セッションキャッシュを偽に設定してみましたか?デフォルトでは、SSLSocketはセッションキャッシングを有効にします。
たとえば、SSLSocketクラスには、方法があります public void useCache(boolean b)
設定した場合、パラメーターに合格します false
ソケットを作成した後、サーバーが最初のセッションのキャッシュを防ぐことを願っています(1つのプログラムから両方のクライアント接続を呼び出していると思います)。そうすれば、2番目の接続からの別の証明書リクエストが必要になります。