bashのsmtp.gmail.comから「証明書のエラー:ピアの証明書発行者が認識されません」と表示される


11

問題がある場合、管理者にメールを送信するスクリプトが必要であり、会社はGmailのみを使用しています。いくつかの投稿の指示に従って、.mailrcファイルを使用してmailxをセットアップできました。最初にnss-config-dirのエラーがありましたが、Firefoxディレクトリからいくつかの.dbファイルをコピーすることで解決しました。./certsに移動し、mailrcでそれを目指します。メールが送信されました。

ただし、上記のエラーが発生しました。ある奇跡によって、.dbにGoogle証明書がありました。次のコマンドで表示されました。

~]$ certutil -L -d certs

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

GeoTrust SSL CA                                              ,,
VeriSign Class 3 Secure Server CA - G3                       ,,
Microsoft Internet Authority                                 ,,
VeriSign Class 3 Extended Validation SSL CA                  ,,
Akamai Subordinate CA 3                                      ,,
MSIT Machine Auth CA 2                                       ,,
Google Internet Authority                                    ,,

メールはとにかく機能したため、ほとんどの場合、無視できます。最後に、いくつかの髪と多くのグーグルを引っ張った後、私は迷惑を取り除く方法を見つけました。

まず、既存の証明書をASSCIIファイルにエクスポートします。

~]$ certutil -L -n 'Google Internet Authority'  -d certs -a > google.cert.asc

次に、そのファイルを再インポートし、SSL証明書に対して信頼できるものとしてマークします、ala:

~]$ certutil -A -t "C,," -n 'Google Internet Authority'  -d certs -i google.cert.asc

この後、リストに信頼済みと表示されます:

~]$ certutil -L -d certs

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI
...
Google Internet Authority                                    C,,

そして、mailxは問題なく送信します。

~]$ /bin/mailx -A gmail -s "Whadda ya no" somebody@acompany.com
ho ho ho
EOT
~]$

エラーを解決するために探している人に役立つことを願っています。

また、私は何かに興味があります。

偶然にMozillaデータベースになかった場合、どうすればこの証明書を取得できますか?たとえば、このようなものはありますか?

    ~]$ certutil -A -t "C,," \
                 -n 'gmail.com'  \
                 -d certs \
                 -i 'http://google.com/cert/this...'

回答:


13

それは私が望んでいたライナーではありませんが、これは証明書を最初から取得してインポートする方法です:

# Create a certificate directory
~]$ mkdir certs

# Create a new database in the certs dir
~]$ certutil -N -d certs 

# Need now a chain certificate - May 18, 2015
~]$ wget https://www.geotrust.com/resources/root_certificates/certificates/GeoTrust_Global_CA.cer

# Need now a chain certificate part 2 - May 18, 2015
~]$ mv GeoTrust_Global_CA.cer certs/

# Fetch the certificate from Gmail, saving in the text file GMAILCERT
# Added the CA opion - May 18, 2015
~]$ echo -n | openssl s_client -connect smtp.gmail.com:465 -CAfile certs/GeoTrust_Global_CA.cer | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > GMAILCERT

# Import the new cert file into the new database in the new dir
~]$ certutil -A -n "Google Internet Authority" -t "C,," -d certs -i GMAILCERT 

# Double Check
~]$ certutil -L -d certs

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

Google Internet Authority                                    C,,  

やぁ!このチケットの回答に感謝します


1
「証明書のエラー:ピアの証明書発行者が認識されません。」というエラーが再び表示されます。取得したGmail証明書の有効期限が切れていたため、新しい証明書はチェーン証明書のようです。 openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nullそれらをすべて表示します。
スパズム

1
発行者のcerファイルをダウンロードするステップで回答を更新しました。
ndasusers


7

この投稿は再度更新する必要があります。CentOS 7ボックスへのmailxのインストールで問題が発生しました。メールは送信されますが、まだ「認証エラー:ピアの証明書発行者が認識されていません」というメッセージが表示されていました。エラー。

私はここで解決策を見つけたが、それを翻訳しなければならなかった。

ここで迅速にそれを行う方法は:

