3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Amazon SES + mailx で「Error in certificate: Peer's certificate issuer is not recognized.」が出た時の対処法

1.前書き

Amazon SESとmailxでメール送信できる仕組みを作ったのですが、
メール送信のたびに「Error in certificate: Peer's certificate issuer is not recognized.」が出力していました。
メール送信自体は成功しているので問題は無いのかもしれませんが、エラーが出たままなのは精神衛生上よろしくないので、四苦八苦しながら対処しました。

これは、その時の対処法を記載しています。

2.環境

  • Centos7.6
  • mailx-12.5-19

前提

  • Amazon SES には送信元メールアドレス登録&承認済み
  • mailx はインストール済み
  • ~/.mailrc には以下のように設定
~/.mailrc
set smtp-use-starttls
set smtp=smtp://email-smtp.us-east-1.amazonaws.com:587
set smtp-auth=login
set smtp-auth-user=<Access key ID>
set smtp-auth-password=<Secret access key>
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
set from=<From Mail Address>

3.調査

エラーが出るタイミング

mail -v で確認したところ、Amazon SESのメールサーバへTLS通信を開始した際に出力されているようです。

>>> STARTTLS
220 Ready to start TLS
Error in certificate: Peer's certificate issuer is not recognized.  --★
Comparing DNS name: "email-smtp.us-east-1.amazonaws.com"
SSL parameters: cipher=AES-256-GCM, keysize=256, secretkeysize=256,
issuer=CN=Amazon,OU=Server CA 1B,O=Amazon,C=US
subject=CN=email-smtp.us-east-1.amazonaws.com

Google翻訳にかけると、「Error in certificate: Peer's certificate issuer is not recognized.(証明書のエラー:ピアの証明書発行者が認識されません。)」って言っているので、怪しいのは証明書のよう。
~/.mailrcでも指定した、証明書のデータベース/etc/pki/nssdb/を確認してみます。

$ sudo certutil -L -d /etc/pki/nssdb/

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

何も入っていませんでした。
指定した証明書のデータベースに証明書が無いために起こったエラーだったことが判ります。

4.対処

Amazonの証明書をインポートして対処します。

4-1 Firefox の証明書データベースを流用する場合

Firefoxから取得済みの証明書をインポートする方法が一番手軽だったので、その方法で対処していきます。
※別途Firefoxのインストールと、GUI環境が必要となります。

1. Firefox の現在の証明書を確認

Firefox が所持している証明書を確認します。

$ certutil -L -d ~/.mozilla/firefox/<xxxxxxxx>.default/

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

※Firefoxにも証明書が無い場合、一度FirefoxでAmazonのサイトを閲覧しましょう。
 閲覧後に再度確認すると、「Amazon」の証明書が追加されるはずです。

$ certutil -L -d ~/.mozilla/firefox/<xxxxxxxx>.default/

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Amazon                                                       ,,

2. Firefox の証明書データベースを流用

新たに証明書データベース用のディレクトリを作成し、そこにFirefoxの証明書データベースをコピーします。

$ mkdir -m700 ~/.certs
$ cp -p ~/.mozilla/firefox/<xxxxxxxx>.default/{cert8.db,key3.db,secmod.db} ~/.certs

3. Amazonの証明書に信頼性を指定する

Firefoxから流用した証明書は信頼性が何も指定されていません。
そのため、証明書をエクスポート→インポートし、インポート時に信頼性の指定を行います。

$ certutil -L -n 'Amazon'  -d ~/.certs -a > amazon.cert.asc  # 証明書エクスポート
$ certutil -A -t "C,," -n 'Amazon'  -d ~/.certs -i amazon.cert.asc  # 信頼性を指定して証明書インポート

こうすることで、「Trust Attributes」の項目がC,,1に変更されます。

$ certutil -L -d ~/.certs/

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Amazon                                                       C,,

4-2 直接ルート証明書をインポートする場合

えー、FirefoxもGUI環境も用意しなきゃならないの? という場合は、直接証明書をインポートする方法があります。

1. 新規の証明書データベース格納ディレクトリを作成する

$ mkdir -m700 ~/.certs
$ certutil -N -d ~/.certs
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password: <空エンター>
Re-enter password: <空エンター>

2. Amazonからルート証明書をダウンロードする

こちらからルート証明書を入手します。

$ wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
$ mv AmazonRootCA1.pem ~/.certs/

3. 入手したルート証明書をインポートする

「Trust Attributes」の項目をC,,1の形でインポートします。

$ certutil -A -n "Amazon" -t "C,," -d ~/.certs -i ~/.certs/AmazonRootCA1.pem -a
$ certutil -L -d ~/.certs/

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Amazon                                                       C,,

5.確認

上記の対処が完了したら.mailrcの設定を変更して、メールを送信してみましょう。

~/.mailrc
set nss-config-dir=/etc/pki/nssdb/
  ↓
set nss-config-dir=~/.certs/
$ echo -e "test mail" | mail -v -s "test mail title" -r "<From Mail Address>" "<To Mail Address>"
~~
>>> STARTTLS
220 Ready to start TLS
Comparing DNS name: "email-smtp.us-east-1.amazonaws.com"
SSL parameters: cipher=AES-256-GCM, keysize=256, secretkeysize=256,
issuer=CN=Amazon,OU=Server CA 1B,O=Amazon,C=US
subject=CN=email-smtp.us-east-1.amazonaws.com
~~

「Error in certificate: Peer's certificate issuer is not recognized.」が出力されなければ対処完了です。

6.まとめ

以上、対処法でした。
TLS通信における証明書の役割など、まだぼんやりとしか理解してないので、今後の課題になりそうです。
ですが、エラーが解決できると気持ちいいですね。

以下、参考にさせて頂いたサイト

Linuxからプロセスの動作状況をスマホに通知する
certutilによる証明書管理 [Fedora14]


  1. Cは「サーバ証明書発行元として信頼しているCAの証明書」を示す。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?