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 인증서에 대해 신뢰할 수있는 것으로 표시하십시오.

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

야아! 이 티켓에 대한 답변 덕분에


1
"인증서 오류 : 피어의 인증서 발급자가 인식되지 않습니다."라는 오류가 다시 나타납니다. 내가 입수 한 Gmail 인증서가 만료되었습니다. 새 인증서가 체인 인증서 인 것 같습니다. openssl s_client -showcerts -connect smtp.gmail.com:465 </dev/null그들 모두를 볼 수 있습니다.
spazm

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

"인증 오류 : 피어의 인증서 발급자가 인식되지 않습니다."라는 메시지가 표시되지 않아야합니다. 더 이상 오류!

노트:

dir을에서 (으) /certs로 변경 한 것을 알 수 있습니다 ~/.certs. mailx는 루트로 실행되므로 방금 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

from.user, your.smtp.user 및 your.pass를 각각의 변수로 변경하십시오.


고맙습니다 opterons이 매력처럼 작동했지만 @ndasusers가 작동하지 않은 이유를 모르겠습니다.
Abhishek Madhani

전자 메일 서버의 부하가 분산되어 클러스터로 실행될 때이 문제를 해결하는 방법을 아는 사람이 있습니까? 예 : Office 365 연결 끝의 서버가 연결에서 연결로 변경되므로 인증서에 간헐적으로 오류가 발생합니다.
브래드

이것은 구식입니다. -showcerts3이 아닌 두 개의 인증서를 제공합니다. 두 번째는 GlobalSign 인증서입니다. 여전히이 절차는 작동하는 유일한 절차이므로 +1 : use -showcerts, 인증서를 모두 찾아서 (현재 2) 개별적으로 데이터베이스로 가져옵니다.
EML

... 실행 openssl으로 echo -n | openssl는 입력을 기다리는 중단 하다며,
EML

@ EML + 또는 openssl s_client </dev/null. 예, 2017 년 현재 Google (gmail 포함)은 GeoTrust / Equifax의 GIA2에서 GlobalSign의 GIA3으로 전환되었습니다. 그러나 체인의 모든 인증서를 저장할 필요는 없습니다. 그리고 어떤 범죄자 또는 사기꾼 (예 : 코가 많은 정부)이 gmail을 가장하는 경우이 방법은 gmail을 신뢰하는 것이 아니라 영구적으로 수행합니다. 방법을 사용하면 모든 이메일을 계속 악인에게 전달합니다.
dave_thompson_085

0

이 스레드의 답글을 기반으로 현재 gmail smtp 인증서를 자동으로 가져오고 구문 분석하고 설치하는 작은 스크립트를 만들었습니다. 인증서 수가 다시 변경되면 처리 할 수 ​​있어야합니다.

구문 강조 표시가있는 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")}'
줄이면

아 스크립트를 작성하기 전에 당신의 의견을 보지 못했습니다. 감사! 편집 : 하나의 라이너를 다시 읽은 후에 스크립트와 스크립트 사이에 실질적인 차이가 보이지 않습니다. 나는 당신이 기본적으로 내 스크립트의 한 줄짜리 버전을 제공했다고 가정합니다. 영구적 인 신뢰 문제가없는 권장 "올바른 방법"이 있습니까?
pyr0ball
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.