# Create a certificate directory
mkdir ~/.certs

# Create a new database in the certs dir (dont forget to enter your pass phrase!)
certutil -N -d ~/.certs 

# Create three files for the cert chain
touch ~/.certs/google ~/.certs/geotrust ~/.certs/equifax

# Copy the cert chain for smtp.google.com:465 over to my_certs file (don't forget the -showcerts option, CTRL + C to end this command)
openssl s_client -showcerts -connect smtp.gmail.com:465 > ~/.certs/my_certs

--BEGIN CERTIFICATE--および--END CERTIFICATE--を含む各証明書をコピーし、それらを前に作成したそれぞれのファイル(google、geotrust、equifax)に貼り付け、それらのファイルを保存します。

# Open your my_certs file you made earlier and copy the google cert (usually the first one)
nano ~/.certs/my_certs

# Open your google file, paste the google cert that you just copied, and save and close
nano ~/.certs/google

# Open your my_certs file you made earlier and copy the geotrust cert (usually the second one)
nano ~/.certs/my_certs

# Open your geotrust file, paste the geotrust cert that you just copied, and save and close
nano ~/.certs/geotrust

# Open your my_certs file you made earlier and copy the equifax cert (usually the third one)
nano ~/.certs/my_certs

# Open your equifax file, paste the equifax cert that you just copied, and save and close
nano ~/.certs/equifax

次に、これらの各証明書をdbにインポートする必要があります。

# Import the google cert into the db
certutil -A -n "Google Internet Authority" -t "TC,," -d ~/.certs -i ~/.certs/google

# Import the geotrust cert into the db
certutil -A -n "GeoTrust Global CA" -t "TC,," -d ~/.certs -i ~/.certs/geotrust

# Import the equifax cert into the db
certutil -A -n "Equifax Secure Certificate Authority" -t "TCP,," -d ~/.certs -i ~/.certs/equifax

# Double check to make sure everything imported correctly into the db
certutil -L -d ~/.certs

出力例:

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

Google Internet Authority                                    CT,,
GeoTrust Global CA                                           CT,,
Equifax Secure Certificate Authority                         CT,,

クリーンアップ時間(オプション)

# Remove all unnecessary files since the db has the certs :)
rm -rf ~/.certs/google ~/.certs/geotrust ~/.certs/equifax ~/.certs/my_certs

# Now run a test to make sure mailx is sending correctly now (don't forget to change yourname@example.com to the email address you'd like to send to)
echo "Your message" | mail -s "Message Subject" yourname@example.com

それであるはずです、「認証のエラー:ピアの証明書発行者が認識されません」を受け取るべきではありません。もうエラー!

ノート:

あなたは私からディレクトリを変更したことに気づいたかもしれない/certs~/.certs。mailxはrootとして実行されるため、これらの変更をroot /として行っただけです。「〜/」は、HOMEディレクトリがすべてを~/.certs意味することを意味し/root/.certs/ます。あなたはそれを知っていると確信していますが、だれがこれを読んでいるかわからない場合に備えてねえ!

これが必要な場合に備えて、以下に追加した構成オプションを示します。 /etc/mail.rc

# /etc/mail.rc options added to the bottom
set smtp-use-starttls
set smtp-auth=login
set smtp=smtp://smtp.gmail.com:587
set from="your.from.user@gmail.com(Web01 Server)"
set smtp-auth-user=your.smtp.user@gmail.com
set smtp-auth-password=your.pass
set ssl-verify=ignore
set nss-config-dir=/root/.certs

your.from.user、your.smtp.user、およびyour.passをそれぞれの変数に必ず変更してください。


これが魅力のように機能したopteronsのおかげで、@ ndasusersが機能しなかった理由がわかりません。
アビシェークマダニ

電子メールサーバーが負荷分散され、クラスターとして実行されている場合、問題を解決する方法を知っている人はいますか?例:Office 365接続の最後のサーバーが接続ごとに変わるため、証明書は断続的にエラーを受け取ります。
ブラッド

