サイオステクノロジー技術部 武井です。開発検証のためにメールを受信できる環境が必要になり、dovecotでPOP over SSLしてみました。ちょっとハマったので、ここにその記録を残しておきたいと思います。CentOS7.4を前提にしております。
Postfixのインストール
まず、Postfixのインストールです。(本記事の設定は、開発検証での利用を目的とするため、最低限動くための設定にしています。実運用する際は適宜セキュリティの設定をして下さい。)
まずPostfixをインストールします。
# yum install postfix
ここからは、設定ファイル/etc/postfix/main.cfを編集します。
下記の行をコメントアウトして有効にして下さい。MailDir形式を有効にします。
home_mailbox = Maildir/
受信できるメールドメインを設定します。以下の内容を追加して下さい。
mydomain = example.com
全ての送信元からのメールを許可します。
inet_interfaces = all
先に定義したドメインでのメールを受信可能にするため、以下の設定をコメントアウトして有効にします。
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
Postfixを再起動して、設定を反映します。
# systemctl restart postfix
dovecotのインストール
dovecotをインストールします。
# yum install dovecot
/etc/dovecot/conf.d/10-auth.confを編集します。以下の設定をして、プレインテキスト認証を有効にします。
disable_plaintext_auth = no
/etc/dovecot/conf.d/10-mail.confを編集します。以下の設定をして、Maildir形式での受信を可能にします。
mail_location = maildir:~/Maildir
次にSSL証明書の用意です。
証明書(x.509形式のbase64エンコード)ファイルを以下の形式で作成します。サーバー証明書と、サーバー証明書の検証に使う中間証明書を必要な分だけ、以下の順序で連結して1つのファイルにします。
-----BEGIN CERTIFICATE----- サーバー証明書の記述内容 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- 中間証明書1の記述内容 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- 中間証明書2の記述内容 -----END CERTIFICATE-----
次に秘密鍵を以下の形式で作成します。
-----BEGIN RSA PRIVATE KEY----- 秘密鍵の記述内容 -----END RSA PRIVATE KEY-----
/etc/dovecot/conf.d/10-ssl.confを編集します。以下の設定をして、SSLを有効にします。/etc/pki/certs/dovecot.crtは先程作成した証明書ファイル、/etc/pki/private/dovecot.keyは先程作成した秘密鍵のファイルです。注意が必要なのは指定するパスの頭に「<」が必要なことです。これを忘れて、しばらくエラーで悩まされました(´・ω・`)
ssl = required ssl_cert = </etc/pki/tls/certs/dovecot.crt ssl_key = </etc/pki/private/dovecot.key
/etc/dovecot/conf.d/10-master.confを編集します。以下の設定をして、SSLを有効にします。以下の設定を行い、POP over SSLを有効にします。
service pop3-login { inet_listener pop3 { #port = 110 } inet_listener pop3s { port = 995 # これをコメントアウト ssl = yes # これをコメントアウト } }
これで設定は完了です。dovecotを再起動します。
# systemctl restart dovecot
動作確認
opensslコマンドを使って動作確認を行います。メールサーバーのホスト名は、mail.example.comとします。
# openssl s_client -connect mail.example.com:995 CONNECTED(00000003) ・・・ ・・・ +OK Dovecot ready. USER ntakei ← ユーザー名を入力します。 +OK PASS password ← パスワードを入力します。 +OK Logged in. LIST ← メールの一覧を取得します。 +OK 2 messages: 1 322 2 322 . retr 1 ← 指定した番号のメールの内容を表示します。 +OK 322 octets Return-Path: <user@foo.or.jp> X-Original-To: ntakei@example.com Delivered-To: ntakei@example.com Received: from example.com (unknown [10.8.9.6]) by smtp.example.com (Postfix) with SMTP id E2D6E2411 for <ntakei@example.com>; Tue, 3 Apr 2018 04:20:45 +0000 (UTC) From: user@example.com Subjet: test Hello world. .
(`・ω・´)シャキーン
できました。
もう一つハマりどころなのですが、opensslコマンドで動作確認した場合、メールを取り出すコマンド「RETR」が最初うまく動作しませんでした。opensslコマンドの仕様で「R」から始めるコマンドは、SSLのネゴシエーションを行うと決まっているそうです。なので、小文字で「retr」とやると、うまくいきました。(+o+)