ある日
古くから稼働しているサーバーに対して、DebianベースのDockerコンテナからcurlを実行したら、以下のエラーに遭遇しました。
curl https://example.com/foo/bar
curl: (35) error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
SSL/TLSの暗号化で使われている鍵長が短く、セキュリティの面で引っかかっているようです。
どうすれば、、、
ネットを調べたところ、opensslのバージョン1.1.1からセキュリティが強化され、暗号化の際に用いる鍵長がデフォルトで2048ビットになっており、その影響を受けているようでした。
Change the default RSA, DSA and DH size to 2048 bit instead of 1024
- https://github.com/openssl/openssl/commit/70b0b977f73cd70e17538af3095d18e0cf59132e
- via 急に外部APIとの通信が "dh key too small" で失敗するようになったのはなぜ? - BANK tech blog
curlのバージョンを調べてみましょう。
openssl version
#=> OpenSSL 1.1.1d 10 Sep 2019
バージョンは1.1.1。ドンピシャですね。
対処方法
サーバー側のopensslをアップデートすることで、この問題は回避できそうですが、サーバー側の管理者権限がないので今回はクライアント側で調整することにします。
Debian系Linuxでopensslの設定を変更する方法を探します。するとGoogle先生のお力で以下のページが見つかりました。
このページ内で以下の記述を見つけました。
I would close that if I were the curl maintainer. The remote site in the
example uses a small DH key [0]. If you can't get owner to upgrade the
site and want still to access the site I suggest to remove
CipherString = DEFAULT@SECLEVEL=2
from /etc/ssl/openssl.cnf.
/etc/ssl/openssl.cnf
の CipherString = DEFAULT@SECLEVEL=2
の記述を取り除くと良さそうです。該当の行をコメントアウト対応してみます。
- CipherString = DEFAULT@SECLEVEL=2
+ # CipherString = DEFAULT@SECLEVEL=2
sed を使ってコマンドで書き換える時はこちら。
# コメントアウト対応、以下を実行するとファイルを即上書きするので要注意(-iオプション)
sed -i -e 's/CipherString = DEFAULT@SECLEVEL=2/# CipherString = DEFAULT@SECLEVEL=2/g' /etc/ssl/openssl.cnf
/etc/ssl/openssl.cnf
を書き換えたら、再度curlを実行します。
curl https://example.com/foo/bar
{"message":"Hello, World!"}
無事レスポンスが得られました!
注意事項
こちらの対処方法はopensslのクライアント側のセキュリティレベルを下げることになるため、セキュリティリスクがあります。セキュリティ面を考慮して /etc/ssl/openssl.cnf
設定を変更してください。
設定内容についていまいちピンとこない場合は、この対応方法を取らずに、詳しい方に相談するのをおすすめします。