SSLソケット接続を作成するにはどうすればよいですか?
本当にキーストアを作成する必要がありますか?このキーストアは、すべてのクライアントアプリケーションと共有する必要がありますか?
次のコードでサーバーを作成しました:
SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory
.getDefault();
SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory
.createServerSocket(ServerProperties.getInstance()
.getVSSPAuthenticationPort());
Androidに次のコードでクライアントを作成しました:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory
.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
Host, authPort);
sslsocket.startHandshake();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
sslsocket.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(
sslsocket.getInputStream()));
しかし、接続しようとすると、次のエラーがスローされます。
javax.net.ssl.SSLHandshakeException: no cipher suites in common
at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1886)
at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:276)
at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:266)
at Sun.security.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.Java:894)
at Sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.Java:622)
at Sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.Java:167)
at Sun.security.ssl.Handshaker.processLoop(Handshaker.Java:868)
at Sun.security.ssl.Handshaker.process_record(Handshaker.Java:804)
at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:1016)
at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1312)
at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1339)
at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1323)
Ssl接続を確立するには証明書が必要です。証明書をキーストア内にロードするか、証明書自体をロードできます。キーストアオプションの例をいくつか示します。
コードを実行するにはいくつかのパラメーターが必要です。
Java -Djavax.net.ssl.keyStore=keyStoreFile -Djavax.net.ssl.keyStorePassword=keystorePassword Server
Java codeでキーストアをロードすることもできます。これに対する最も簡単な解決策は、システムプロパティを設定することです:
System.setProperty("javax.net.ssl.keyStore", 'keystoreFile');
System.setProperty("javax.net.ssl.keyStorePassword", 'keystorePassword ');
また、より複雑な方法でキーストアをロードできますが、より複雑なことを行うことができます:
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("keystoreFile"), "keystorePassword".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(ks, "keystorePassword".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(ks);
SSLContext sc = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = tmf.getTrustManagers();
sc.init(kmf.getKeyManagers(), trustManagers, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(serverport);
SSLSocket c = (SSLSocket) s.accept();
クライアントでは、コードの最後の行にいくつかの変更があり、最後の3行は次のように置き換えられます。
SSLSocketFactory ssf = sc.getSocketFactory();
SSLSocket s = (SSLSocket) ssf.createSocket(serverip, serverport);
s.startHandshake();
Androidのキーストアをロードする場合、タイプは「JKS」ではなく「BKS」である必要があります。キーストアを作成するためのリソースを簡単に見つけることができます。