利用しているメールサーバーのひとつ (以下の例では pop3.nanashinonozomi.com と表記) に POPFile で SSL 接続しようとすると、
+OK POP3 POPFile (v1.1.3) server ready USER pop3.nanashinonozomi.com:f7u:ssl -ERR can't connect to pop3.nanashinonozomi.com:995 QUIT +OK goodbye
のエラーでメールサーバーへのアクセスが失敗することに気付いた。
POPFile のログファイルを確認すると、
IO::Socket::INET or IO::Socket::SSL gets an error: SSL connect attempt failed error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
のエラーで SSL 接続の確立に失敗していたため、
$ openssl s_client -connect pop3.nanashinonozomi.com:995
として状況を確認したところ、同様のエラーが発生。
$ openssl s_client -cipher 'DEFAULT:!DH' -connect pop3.nanashinonozomi.com:995
と、 DH を除外すると接続に成功することから、これ相当の設定が必要になるのだが……さて、どうしたものか…………。
原因
OpenSSL 1.1.1 からセキュリティーレベルが引き上げられ、 RSA, DSA, DH 鍵の鍵長のデフォルトが 2,048bit に変更されたことが影響している模様。
$ openssl version OpenSSL 1.1.1f 31 Mar 2020
確かに該当している……。
対処方法
良い方法とは思えないが、 POPFile の起動時のみ OpenSSL の SECLEVEL を 1 に下げるという強攻策をとることにした。
参考にしたのは「Ubuntu 20.04 – how to set lower SSL security level? – Ask Ubuntu」のスレッド。
OpenSSL の設定ファイル openssl.cnf をホームディレクトリー以下にコピー
$ openssl version -d OPENSSLDIR: "/usr/lib/ssl" $ cp /usr/lib/ssl/openssl.cnf ~/etc/openssl.cnf
コピーした設定ファイル ~/etc/openssl.cnf に設定を追記
コピーした設定ファイル ~/etc/ openssl.cnf の1行目に下記の1行を追記する。
openssl_conf = openssl_init
同様にファイルの最後に下記の8行を追記する。
[openssl_init]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = DEFAULT@SECLEVEL=1
POPFile を起動するシェルスクリプトを修正
現在利用中の POPFile 起動用シェルスクリプト ~/bin/start_popfile.sh の内容を修正する。
内容としては、
#!/bin/sh
### 追記 ここから
# 読み込む openssl.cnf の場所
export OPENSSL_CONF=/home/f7u/etc/openssl.cnf
### 追記 ここまで
# POPFile がインストールされている場所
export POPFILE_ROOT=/usr/share/popfile/
# ユーザー用のコーパス等が保存されている場所
export POPFILE_USER=/home/f7u/.popfile/
exec /usr/share/popfile/popfile.pl &
上記の例におけるユーザー名 (f7u) は、環境に応じて読み替えが必要。
ひとまず、これで件のエラーを抑制することはできたが、良い方法とは思えない。他にもっと良い方法があるような気がする。