これもまた時代遅れ-showcertsです。3つではなく2つの証明書を提供します。2つ目の証明書はGlobalSignのものです。それでも、この手順は唯一機能するため、+ 1:use -showcerts、その中のすべての証明書(現在2)を検索し、それらを個別にデータベースにインポートします。
EML

...と実行しopensslecho -n | openssl、入力を待ってハングotの、
EML

@ EML +またはopenssl s_client </dev/null。はい、2017年現在、Google(Gmailを含む)はGeoTrust / EquifaxのGIA2からGlobalSignのGIA3に切り替えました。ただし、チェーンのすべての証明書を保存する必要はありません。そして、犯罪者や詐欺師(おせっかいな政府のような)がgmailになりすます場合、この方法はそれらを信頼するだけでなく、永久にそうします-他のユーザーは不法に発行された証明書によって一時的にだまされるかもしれませんが、それが取り消されると彼らはそれを信頼しなくなります悪人にすべてのメールを送り続ける方法。
dave_thompson_085

0

このスレッドの返信に基づいて、現在のgmail smtp証明書を自動的にプル、解析、インストールする小さなスクリプトを作成しました。証明書の数が再び変更された場合に処理できる必要があります。

同様に、構文を強調したペーストビンがあります

#!/bin/bash

# This script pulls ssl certs for using gmail smtp. Adapted from the following config explaination:
# /server/498588/smtp-gmail-com-from-bash-gives-error-in-certificate-peers-certificate-issuer

certdirectory="/home/user/.certs"

# Functions

fail() {
    ec=$?
    [ "${ec}" == "0" ] && ec=1
    echo -e "FAILED[code=$ec]: $@"
    exit $ec
}

warn(){
echo -e "WARNING $@"
}

cleanup() {
  rm allgcert* || warn "Cleanup of files errored"
  rm gcert* || warn "Cleanup of files errored"
}

failclean() {
  cleanup
  fail "$@"
}

# Count number of certs currently being used (can change from time to time)
numcerts=$(echo -n | openssl s_client -showcerts -connect smtp.gmail.com:465 | grep -c "i:")

# Create the certs directory if it does not exist
mkdir -p $certdirectory || fail "Unable to create certificates directory"

# Pull certs to a local file for parsing
echo -n | openssl s_client -showcerts -connect smtp.gmail.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > allgcert || failclean "Unable to pull certs from smtp.gmail.com"

# Parses certs output based on the number of certs, and outputs to individual files
if (($numcerts > 1)) ; then
  # Pulls the first cert out as it needs one extra line
  sed '1,27!d' allgcert > gcert1
  # For subsequent certs, it multiplies the cert number by the number of lines in the file where it should exist
  for i in $(seq 2 $numcerts) ; do
    sed "$((2 + (((($i - 1)) * 26))))"','"$((1 + (($i * 26))))"'!d' allgcert > gcert${i}
  done
fi

# Parses out certificate issuer names for installation
echo -n | openssl s_client -showcerts -connect smtp.gmail.com:465 | grep i: | sed -e 's,.*=,,' > allgcertnames || failclean "Unable to output parsed names for certificates"

for i in $(seq 1 $numcerts) ; do
  certutil -A -n "$(sed -n ${i}p allgcertnames)" -t "TC,," -d $certdirectory -i gcert${i} || failclean "Unable to import certificates to database"
done

cleanup

上記のように、これは実行するのが間違っていますが、実行したい場合は、awkの1行で十分です:openssl s_client </dev/null -showcerts -connect ... | awk '/^ i:/{n=substr($0,7)} /-BEGIN/,/-END/{print>"t"} /-END/{close("t"); system("certutil -A -n \"" n "\" -t TC,, -i t -d certdir || echo failed; rm t")}'
dave_thompson_085

ああ、そのスクリプトを作成する前にあなたのコメントは見ませんでした。ありがとう!編集:ワンライナーを読み直した後、私のスクリプトとそのスクリプトの間に実際的な違いは見られません。基本的に、私のスクリプトのワンライナーバージョンを私に与えただけだと思います。永続的な信頼の問題がない、これを行うための推奨される「正しい方法」はありますか?
pyr0ball
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.