smtp.gmail.com dari bash memberikan "Kesalahan dalam sertifikat: Penerbit sertifikat rekan tidak dikenali."

11

Saya perlu skrip saya untuk mengirim email ke admin jika ada masalah, dan perusahaan hanya menggunakan Gmail. Mengikuti beberapa tulisan, saya dapat mengatur mailx menggunakan file .mailrc. pertama-tama ada kesalahan nss-config-dir yang saya pecahkan dengan menyalin beberapa file .db dari direktori firefox. ke ./certs dan mengarahkannya ke mailrc. Email telah dikirim.

Namun, kesalahan di atas muncul. Dengan suatu keajaiban, ada sertifikat Google di .db. Itu muncul dengan perintah ini:

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

Kemungkinan besar, itu bisa diabaikan, karena surat tetap berfungsi. Akhirnya, setelah mencabut rambut dan banyak googles, saya menemukan cara untuk menghilangkan diri dari gangguan.

Pertama, ekspor sertifikat yang ada ke file ASSCII:

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

Sekarang impor kembali file itu, dan tandai sebagai dipercaya untuk sertifikat SSL, ala:

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

Setelah ini, listing menunjukkan tepercaya:

~]$ certutil -L -d certs

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

Dan mailx mengirim tanpa hambatan.

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

Saya harap ini membantu bagi seseorang yang ingin melakukan kesalahan.

Juga, saya ingin tahu tentang sesuatu.

Bagaimana saya bisa mendapatkan sertifikat ini, jika tidak ada dalam database mozilla secara kebetulan? Apakah ada misalnya, sesuatu seperti ini?

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

Jawaban:

13

Ya, itu bukan liner yang saya inginkan, tetapi ini adalah cara mengambil dan mengimpor sertifikat dari awal:

# 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,,  

Yaa! dan terima kasih atas jawaban di tiket ini

ndasusers
sumber
1
Saya mendapatkan kesalahan lagi, "Kesalahan dalam sertifikat: Penerbit sertifikat rekan tidak dikenali.". Sertifikat gmail yang saya telan telah kedaluwarsa, sepertinya yang baru adalah sertifikat berantai. openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nulluntuk melihat semuanya.
spazm
1
Memperbarui jawabannya dengan langkah untuk mengunduh file cer emiten.
ndasusers
Berkat tiket ini
ndasusers
7

Posting ini perlu diperbarui lagi. Saya mengalami masalah dengan pemasangan mailx pada kotak CentOS 7 saya. Mail akan mengirim tetapi saya masih menerima "Kesalahan dalam sertifikasi: Penerbit sertifikat rekan tidak dikenali." kesalahan.

Saya menemukan solusinya di sini , harus menerjemahkannya.

Ini cara cepat untuk melakukannya:

# 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

Sekarang salin setiap sertifikat termasuk --BEGIN CERTIFICATE-- dan --END CERTIFICATE-- dan tempelkan ke masing-masing file yang Anda buat sebelumnya (google, geotrust, equifax) dan sekarang simpan file-file itu.

# 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

Sekarang kita harus mengimpor masing-masing sertifikat ini ke 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

Contoh output:

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

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

Waktu pembersihan (opsional)

# 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 [email protected] to the email address you'd like to send to)
echo "Your message" | mail -s "Message Subject" yourname@example.com

Seharusnya begitu, Anda seharusnya tidak menerima "Kesalahan dalam sertifikasi: Penerbit sertifikat rekan tidak dikenali." kesalahan lagi!

Catatan:

Anda mungkin memperhatikan bahwa saya mengubah dir dari /certsmenjadi ~/.certs. mailx berjalan sebagai root jadi saya hanya membuat perubahan ini sebagai root /. "~ /" Berarti direktori HOME menempatkan semuanya bersama-sama ~/.certsberarti /root/.certs/. Saya yakin Anda tahu itu, tapi hei kalau-kalau Anda tidak pernah tahu siapa yang mungkin membaca ini!

Jika Anda membutuhkan ini, berikut adalah opsi konfigurasi yang saya tambahkan di bagian bawah /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="[email protected](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

Pastikan untuk mengubah pengguna.from.user, pengguna.smtp.user Anda, dan pass Anda ke variabel masing-masing.

opteron
sumber
Terima kasih opteron ini berfungsi seperti mantra, saya tidak tahu mengapa @ndasusers tidak berfungsi.
Abhishek Madhani
Adakah yang tahu bagaimana menyelesaikan masalah ini ketika server email dimuat secara seimbang dan dijalankan sebagai sebuah cluster? misalnya Office 365 Cert akan sebentar-sebentar mendapatkan kesalahan karena server di akhir koneksi berubah dari koneksi ke koneksi.
Brad
Ini sudah kedaluwarsa lagi: -showcertsmemberikan dua sertifikat, bukan 3. Yang kedua adalah yang GlobalSign. Namun, prosedur ini adalah satu-satunya yang berfungsi, jadi +1: gunakan -showcerts, temukan semua sertifikat di dalamnya (saat ini 2), dan impor secara individual ke dalam basis data.
EML
... dan jalankan opensslsebagai echo -n | openssl, ot itu hang menunggu masukan
EML
@ EML + atau openssl s_client </dev/null. Ya, mulai 2017 Google (termasuk gmail) beralih dari GIA2 di bawah GeoTrust / Equifax ke GIA3 di bawah GlobalSign. Tetapi tidak perlu menyimpan semua sertifikat rantai. Dan jika ada penjahat atau penipu (seperti pemerintah usil) meniru gmail, metode ini tidak hanya mempercayai mereka tetapi juga secara permanen - pengguna lain mungkin untuk sementara waktu dibodohi oleh sertifikat yang dikeluarkan secara tidak sah tetapi ketika dicabut mereka berhenti mempercayainya sedangkan dengan ini metode Anda terus memberikan semua email Anda kepada pelaku kejahatan.
dave_thompson_085
0

Saya membuat skrip kecil, berdasarkan balasan di utas ini, yang secara otomatis akan menarik, mengurai, dan menginstal sertifikat smtp gmail saat ini. Seharusnya bisa menanganinya jika jumlah sertifikat berubah lagi.

Berikut adalah pastebin dengan penyorotan sintaks juga

#!/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
pyr0ball
sumber
Seperti di atas ini adalah hal yang salah untuk dilakukan, tetapi jika Anda ingin melakukannya satu baris awk sudah cukup: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
Ah saya tidak melihat komentar Anda sebelum membuat skrip itu. Terima kasih! Sunting: setelah membaca ulang liner Anda, saya tidak melihat perbedaan praktis antara skrip saya dan yang itu. Saya berasumsi Anda baru saja memberi saya pada dasarnya versi satu-baris dari skrip saya. Apakah ada "cara yang tepat" yang direkomendasikan untuk melakukan ini yang tidak akan memiliki masalah kepercayaan permanen?
pyr0ball