smtp.gmail.com จาก bash ให้“ ข้อผิดพลาดในใบรับรอง: ไม่รู้จักผู้ออกใบรับรองของเพียร์”


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

เป็นไปได้มากที่จะสามารถเพิกเฉยได้เพราะจดหมายทำงานอยู่ดี ในที่สุดหลังจากดึงผมและ googles จำนวนมากฉันพบวิธีกำจัดตัวเองจากความรำคาญ

ขั้นแรกให้ส่งออกใบรับรองที่มีอยู่ไปยังไฟล์ 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
~]$

ฉันหวังว่าจะเป็นประโยชน์กับคนที่ต้องการแก้ไขข้อผิดพลาด

นอกจากนี้ฉันอยากรู้เกี่ยวกับสิ่งที่

ฉันจะได้รับใบรับรองนี้ได้อย่างไรถ้ามันไม่ได้อยู่ในฐานข้อมูลโมซิลล่าโดยบังเอิญ? มีตัวอย่างอะไรแบบนี้ไหม

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

Yaa! และขอบคุณคำตอบสำหรับตั๋วนี้


1
ฉันได้รับข้อผิดพลาดอีกครั้ง "ข้อผิดพลาดในใบรับรอง: ไม่รู้จักผู้ออกใบรับรองของเพียร์" ใบรับรอง gmail ที่ฉันกลืนเข้าไปหมดอายุแล้วดูเหมือนว่าใบรับรองใหม่นั้นเป็นใบรับรองแบบมีสาย openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/nullเพื่อดูพวกเขาทั้งหมด
spazm

1
อัปเดตคำตอบพร้อมขั้นตอนในการดาวน์โหลดไฟล์ cer ของผู้ออก
ndasusers

ขอบคุณตั๋วนี้
ndasusers

7

โพสต์นี้จะต้องมีการปรับปรุงอีกครั้ง ฉันมีปัญหากับการติดตั้ง mailx บนกล่อง CentOS 7 จดหมายจะส่ง แต่ฉันยังคงได้รับ "ข้อผิดพลาดที่ได้รับการรับรอง: ผู้ออกใบรับรองของเพื่อนไม่เป็นที่รู้จัก" ความผิดพลาด

ฉันพบวิธีแก้ปัญหาที่นี่ต้องแปลมัน

นี่เป็นวิธีที่รวดเร็วในการทำ:

# 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

ตอนนี้เราต้องนำเข้าแต่ละ certs เหล่านี้ลงใน 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

อย่างนั้นคุณไม่ควรได้รับ "ข้อผิดพลาดที่ได้รับการรับรอง: ไม่รู้จักผู้ออกใบรับรองของเพียร์" ข้อผิดพลาดอีกต่อไป!

หมายเหตุ:

คุณอาจจะได้สังเกตเห็นว่าผมเปลี่ยน dir จากไป/certs ~/.certsmailx ทำงานเป็นรูทดังนั้นฉันเพิ่งทำการเปลี่ยนแปลงเหล่านี้ในฐานะรูท / "~ /" หมายถึงไดเรกทอรีบ้านวางไว้ด้วยกันหมายถึง~/.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 ไม่ทำงาน
Abhishek Madhani

ใครรู้วิธีแก้ปัญหาเมื่อเซิร์ฟเวอร์อีเมลโหลดสมดุลและทำงานเป็นกลุ่มหรือไม่ เช่น Office 365 ใบรับรองจะได้รับข้อผิดพลาดเป็นระยะเนื่องจากเซิร์ฟเวอร์เมื่อสิ้นสุดการเชื่อมต่อเปลี่ยนจากการเชื่อมต่อเป็นการเชื่อมต่อ
แบรด

สิ่งนี้ล้าสมัยอีกครั้ง: -showcertsให้ใบรับรองสองฉบับไม่ใช่ 3 ใบรับรองที่สองคือ GlobalSign อย่างไรก็ตามขั้นตอนนี้เป็นวิธีเดียวที่ใช้งานได้ดังนั้น +1: ใช้-showcertsค้นหาใบรับรองทั้งหมดที่อยู่ในนั้น (ปัจจุบัน 2) และนำเข้าใบรับรองแต่ละรายการ
EML

... และทำงานopensslเป็นecho -n | opensslot มันแขวนรอการป้อนข้อมูล
EML

@ EML + openssl s_client </dev/nullหรือ ใช่ตั้งแต่ปี 2017 Google (รวมถึง gmail) เปลี่ยนจาก GIA2 ภายใต้ GeoTrust / Equifax เป็น GIA3 ภายใต้ GlobalSign แต่ไม่จำเป็นต้องเก็บทุกห่วงโซ่ไว้ และถ้ามีอาชญากรหรือผู้หลอกลวง (เช่นรัฐบาลที่มีจมูกยาว) ปลอมตัวเป็น Gmail วิธีการนี้ไม่เพียง แต่เชื่อถือ แต่ทำอย่างถาวร - ผู้ใช้รายอื่นอาจถูกหลอกโดยใบรับรองที่ออกโดยไม่ชอบด้วยกฎหมายชั่วคราว แต่เมื่อถูกเพิกถอนพวกเขาก็หยุดไว้วางใจ วิธีการที่คุณให้อีเมลของคุณต่อผู้กระทำผิดต่อไป
dave_thompson_085

0

ฉันสร้างสคริปต์เล็กน้อยขึ้นอยู่กับการตอบกลับในเธรดนี้ซึ่งจะดึงแยกวิเคราะห์และติดตั้ง gmail smtp certs ปัจจุบันโดยอัตโนมัติ มันควรจะสามารถจัดการได้ถ้าจำนวนของ certs เปลี่ยนแปลงอีกครั้ง

นี่คือ pastebin ที่มีการเน้นไวยากรณ์เช่นกัน

#!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.