ssl 導入


  1. openssl の導入
  2. pop over ssl およびsmtp over ssl の設定
  3. imap over sslの設定
  4. 参考文献

[1] openssl の導入

SSL/TLS をメールサーバに導入すると,クライアントとサーバ間の通信の やり取りが暗号化できる.以下はその導入のためのドキュメントである.

この作業は再構築後に usuzumi から grey に変更されるために, もう一度証明書を作り直す.また,qmail の起動スクリプト には usuzumi と書かれているため,それも grey に修正する.

[1.1] openssl のインストール

既に Debian のパッケージとしてインストールされている. OpenSSL 開発用パッケージを追加でインストール.

$ sudo apt install libssl-dev

[1.2] ucspi-tcp の導入

ucspi-tcp (tcpserver を含む) とは,TCP 接続を管理する便利なサーバ制御ツールの一つ.

今年度から IPv6 に対応した ucspi-tcp6 の導入を目指す. まず,必要な C ライブラリをインストール.

$ wget https://www.fehcom.de/ipnet/fehQlibs/fehQlibs-27.tgz
$ tar xzvf fehQlibs-27.tgz
$ sudo -s
# chown -R root:root fehQlibs-27
# cp -r fehQlibs-27 /usr/local/
# cd /usr/local/fehQlibs-27
# vim conf-build
     LIBDIR=/usr/local/lib
     HDRDIR=/usr/local/include
# make -C src
# make -C src shared
# make -C src install
# cd ..
# ln -s fehQlibs-27 qlibs
# echo "/usr/local/qlibs" >> /etc/ld.so.conf
# ldconfig
# exit
$ cd

続いて,ucspi-tcp6 をインストール. 今年度は既に ucspi-tcp-0.88 をインストール してしまったので,上書きする形になる. 来年度以降は初めからこちらをインストールするのが好ましいだろう.

$ wget https://www.fehcom.de/ipnet/ucspi-tcp6/ucspi-tcp6-1.13.04.tgz
$ tar xzvf ucspi-tcp6-1.13.04.tgz
$ sudo -s
# cp -r net /var/qmail/
# cd /var/qmail/net/ucspi-tcp6/ucspi-tcp6-1.13.04

このままでは,ビルドは成功するがインストールされない. (特にエラーメッセージなどは出ないが,/usr/local/bin/tcpserver など のタイムスタンプが更新されない.) ソースコードを読み,package/command-cp にコマンドのコピー先パスが書いておらず, シンボリックリンクを張るコマンドも指定されていないため, コピーもリンクも両方が実行されないためだと考えた. そのため,package/command-cp を編集してインストール.

# vim package/command-cp
     /usr/local/bin    # この行を追記

     Directories to copy commands into, one per line.
     The first empty line terminates the list.
# ./package/install
# exit
$ cd

最後に ucspi-ssl をインストール.

$ wget wget https://www.fehcom.de/ipnet/ucspi-ssl/ucspi-ssl-0.13.04.tgz
$ tar xzvf ucspi-ssl-0.13.04.tgz
$ sudo -s
# cp -r host /var/qmail/
# cd /var/qmail/host/superscript.com/net/ucspi-ssl-0.13.04
# vim package/command-cp
     /usr/local/bin    # この行を追記

     Directories to copy commands into, one per line.
     The first empty line terminates the list.
# ./package/install
# cd /usr/local/bin
# ln -s sslserver tcpserver-ssl   # /etc/init.d/qmail の記述に合わせる
# exit

[2] pop over ssl および smtp over ssl の導入

[2.1]準備

smtp over ssl を用いるため, qmail に smtp-auth のパッチをあてる. 以前 qmail のソースを展開したディレクトリに移動し, パッチをあてる.

# cd /usr/local/src
# tar zxvf netqmail-1.06.tar.gz
# cp -r netqmail-1.06 netqmail-1.06_smtps
# cd netqmail-1.06_smtps
# patch -p1 < ../qmail-103.patch
# patch -p1 < ../qmail-date-localtime.patch
# patch -p1 < ../qmail-smtpd-relay-reject
# cp ../qmail-smtpd-auth-0.31/README.auth ./
# cp ../qmail-smtpd-auth-0.31/base64.c ./
# cp ../qmail-smtpd-auth-0.31/base64.h ./
# cd ./../qmail-smtpd-auth-0.31 
# patch -d ../netqmail-1.06_smtps < auth.patch
# cd ../netqmail-1.06_smtps/
# make
# cp qmail-smtpd /var/qmail/bin/qmail-smtpd-auth

make が失敗したが,netqmail を入手しなおして再度試すと成功した. 原因不明.

[2.2]証明書発行および起動スクリプトの編集

