Java

JavaでTLS 1.0が使用できなくて詰まった話【解決済み】

JavaのFTPSライブラリを使って外部のサーバとFTPS(暗号化方式はTLS 1.0)でファイルのやりとりをする際、以下のようなjavax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failureエラーが発生し、接続失敗しました。

調べてみると、レガシーな鍵暗号アルゴリズムDESしか受け付けないサーバ側の仕様が原因でした。

原因はレガシーな鍵暗号アルゴリズムDES

Javaの公式ドキュメントにも書いてあるとおり、Java 8以降、鍵暗号アルゴリズムDESは、セキュリティ的にデフォルトで無効化されています。

サーバ側はTLS 1.0で鍵暗号アルゴリズムDESを受け付ける仕様だったため、ハンドシェイクエラーが発生したのです。

すべてのDES TLS暗号スイートが無効化されました
DESベースのTLS暗号スイートは廃止とみなされるため、今後使用しないでください。"DES"識別子をjdk.tls.disabledAlgorithmsセキュリティ・プロパティに追加することによって、DESベースの暗号スイートはSunJSSEE実装においてデフォルトで非アクティブ化されました。java.securityファイルのjdk.tls.disabledAlgorithmsセキュリティ・プロパティから"DES"を削除するか、Security.setProperty()メソッドを動的に呼び出すことで、これらの暗号スイートを再度アクティブにできます。いずれの場合も、DESを再度有効化した後は、SSLSocket.setEnabledCipherSuites()またはSSLEngine.setEnabledCipherSuites()メソッドを使用して、有効化されている暗号スイートのリストにDESベースの暗号スイートを追加する必要があります。
この変更の前に、DES40_CBC (すべてのDESではありません)スイートはjdk.tls.disabledAlgorithmsセキュリティ・プロパティによって無効化されていたことに注意してください。

Java 8リリースの変更

Java 8以降で鍵暗号アルゴリズムDESを使用する方法

JAVA_HOME配下にあるjava.securityファイル内のjdk.tls.disabledAlgorithmsから3DES_EDE_CBCを削除すればOKです。

これで鍵暗号アルゴリズムDESを使って通信できるようになります。

まとめ

JavaでTLS 1.0が使用できなくて詰まった話でした。

参考リンク


-Java

© 2020 Reasonable Code