bash'tan smtp.gmail.com “Sertifikada hata: Eşin sertifika yayıncısı tanınmıyor.”


11

Bir sorun olduğunda yöneticime e-posta göndermek için komut dosyama ihtiyacım vardı ve şirket yalnızca Gmail kullanıyor. Birkaç gönderi talimatını izleyerek .mailrc dosyası kullanarak mailx ayarlayabildim. ilk nss-config-dir hatası oldu Ben bir firefox dizininden bazı .db dosyaları kopyalayarak çözüldü. için ./certs ve mailrc'de bunu hedefliyor. Bir posta gönderildi.

Ancak, yukarıdaki hata ortaya çıktı. Bazı mucizelerle, .db'de bir Google sertifikası vardı. Bu komutla ortaya çıktı:

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

Büyük olasılıkla yok sayılabilir, çünkü posta yine de çalıştı. Sonunda, biraz saç ve birçok google çektikten sonra, kendimi rahatsızlıktan nasıl kurtaracağımı öğrendim.

İlk olarak, mevcut sertifikayı bir ASSCII dosyasına aktarın:

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

Şimdi bu dosyayı yeniden içe aktarın ve SSL sertifikaları için güvenilir olarak işaretleyin, ala:

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

Bundan sonra, liste güvenilir olduğunu gösterir:

~]$ certutil -L -d certs

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

Ve mailx aksamadan gönderir.

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

Umarım hata ile yapılması gereken birine yardımcı olur.

Ayrıca, bazı şeyleri merak ediyorum.

Eğer tesadüfen mozilla veritabanında olmasaydı bu sertifikayı nasıl alabilirim? Mesela böyle bir şey var mı?

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

Yanıtlar:


13

İstediğim tek astar değil, ancak bir sertifikayı sıfırdan almak ve almak için:

# 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! ve bu biletin cevabı sayesinde


1
Yine "Sertifikada hata: Eşin sertifika yayıncısı tanınmadı" hatası alıyorum. Aldığım gmail sertifikasının süresi doldu, yenisinin zincirleme bir sertifika olduğu anlaşılıyor. openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nullhepsini görmek için.
spazm

1
Cevabı, yayıncı cer dosyasını indirmek için bir adımla güncelledi.
ndasusers


7

Bu yayının tekrar güncellenmesi gerekiyor. CentOS 7 kutumda mailx kurulumumla ilgili sorun yaşıyordum. E-posta gönderilecekti ancak "Sertifikalı: Eş'in sertifika yayıncısı tanınmadı" hatası alıyordu. hata.

Burada çözümü buldum, çevirmek zorunda kaldım.

İşte bunu yapmanın hızlı bir yolu:

# 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

Şimdi --BEGIN CERTIFICATE - ve --END CERTIFICATE - dahil olmak üzere her sertifikayı kopyalayın ve daha önce oluşturduğunuz ilgili dosyalara yapıştırın (google, geotrust, equifax) ve şimdi bu dosyaları kaydedin.

# 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

Şimdi bu sertifikaların her birini db'ye aktarmak zorundayız.

# 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

Örnek çıktı:

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

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

Temizleme süresi (isteğe bağlı)

# 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

Öyle olmalı, "Sertifikalı hata: Eşin sertifika yayıncısı tanınmıyor." artık hata!

Notlar:

Dir /certsdeğerini olarak değiştirdiğimi fark etmiş olabilirsiniz ~/.certs. mailx root olarak çalışıyor bu yüzden root /. "~ /" HOME dizini hepsini bir araya getirmek ~/.certsanlamına gelir /root/.certs/. Eminim bunu biliyordunuz ama hey, bunu kimin okuyabileceğini asla bilmiyorsanız!

Buna ihtiyacınız olması durumunda, alt kısmına eklediğim yapılandırma seçenekleri /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

.From.user ,.smtp.user ve your.pass öğelerini ilgili değişkenlerle değiştirdiğinizden emin olun.


Teşekkürler opterons bu cazibe gibi çalıştı, @ndasusers neden işe yaramadı bilmiyorum.
Abhishek Madhani

Herkes e-posta sunucuları yük dengeli ve küme olarak çalışırken sorunu çözmek için nasıl biliyor? Örneğin, Office 365 Bağlantının sonundaki sunucu bağlantıdan bağlantıya değiştiğinden sertifika zaman zaman bir hata alır.
Brad

Bu yine güncel -showcertsdeğil: 3 değil iki sertifika verir. İkincisi GlobalSign. Yine de, bu prosedür çalışan tek prosedürdür, bu yüzden +1: kullanın -showcerts, içindeki tüm sertifikaları bulun (şu anda 2) ve ayrı ayrı veritabanına alın.
EML

... ve koşmak opensslolarak echo -n | opensslbu giriş için bekleyen asılı ot,
EML

@ EML + veya openssl s_client </dev/null. Evet, 2017 itibariyle Google (gmail dahil) GeoTrust / Equifax altında GIA2'den GlobalSign altında GIA3'e geçti. Ancak zincirin tüm sertifikalarını depolamaya gerek yoktur. Ve herhangi bir suçlu veya sahtekâr (meraklı bir hükümet gibi) gmail'i taklit ederse, bu yöntem sadece onlara güvenmekle kalmaz, kalıcı olarak da yapar - diğer kullanıcılar gayri meşru olarak verilen bir sertifika tarafından geçici olarak kandırılabilir, ancak iptal edildiğinde buna güvenmeyi bırakabilirler. yöntemi ile tüm e-postalarınızı kötülüklere vermeye devam edin.
dave_thompson_085

0

Geçerli gmail smtp sertifikalarını otomatik olarak çekecek, ayrıştıracak ve yükleyecek bu konudaki yanıtlara dayalı küçük bir komut dosyası oluşturdum. Sertifika sayısı tekrar değişirse, bu durumla başa çıkabilmelidir.

İşte sözdizimi vurgulamalı bir macun

#!/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

Yukarıdaki gibi bu yanlış bir şey, ama bunu yapmak istiyorsanız awk bir satır yeterlidir: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 bu senaryoyu oluşturmadan önce yorumunu görmedim. Teşekkürler! Düzenleme: Tek satırınızı yeniden okuduktan sonra, senaryom ile bu arasında herhangi bir pratik fark görmüyorum. Bana sadece senaryomun tek satırlı sürümünü verdiğinizi varsayıyorum. Bunu yapmak için kalıcı bir güven sorunu olmayacak "doğru bir yol" var mı?
pyr0ball
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.