web-dev-qa-db-ja.com

JavaおよびSSL-Java.security.NoSuchAlgorithmException

サーバー上のデータベースのフロントエンドとして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-セキュリティ-証明書のことは初めてです。同じ証明書にアクセスすることになっているときに、これらの異なるサービスのそれぞれが同じアルゴリズムを持っていないことは、私を吹き飛ばします。

33
Zarjio

javax.net.ssl.keyStorePasswordの代わりにjavax.net.ssl.keyPasswordを試してください。後者は JSSE ref guide で言及されていません。

言及したアルゴリズムは、デフォルトでデフォルトのセキュリティプロバイダーを使用して存在する必要があります。 NoSuchAlgorithmExceptionsは、他の根本的な例外(ファイルが見つからない、パスワードが間違っている、キーストアのタイプが間違っているなど)によって引き起こされることがよくあります。完全なスタックトレースを確認すると便利です。

スタックトレースの情報が十分でない場合は、-Djavax.net.debug=ssl、または少なくとも-Djavax.net.debug=ssl,keymanagerを使用して、より多くのデバッグ情報を取得することもできます。

61
Bruno