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以降で鍵暗号アルゴリズムDES
を使用する方法
JAVA_HOME
配下にあるjava.security
ファイル内のjdk.tls.disabledAlgorithms
から3DES_EDE_CBC
を削除すればOKです。
これで鍵暗号アルゴリズムDES
を使って通信できるようになります。
まとめ
JavaでTLS 1.0が使用できなくて詰まった話でした。