1. ホーム
  2. java

[解決済み] JavaとSSL - java.security.NoSuchAlgorithmException

2022-03-14 13:27:37

質問

サーバー上のデータベースのフロントエンドとして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: Error constructing implementation (algorithm: Default, provider: SunJSSE、class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl) の構築に失敗しました。

また、quot;KeyPairGenerator"サービスにはDIFFIEHELLMAN、DSA、RSAのアルゴリズムがあり、quot;SSLContext"にはSSL、TLS、SSLV3、DEFAULT、TLSV1 のアルゴリズムがあることがわかりました。

SSLContext サービスに RSA をインストールする何らかの方法を見つける必要がありますか? 私は正しいサービスを見ているのでしょうか? RSAを使用しないほうがいいのでしょうか?

私はSSL - セキュリティ - 証明書全体について初心者なのですが、これらの異なるサービスが同じ証明書にアクセスするはずなのに同じアルゴリズムを持っていないことにただただ驚かされます。

解決方法は?

試す javax.net.ssl.keyStorePassword の代わりに javax.net.ssl.keyPassword : 後者は JSSE参照ガイド .

あなたが言及したアルゴリズムは、デフォルトのセキュリティ・プロバイダを使用することでデフォルトで存在するはずです。 NoSuchAlgorithmException は、しばしば他の根本的な例外(ファイルが見つからない、パスワードが間違っている、鍵屋の種類が違う、...)によって引き起こされます。スタックトレースを見ることは有用です。

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