LoginSignup
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-09

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の証明書」を示す。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3