gmailのメール送信のTLSエラーの修正

(Last Updated On: 2021年2月5日)

gmailの仕様が変更され自己署名証明書が使えなくなりgmail設定の「アカウントとインポート」で設定したメールアドレスからの送信が使えなくなったようです。結構困っている人が多いようですが判ってしまえば直す方法はそれ程難しくありません。

エラーメッセージで検索するとどうもこの4月くらいから仕様変更されているようです。qmailを使っているのでqmailでの修正方法です。postfixなどでもやる事はあまり変わりません。

まず結論

  • 自己署名証明書を使っているならLet’s Encryptを使う
  • 普通の証明書を使っているなら証明書のCN名と同じ名前をsmtpサーバー名に使う

※ ワイルドカード証明書ならワイルドカードの部分の名前は何でもOK

gmailのエラー

エラーが起きると次のエラーメッセージを含むエラーメールが返ってきます。

gmail設定の「アカウントとインポート」タブにある独自ドメインメールを使う設定からSMTPサーバーの再設定を行おうとすると次のエラーが表示され、SMTPサーバーの設定ができなくなっています。

TLS Negotiation failed, the certificate doesn't match the host., code: 0

エラーの原因

エラーの原因は2種類あります。

  • 自己署名証明書を利用している ー これは普通の証明書を使うしかない
  • 証明書のCN(Common Name)が指定したメールサーバーのドメイン名と一致していない ー 一致させれば利用できる

自己署名の証明書は使えないのでLet’s Encryptなどの証明書を取得するしかありません。

エラーの修正

Let’s Encryptを使う場合、メールサーバーホストでインターネットからアクセス可能なWebサーバーを起動する必要があります。もしくはDNSのテキストレコードを修正可能であることが必要です。DNSによる設定も難しくはないですがWebサーバーを使う方法の方が容易です。

ネットワークを完全に管理できるのでゲートウェイでメールサーバーIPの80/443ポートのアクセスをリバースプロキシに振り向けて、リバースプロキシをWebサーバーを利用したLet’s Encryptの認証で証明書を取得しました。

※ ワイルドカード証明書を持っている場合、証明書を新たに取得する必要はありません。次の※までスキップできます。

certbotがインストールされていない場合、certbotをインストールしておきます。

certbot certonly --webroot

この利用方法だとWebサーバーの設定を変えずに証明書だけを取得できます。指定する情報は2つです。

Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel): mail.example.com

ここでメールサーバーのホスト名(上記ではmail.example.com)をFQDNで入力します。このホスト上でWebサーバーが起動している必要があります。

Input the webroot for mail.example.com: (Enter 'c' to cancel):

ここでWebサーバーのドキュメントルートのディレクトリパスを入力します。

インターネットからアクセス可能なWebサーバーで実行した場合、certbotコマンドが作成した認証用のファイルが <web root path>/.well-known//acme-challenge/ ディレクトリに作成され、Let’s Encryptのサーバーがこれにアクセスし認証が完了します。

無事実行した場合、/etc/letsencrypt/live/mail.example.com/ ディレクトリに証明書がインストールされます。

※ ワイルドカード証明書を持っている場合、証明書取得を省略して次の手順でservercert.pemを作成できます。

qmailのTLSサポートを利用する場合、証明書と秘密鍵が一つのファイルである必要があり、ファイル名がservercert.pemでなければなりません。

cat /etc/letsencrypt/live/mail.example.com/fullchain.pem /etc/letsencrypt/live/mail.example.com/privkey.pem > servercert.pem

などとして一つにします。

作ったservercert.pemを/var/qmail/control/servercert.pemにコピーすれば、従来通りgmailから自分のメールサーバーを利用して自分のメールアドレスからメール送信可能になります。svc -h (qmailなどdeamontoolsで操作させているプロセスにハングアップシグナルを送って設定ファイルを再読込み)は必要ありません。毎回証明書を読み込んでいるようです。cervercert.pemはqmail-smtpdから(subumissionポートで動作さている場合もqmail-smtpd。vpopmailを利用する場合、vpopmailにアクセス権が必要)アクセス可能である必要があります。パーミッションに注意が必要です。

Let’s Encryptの証明書は3ヶ月で有効期限が切れるのでcronなどを使って自動的に更新するように設定すると良いでしょう。私は週一回、cronで更新チェックをしてコピーするようしています。

postfixの場合、証明書と秘密鍵を別々に指定できるようになっています。マニュアルなどに従い設定すると同じようにLet’s Encryptの証明書が使えるようになります。

http://www.postfix.org/TLS_README.html

証明書の確認

SMTPサーバー証明書の確認はopensslコマンドで簡単にできます。

openssl s_client -connect mail.example.com:587 -starttls smtp

このコマンドを実行すると

CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = mail.example.com
verify return:1
Certificate chain
0 s:CN = mail.example.com
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
i:O = Digital Signature Trust Co., CN = DST Root CA X3
Server certificate
-----BEGIN CERTIFICATE-----
(略)

のような出力が得られます。

CN = mail.example.com

このCNの値とgmailで設定するSMTPサーバー名が一致している必要があります。

※ ワイルドカード証明書の場合、一致している必要はありません。*.example.com, example.comで作成している場合、example.comと表示され、mx.example.com, mail.example.comなどで利用できます。

ローカルに保存されている証明書の内容確認も簡単です。

# openssl x509 -in <証明書>.pem -text

とすると確認できます。

Certificate:
Data:
Version: 3 (0x2)
Serial Number:
03:e5:fa:09:6e:32:1f:eb:fb:f8:5d:43:2d:08:fa:f4:3f:a3
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
Validity
Not Before: Mar 6 17:40:05 2020 GMT
Not After : Jun 4 17:40:05 2020 GMT
Subject: CN=mail.example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
(略)

ポイント

gmailを使って独自ドメイン名の自分のアドレスからメールを送信をするには

  • メールサーバー(smtp)ホスト名と証明書のCN(Common Name)が一致している必要がある。
  • 確認可能な証明書でなければならない。(自己署名証明書は使えない)

の条件を満す必要があります。

ホスティングサービスなどの場合、管理ツールから設定可能である事が多いと思います。先ずはホスティングサービスのマニュアル/FAQを参照すると良いでしょう。

その他

暗号化無しで25番ポートを利用すればgmailからメール送信可能になりますが、普通は暗号化無しは利用しない方が良いでしょう。このブログのメール環境の場合、SMTP認証はsubmissionポート(587)だけ有効にしているので暗号化無しでの利用はできません。同様の環境も多いと思います。

通常の場合、SMTP認証のユーザー名/パスワードはIMAP/POP認証と同じです。盗まれた場合、ありとあらゆる悪さに利用される可能性があります。

TLSではなくSSLを利用すると問題が解消される場合もあるようです。大抵の場合、SSLでも取り敢えずは大丈夫でしょう。

投稿者: yohgaki