Redmineからメールが送れない問題を解決

AWS EC2のRedmineからメールを送ろうとしてうまくいかなかったのでその辺をまとめてみた.

先に結論を言っておくとAWSの設定というよりはEC2に立てたRedmineの設定の問題だった.

環境

AWS内のEC2にRedminePostfixを立てた.RedmineからPostfixを経由してAmazon Simple Email Service(以降SES)にメールをリレーするよう設定した.構成は以下のようになっている.

f:id:a-mochan:20191026015034p:plain
全体の構成

問題

一通り設定が終わったところでRedmine上からテストメールをGmailのアドレスに送ってみると以下のようなエラーが出た.

f:id:a-mochan:20191020145732p:plain
Redmine上でメールを送信した時のエラー

とりあえずエラー内容でググってみたところ,公式に以下のように書いてあった.

メールのリレーサーバーのSSL証明書の確認で問題が発生していると考えられます。取り急ぎの対処として、対応する email_delivery セクションに以下の設定を追加してください。
enable_starttls_auto: false » メールの設定例 - Redmineガイド

実際に上記のようにRedmine側を設定してメールテストをすると確かに送ることができた. ただ,この時自分はどこの間の経路で証明書にエラーが出て通信を暗号化できていないか分かっていなかったので,PostfixとSES間,SESとGmail間の暗号化がされているか調べてみた.

調査

まずは,SESとGmail間の通信が暗号化されているか確認する.GmailヘルプによるとGmail上から以下の手順で確認できる.

受信メールが暗号化されているか確認する

  1. メールを開きます.
  2. メールの受信者リストの右にある下矢印をクリックします.
  3. 表示される南京錠アイコンの色は,メールの送信時に使用された暗号化のレベルを示します. 送受信時のメールの暗号化 - Gmail ヘルプ

暗号化のレベルに応じてアイコンの色が異なる.それぞれの意味は以下の通り.

暗号化のアイコンの意味

  • 緑(S/MIME - 高度な暗号化): 機密情報が含まれているメールに適しています.送信相手の公開鍵がある場合,送信するすべてのメールが S/MIME で暗号化されます.暗号化されたメールは,対応する秘密鍵を持つ受信者のみ復号化できます.
  • 灰色(TLS - 標準的な暗号化): ほとんどのメールに適しています.TLS(Transport Layer Security)は S/MIME に対応していない他のメールサービスとやり取りするメールで使用されます.
  • 赤(暗号化なし)暗号化されないため,メールの安全性が保証されません.送信するメールが確実に暗号化されないという予測は,過去にこの宛先のドメインに送信されたメールに照らし合わせて行われます. 送受信時のメールの暗号化 - Gmail ヘルプ

Gmail上で確認してみると灰色だったのでTLSで暗号化されてそう.

f:id:a-mochan:20191026015711p:plain
Gmailで暗号化の有無確認

次に,PostfixとSES間の通信が暗号化されているか確認する.確認方法はPostfix側の送信ログを見てTLSのハンドシェイクがされてそうかどうかで確認する.送信ログにTLS通信のハンドシェイクはデフォルトのログレベルだと出力されないのでPostfixの設定を変える.

sudo postconf -e 'smtp_tls_loglevel = 2'
sudo postfix reload

Redmineからメールを送ってみると以下のようなログが確認された.TLS通信のハンドシェイクがなされていそう.

ip-hoge postfix/smtp[26090]: SSL_connect:SSLv3 read server certificate A
ip-hoge postfix/smtp[26090]: SSL_connect:SSLv3 read server key exchange A
ip-hoge postfix/smtp[26090]: SSL_connect:SSLv3 read server done A
ip-hoge postfix/smtp[26090]: SSL_connect:SSLv3 write client key exchange A
ip-hoge postfix/smtp[26090]: SSL_connect:SSLv3 write change cipher spec A
ip-hoge postfix/smtp[26090]: SSL_connect:SSLv3 write finished A
ip-hoge postfix/smtp[26090]: SSL_connect:SSLv3 flush data
ip-hoge postfix/smtp[26090]: SSL_connect:SSLv3 read finished A

ここまでの確認でEC2より外へは暗号化がされていることが分かったので安心したのだが,結局Redmineはどこの通信で証明書エラーが出て暗号化できなかったのか最初は分からなかった.しばらく考えた結果,RedminePostfix間の通信で暗号化されていないことにやっと気が付いた.なぜかPostfixに関してはSESに送信するSMTPの意識だけしていてRedmineから通信を受けるサーバとしてのSMTPを意識していなかった.SMTPサーバでは証明書等の設定をしていなかったためこのエラーが出たというわけである.というわけで,EC2内でのメールのやりとりに暗号化は不要なのでこの設定でよしとなった.

まとめ

  • Redmineからメールを送る際に出るメール送信中にエラーが発生しました (hostname does not match the server certificate)について調べた
  • EC2上のRedmineからSMTPサーバにメールを送信する際TLSを使用して通信をする設定になっていたが,SMTPサーバに証明書等が設定されていなかったためエラーが出て送れなかった
  • Redmine側でTLSを使用しない通信をするよう設定したことで解決
  • なおEC2より外への通信ではTLSが使われていることを確認した