SSLを使用してクライアントとサーバーを接続する次のコードがあり、クライアント側の認証を追加します。
(サーバーのキーストア(JCEKSタイプ)とクライアントのキーストア(JKSタイプ)があります。サーバーはトラストストア(cacerts)を使用します。このトラストストアをクライアント認証にも使用したいため、両方の証明書をインポートしました)
クライアントコード:
System.setProperty("javax.net.ssl.trustStore", cerServer);
System.setProperty("javax.net.ssl.trustStoreType","JCEKS");
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", port);
サーバーコード:
KeyStore ks = LoadKeyStore(new File(serverKeyStore), pwdKeyStore, "JCEKS");
KeyManagerFactory kmf;
kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, pwdKeyStore.toCharArray());
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(kmf.getKeyManagers(),null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
sslserversocket = (SSLServerSocket) ssf.createServerSocket(port);
助けてくれてありがとう。
編集:私はこのコードをサーバー側に追加します:
System.setProperty("javax.net.ssl.trustStore", cacerts);
System.setProperty("javax.net.ssl.trustStoreType","JKS");
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);
しかし、cacertsでクライアント証明書を削除しても、接続によってエラーが発生することはなく、そのため、その方法は間違っていると思います
システムでクライアント証明書認証を使用する場合は、次のものが必要です。
クライアント証明書を要求(または要求)するサーバー。これはsetWantClientAuth(true)
、サーバーソケット(またはsetNeedClientAuth
)の設定によって行われます。サーバーが受け入れるCAをアドバタイズする必要もあります。これは通常、クライアント証明書チェーンが発行されたCAを含むサーバー上のトラストストアを使用して行われます(これは、設定によって行ったようです)javax.net.ssl.trustStore*
サーバー上)。
クライアント証明書(中間CAがある場合はチェーン)とその秘密鍵を含むキーストアで構成されるクライアント。これは、javax.net.ssl.keyStore*
(他の接続に影響を与える可能性がある)を設定するかKeyManagerFactory
、サーバー側で行ったのと同じ方法でを使用して行うことができます。
を使用してsetWantClientAuth(true)
も、サーバーはクライアント証明書のない接続を受け入れるため、エラーが発生しない場合があります(サーバーはSSLSession
のピア証明書をチェックして、証明書があったかどうかを確認します)。setNeedClientAuth(true)
クライアントが証明書を提示しないと、接続が切断されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加