2015 年度からUPKI サーバ証明書を導入した. qmail とdovecot では必要な証明書の型が違うので 注意が必要. 具体的には qmail には連結証明書 (秘密鍵 + ホスト証明書 + 中間証明書) が, dovecot では秘密鍵と連結証明書 (ホスト証明書 + 中間証明書) がそれぞれ別々に必要となる. また, 秘密鍵は事前にパスフレーズを外しておく必要がある. 詳細はこちらを参照されたい.

以下では,パスフレーズ解除済みの秘密鍵 (mail_out.key), 64 bit となるように 改行されたホスト証明書 (mail.ep.sci.hokudai.ac.jp.cer), 中間証明書 (nii-odca4g7rsa.cer) を usuzumi にダウンロード済みの状態からの作業を記述する.

証明書ファイルを結合する

# cat mail_out.key mail.ep.sci.hokudai.ac.jp.cer nii-odca4g7rsa.cer > qmail.pem

root 以外閲覧できないようにするし, 所定の位置にコピーする.

# chmod 600 qmail.pem
# mkdir /var/qmail/server.key
# cp qmail.pem /var/qmail/server.key/

Diffie-Hellman パラメータを設定する. これは DHE 鍵交換方式による TLS ハンドシェイクで必要.

# openssl dhparam -out /var/qmail/server.key/dhparams.pem 2048

起動スクリプトのコメントアウトを外す. また,ホスト名を usuzumi に直す. 今年度から ucspi-ssl を使用するため,一部記述を書き換える.

# vim /etc/init.d/qmail
        .
        .
        .
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin

#[ -f /var/qmail/rc ] || exit 0
[ -f /var/qmail/bin/qmail-start ] || exit 0
[ -f /var/qmail/bin/qmail-send ] || exit 0

# 証明書と鍵とDHパラメータの環境変数を明示的に指定
CERTFILE="/var/qmail/server.key/qmail.pem"
#KEYFILE="/var/qmail/server.key/mail_out.key" # 必要なら秘密鍵と証明書を分離する
DHFILE="/var/qmail/server.key/dhparams.pem"

export CERTFILE
#export KEYFILE
export DHFILE

case "$1" in
    start)
         .
         .
         .
        # For SMTP over SSL
        sh -c " /sbin/start-stop-daemon --start --quiet --user qmaild \
        --pidfile /var/run/tcpserver_ssmtp.pid --make-pidfile \
        --exec /usr/local/bin/tcpserver-ssl -- -s -HRv -u \
        ` id -u qmaild ` -g ` id -g qmaild ` -x /etc/tcp.smtp.cdb \
        0.0.0.0 465 \                 # -n /var/qmail/server.key/qmail.pem は消す
        /usr/local/bin/rblsmtpd -r bl.spamcop.net \
        /var/qmail/bin/qmail-smtpd-auth usuzumi.ep.sci.hokudai.ac.jp \
        /bin/checklocalpwd /bin/true 2>&1 \
        | /var/qmail/bin/splogger smtpd 3 > /dev/null 2>&1 &"

        # For POP3 over SSL
        sh -c "/sbin/start-stop-daemon --start --quiet --user root \
        --pidfile /var/run/tcpserver_pop3s.pid --make-pidfile \
        --exec /usr/local/bin/tcpserver-ssl -- -s \
        -v -u 0 -g 0 0.0.0.0 995 \     # -n /var/... は消す
        /var/qmail/bin/qmail-popup \
        usuzumi.ep.sci.hokudai.ac.jp /bin/checkapoppw \
        /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
        | /var/qmail/bin/splogger pop3d 3 > /dev/null 2>&1 &"
    stop)
         .
         .
         .
    /sbin/start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_ssmtp.pid --exec /usr/local/bin/tcpserver-ssl # smtp over SSL
    /sbin/start-stop-daemon --user root --stop --quiet --oknodo --pidfile /var/run/tcpserver_pop3s.pid --exec /usr/local/bin/tcpserver-ssl # pop3s

ここらで qmail-send や Stop daemons のコメントアウトも戻していいかもしれない. (昨年度のログには書いていないが,運用中の grey ではコメントアウトが外れている)

[2.3]checklocalpwd のインストール

認証のために checklocalpwd を用いる. checklocalpwd のソースを落として展開する.

$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2015/dvlop/script/checklocalpwd-1.0.tar.gz 
$ tar zxvf checklocalpwd-1.0.tar.gz
$ cd checklocalpwd

パスワードファイルの名前を変更する.

$ vim checklocalpwd.c
  #define CONFIG_FILE "/etc/poppasswd" → #define CONFIG_FILE "/etc/smtppasswd"

make する.(Perl のパスでエラーが出る前提で作られている気がする)

# make install

権限を変更する.

