smtp.gmail.com з bash дає "Помилка в сертифікаті: емітент сертифіката Peer не розпізнається."


11

Мені потрібен мій сценарій, щоб надіслати електронну пошту адміністратору, якщо є проблеми, і компанія використовує лише Gmail. Виконуючи кілька інструкцій з публікацій, я зміг налаштувати mailx за допомогою файлу .mailrc. спочатку була помилка nss-config-dir, яку я вирішив, скопіювавши деякі .db файли з каталогу firefox. до ./certs та спрямований на це у mailrc. Був надісланий лист.

Однак виникла помилка. Якимсь дивом з’явився сертифікат Google у .db. Він показав цю команду:

~]$ 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,,

І поштова пошта надсилає без зачіпки.

~]$ /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
Я знову отримую помилку: "Помилка в сертифікаті: емітент сертифіката Peer не розпізнається." Термін дії сертифіката gmail, який я поглинув, закінчився, схоже, що новий сертифікат є ланцюжком. openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nullщоб переглянути їх усіх.
спазм

1
Оновіть відповідь з кроком для завантаження файлу церкви емітентів.
ndasusers


7

Цю публікацію потрібно оновити ще раз. У мене виникли проблеми з установкою пошти на вікно CentOS 7. Пошта буде надіслана, але я все одно отримував "Помилка сертифікованого: емітента сертифікату Peer не визнано". помилка.

Я знайшов рішення тут , довелося перекласти його.

Ось швидкий спосіб зробити це:

# 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

Це було б так, ви не повинні отримувати "Помилка сертифікованої: емітента сертифікату Peer не визнано." помилка більше!

Примітки:

Ви, можливо, помітили, що я поміняв режисера /certsна на ~/.certs. mailx працює як root, тому я просто вніс ці зміни як root /. «~ /» Означає домашній каталог покласти його всі разом ~/.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 на відповідні змінні.


Дякую оптеронам, це працювало як шарм, я не знаю, чому @ndasusers не працював.
Абхішек Мадхані

Хтось знає, як вирішити проблему, коли сервери електронної пошти збалансовані та завантажуються як кластер? наприклад, Office 365 Серт буде періодично отримувати помилку, оскільки сервер в кінці з'єднання змінюється від з'єднання до з'єднання.
Бред

Це знову застаріло: -showcertsдає два сертифікати, а не 3. Другий - GlobalSign. Але ця процедура є єдиною, яка працює, тому +1: використовуйте -showcerts, знайдіть у ній усі сертифікати (зараз 2) та імпортуйте їх окремо в базу даних.
EML

... і біжи opensslяк echo -n | openssl, від нього висить очікування введення
EML

@ EML + або openssl s_client </dev/null. Так, станом на 2017 рік Google (включаючи gmail) перейшов з GIA2 під GeoTrust / Equifax на GIA3 під GlobalSign. Але не потрібно зберігати всі церти ланцюга. І якщо будь-який злочинець чи самозванець (як урядовий уряд) видає себе за Gmail, цей метод не тільки довіряє їм, але робить це постійно - інші користувачі можуть тимчасово обдурити незаконно виданий сертифікат, але коли його скасують, вони перестануть довіряти йому, тоді як з цим методом ви продовжуєте надавати всю електронну пошту лиходіям.
dave_thompson_085

0

Я створив невеликий сценарій на основі відповідей у ​​цій темі, який автоматично витягує, розбирає та встановлює поточні сертифікатори smtp gmail. Він повинен мати можливість це впоратися, якщо кількість цертів знову зміниться.

Ось також пастабін із виділенням синтаксису

#!/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: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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.