Ubuntu 20.04でPythonのサードパーティAPIを用いてSSL通信しようとしたところ以下のエラーが発生。Ubuntu 20.04で起こるらしい。
(Caused by SSLError(SSLError(1, '[SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1123)')
下記のQAを参考に解決した方法をまとめます。
https://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl-security-level
このエラーが発生する背景
Debine系のOpenSSLのデフォルト設定がよりセキュアになったことが原因らしい。
セキュアになった背景はこれです。(英文です)
https://weakdh.org/
簡単に概要を訳すとSSLで使用する鍵交換のアルゴリズムに脆弱性が見つかったため。
脆弱性に該当するSSL通信をしようとするとDH_KEY_TOO_SMALLのエラーが発生する。
根本解決としてはサーバー側のセキュリティが改善されることだが、今回はサードパーティAPIを用いており不可能。
そのため暫定対処ではあるが、セキュリティレベルを変更する方法を採用した。
openssl.cnfの編集してセキュリティレベルを変更
以下コマンドでopensslコンフィグファイルの配置ディレクトリを確認。
% openssl version -d
ちなみに一般的には"/usr/lib/ssl"配下にある。
ファイル冒頭に以下の1行を追記して保存。
openssl_conf = default_conf
次にファイル末尾に以下を追記する。
[ default_conf ]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1
これは何をしているかというとOpenSSLの暗号化のセキュリティレベルを下げている。
これだけでSSL通信できるようになるはず。
openssl.cnfのローカル化
/usr/lib/ssl配下のコンフィグファイルを直接編集するとLinuxシステム全体に影響を与える。
影響を特定ユーザーでのログイン時等に局所化したい場合は以下を環境変数を.bashrcに追記する。
export OPENSSL_CONF=/path/to/my/openssl.cnf