1

1つのサーバーと1つのクライアントを持つクライアント/サーバープロセスがあります。

接続設定は次のようになります。

System.setProperty("javax.net.ssl.trustStore", "path/to/store"); 
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
sslsocket = (SSLSocket) sslsocketfactory.createSocket(InetAddress.getLocalHost(), port); 

1:1、これは正常に機能します。現在、サーバーが複数のクライアントの複数のポートでリッスンするように拡張しています。サーバーに接続する各クライアントは、特定のトラストストアを備えた特定のポートで接続する必要があります。

サーバー側で2つのトラストストアを登録すると、クライアント接続を確立しようとすると、次のエラーが発生します。

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

例としてスタックオーバーフローを調べてきましたが、すべてが非常に複雑に見えます。これを管理する簡単な方法はありますか?または、1つのプロセスで複数のキーストアを使用すべきではないという説得力のある理由はありますか?

4

1 に答える 1

1

あなたの方法を使用すると、これは可能だとは思いません。システム プロパティ (ハッシュ テーブル) を設定しているため、最後に記述したプロパティによって以前のプロパティが上書きされます。

しかしまた、私はユースケースを理解していません。一般に、トラストストアはクライアント側の概念です。信頼するサーバーを決定することです。ほとんどの場合 (証明書ベースの認証を使用していない限り)、クライアントの信頼性は関係ありません。

そうは言っても、ポートごとに異なるキーストアを設定することは可能です。たとえば、Tomcatでは

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
       maxThreads="150" scheme="https" secure="true"
       keystoreFile="${user.home}/.keystore1"
       keystorePass="changeit"
       clientAuth="false" sslProtocol="TLS" />

上記のスニペットは、ポート 443 で ~/.keystore1 を使用する必要があることを示しています。別のポートでは、keystore2 を使用できます。

クライアント認証を使用する必要がある場合は、上記の例で clientAuth を true に設定し、truststoreFile と truststorePass を追加することで、クライアントに強制的に証明書を送信させることができます。

Tomcat のソース コードを掘り下げると、環境のセットアップに役立つ場合があります。特に、ファイル java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java には、おそらくまさに必要なものが含まれているでしょう。

于 2013-01-10T19:58:50.700 に答える