サーバー上のデータベースのフロントエンドとしてJavaプログラムを作成しました。クライアントとサーバー間のトラフィックを暗号化するためにSSLを使用しようとしています。次のコマンドを発行しますサーバー証明書を作成するには:
keytool -genkey -alias localhost -keyalg RSA -keypass kpass123 -storepass kpass123 -keystore keystore.jks
関連するコードは次のとおりです。
System.setProperty("javax.net.ssl.keyStore",
"G:/Data/Android_Project/keystore.jks");
System.setProperty("javax.net.ssl.keyPassword", "kpass123");
SSLServerSocketFactory factory =
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
SSLServerSocket accessSocket =
(SSLServerSocket)factory.createServerSocket(DB_ACCESS_PORT);
これを実行しようとすると、これをキャッチします。
Java.security.NoSuchAlgorithmException:実装の構築エラー(アルゴリズム:デフォルト、プロバイダー:SunJSSE、クラス:com.Sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
また、「KeyPairGenerator」サービスにはDIFFIEHELLMAN、DSA、RSAのアルゴリズムがあり、「SSLContext」にはSSL、TLS、SSLV3、DEFAULT、TLSV1のアルゴリズムがあることがわかりました。
RSAをSSLContextサービスにインストールする方法を見つける必要がありますか?正しいサービスを見ているのですか? RSAを使用するべきではありませんか?
SSL-セキュリティ-証明書のことは初めてです。同じ証明書にアクセスすることになっているときに、これらの異なるサービスのそれぞれが同じアルゴリズムを持っていないことは、私を吹き飛ばします。
javax.net.ssl.keyStorePassword
の代わりにjavax.net.ssl.keyPassword
を試してください。後者は JSSE ref guide で言及されていません。
言及したアルゴリズムは、デフォルトでデフォルトのセキュリティプロバイダーを使用して存在する必要があります。 NoSuchAlgorithmException
sは、他の根本的な例外(ファイルが見つからない、パスワードが間違っている、キーストアのタイプが間違っているなど)によって引き起こされることがよくあります。完全なスタックトレースを確認すると便利です。
スタックトレースの情報が十分でない場合は、-Djavax.net.debug=ssl
、または少なくとも-Djavax.net.debug=ssl,keymanager
を使用して、より多くのデバッグ情報を取得することもできます。