# chown root:nofiles /bin/checklocalpwd
# chmod 4710 /bin/checklocalpwd
# chmod 750 /bin/poppasswd_change
# chmod 750 /bin/poppasswd_basic

パスワード自動生成スクリプトを取得する.

$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2015/dvlop/script/smtppwdbg

取得したパスワード生成スクリプトを /etc/cron.daily 以下に置く.

  # chmod +x smtppwdbg
  # cp smtppwdbg /etc/cron.daily

crontab にsmtppwdbg を追加する.

  # crontab -e

以下の一行を追加する.

50 * * * *   /etc/cron.daily/smtppwdbg

[2.4]動作確認

smtp-auth 用にパスワードファイルを作成する.

# poppasswd_basic > /etc/smtppasswd 

パーミッション変更

# chmod 600 /etc/smtppasswd 

パスワードの作成(ここではユーザ hogehoge のパスワードを password とした場合の例を載せる)

# poppasswd_change /etc/smtppasswd hogehoge password

qmail の再起動と挙動の確認

# systemctl restart qmail
  # ss -ant | grep 995  # POP3S の確認
  LISTEN 0      20           0.0.0.0:995          0.0.0.0:*
  # ss -ant | grep 110  # POP3 の確認
  LISTEN 0      20           0.0.0.0:110          0.0.0.0:*
  # ss -ant | grep 25   # SMTP の確認
  LISTEN 0      20           0.0.0.0:25           0.0.0.0:*
  # ss -ant | grep 465  # SMTPS の確認
  LISTEN 0      20           0.0.0.0:465          0.0.0.0:*

Thunderbird でいつも通りアカウント作成.

  名前: mondohoge
  メールアドレス: mondohoge@usuzumi.ep.sci.hokudai.ac.jp

手動設定も必要.

  受信サーバ: POP
  ポート番号: 995
  SSL: SSL/TLS
  認証方式: 暗号化されたパスワード認証
  送信サーバ: SMTP
  ポート番号: 465
  SSL: SSL/TLS
  認証方式: 通常のパスワード認証

自分宛にメールを出してみる.

[3] imap over sslの設定

[3.1] 証明書発行

上述のとおり, dovecot では秘密鍵と連結証明書 (ホスト証明書 + 中間証明書) がそれぞれ必要となる. UPKI 更新マニュアルを参考に進めること. それぞれ以下のところに格納する.

# cat mail.ep.sci.hokudai.ac.jp.cer nii-odca4g7rsa.cer > fullchain.pem
# cp mail.ep.sci.hokudai.ac.jp.cer /etc/dovecot/dovecot.cer 
# cp mail_out.key /etc/dovecot/private/dovecot_key.pem
# cp nii-odca4g7rsa.cer /etc/dovecot/nii-odca4g7rsa.cer
# cp fullchain.pem /etc/dovecot/fullchain.pem
# chmod 600 /etc/dovecot/private/dovecot_key.pem

[3.2] 設定ファイルの編集

/etc/dovecot/conf.d/ 以下のファイル を編集

  # cd /etc/dovecot/conf.d/
  # vim 10-master.conf
  ...
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993           # コメントアウトを外す
    ssl = yes            # コメントアウトを外す
  }
  ...
  # vim 10-ssl.conf
	ssl = yes
	ssl_cert = </etc/dovecot/fullchain.pem
	ssl_key = </etc/dovecot/private/dovecot_key.pem
	#ssl_ca =   # コメントアウトを外さない 

dovecot を再起動する.

  # systemctl restart dovecot

imaps の動作確認

  # ss -ant | grep 993     # IMAPS の確認
  LISTEN 0      100          0.0.0.0:993          0.0.0.0:*
  LISTEN 0      100             [::]:993             [::]:*
  # ss -ant | grep 143     # IMAP の確認
  LISTEN 0      100          0.0.0.0:143          0.0.0.0:*
  LISTEN 0      100             [::]:143             [::]:*

[3.3]動作確認

Thunderbird でいつも通りアカウント作成. この際, dovecotpwdbg が cron で動いていると /etc/dovecot.cram-md5 の中身が 書き換わってしまうので, MD5 認証データベースファイルの作成を 参考にMD5形式のパスワードを作成しなおす.

  名前: mondohoge
  メールアドレス: mondohoge@usuzumi.ep.sci.hokudai.ac.jp

手動設定.

  受信サーバ: IMAP
  ポート番号: 993
  SSL: SSL/TLS
  認証方式: 暗号化されたパスワード認証

自分宛にメールを出してみる. このとき,/etc/smtppasswd にパスワードが書かれていないと失敗するので注意.

[4] 参考文献

  1. https://notes.sagredo.eu
  2. https://www.fehcom.de
  3. https://cr.yp.to/ucspi-tcp.html


最終更新日:2025/07/29 (山本 峻大) Copyright © 2000-2025 epcore