Nettyを使用して一方向認証ソケットサーバーを構築しようとしています。
私はkeytoolを使ってキーストア、自己署名証明書、トラストストアをサーバーとクライアントの両方に生成し、サーバー/クライアントにいくつかのコードを書きました.SSL認証が機能しています。
ここに私の質問です:
クライアントにトラストストアを追加する必要はありません。私は自分のサーバーにキーストアを追加するだけです。それでもうまくいくでしょうか?私は片方向認証はサーバーだけが証明書を保持していることを意味すると思いましたか?
サーバー:
Nettyを使用する一方向SSL認証
private void addSslHandlerOneWay(SocketChannel ch) throws Exception {
SSLContext sslContext = SSLContext.getInstance("TLS");
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(new File("svrks.jks")), "kspassword1".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "kspassword2".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLEngine sslEngine = sslContext.createSSLEngine();
sslEngine.setUseClientMode(false);
sslEngine.setNeedClientAuth(false);//one-way
sslEngine.setEnabledProtocols(sslEngine.getSupportedProtocols());
sslEngine.setEnabledCipherSuites(sslEngine.getSupportedCipherSuites());
sslEngine.setEnableSessionCreation(true);
ch.pipeline().addFirst("SSL", new SslHandler(sslEngine));
}
クライアント:
private void addSslHandlerOneWay(SocketChannel ch) throws Exception {
SSLContext sslContext = SSLContext.getInstance("TLS");
KeyStore ts = KeyStore.getInstance("JKS");
ts.load(getInputStream("clits.jks"), "tspassword2".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ts, "tspassword1".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ts);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SSLEngine sslEngine = sslContext.createSSLEngine();
sslEngine.setUseClientMode(true);//client
sslEngine.setEnabledProtocols(sslEngine.getSupportedProtocols());
sslEngine.setEnabledCipherSuites(sslEngine.getSupportedCipherSuites());
sslEngine.setEnableSessionCreation(true);
ch.pipeline().addFirst("SSL", new SslHandler(sslEngine));
}
おかげで、みんなを
次は私がこれまでSslHandlerを追加するために自分のサーバー/クライアントで書いたものです。
Steffenの回答に加えて、ほとんどのSSL/TLSクライアント(すべてのWebブラウザを含む)には、Verisign GoDaddyなど、デフォルトで信頼する事前検証済みCAセットがあります。 CAでは、クライアント上でアクションや変更は必要ありません。ほとんどの「本当の」CAはお金を払っていますが、買い物することによって年間数百ドルの基本的な証明書を見つけることができます。 LetsEncryptは何も請求しておらず、広く信頼されていますが、8u101までJavaではデフォルトでは信頼できません。 –