openssl verify를 사용하여 인증서 체인 확인


128

다음 구성 요소로 자체 인증서 체인을 작성 중입니다.

Root Certificate - Intermediate Certificate - User Certificate

루트 인증서는 자체 서명 된 인증서이며, 중간 인증서는 루트에 의해, 사용자는 중간에 의해 서명됩니다.

이제 사용자 인증서에 루트 인증서로 앵커가 있는지 확인하고 싶습니다.

openssl verify -verbose -CAfile RootCert.pem Intermediate.pem

확인은 괜찮습니다. 다음 단계에서는 사용자 인증서를

openssl verify -verbose -CAfile Intermediate.pem UserCert.pem

그리고 검증 쇼

error 20 at 0 depth lookup:unable to get local issuer certificate

뭐가 잘못 되었 니?

답변:


164

에서 verify문서 :

자체 발급자 인 인증서가 발견되면 루트 CA로 간주됩니다.

다시 말해, 루트 CA는 작동 확인을 위해 자체 서명해야합니다. 이것이 두 번째 명령이 작동하지 않은 이유입니다. 대신 이것을 시도하십시오 :

openssl verify -CAfile RootCert.pem -untrusted Intermediate.pem UserCert.pem

단일 명령으로 전체 체인을 확인합니다.


2
최근 에이 작업을 수행해야했기 때문에이 답변에 투표를했고로 나열된 다른 옵션을 시도한 후 매개 변수가 중간 인증서를 지정할 때 사용하는 올바른 매개 변수 man verify라는 것을 알았습니다 -untrusted.
Anthony Geoghegan 2012

두 번째 대답 : stackoverflow.com/a/31205833/173062 가 더 정확 하다고 생각합니다 . 인증서 체인을 -CAfile 매개 변수에 전달합니다.
Glenjamin

2
-untrusted인증서 체인이 완전히 유효한지 확인하지 않습니다. -CAfile다른 질문에서 알 수 있듯이 중간 및 루트를 모두 명령에 전달하십시오 .
Envek

2
다음과 같은 상황이 발생하면 Intermediate.pem에 대해 -untrusted를 사용하십시오. mail.python.org/pipermail/cryptography-dev/2016-August/…
Greg Smethells

2
그것은 OP가 요구 한 것이 아니지만 자체 서명되지 않은 체인을 확인하려는 경우 자신의 시스템 대신 시스템 / 브라우저 CA 파일을 사용하십시오. 예를 들어 homebrew에서 openssl을 사용하는 OS X의 경우 :openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
Greg Dubicki

50

그것은 몇 가지 합법적 인 직업 중 하나입니다 cat.

openssl verify -verbose -CAfile <(cat Intermediate.pem RootCert.pem) UserCert.pem

최신 정보:

Greg Smethells가 주석에서 지적한 것처럼 이 명령은 암시 적으로 Intermediate.pem을 신뢰합니다 . 나는 그레그 참조 게시물 의 첫 부분을 읽는 것이 좋습니다 (두 번째 부분은 특히 pyOpenSSL에 관한 것이며이 질문과 관련이 없습니다).

게시물이 사라지면 중요한 단락을 인용하겠습니다.

불행히도 실제로 루트 / 자체 서명 된 "중간"인증서는 위에 제공된 권장 명령을 사용할 때 신뢰할 수있는 CA로 취급됩니다 .

$ openssl verify -CAfile <(cat geotrust_global_ca.pem rogue_ca.pem) fake_sometechcompany_from_rogue_ca.com.pem fake_sometechcompany_from_rogue_ca.com.pem : 확인

openssl은 루트 인증서가 발견되는 즉시 체인 확인을 중지하는 것으로 보이며 자체 서명 된 경우 Intermediate.pem 일 수도 있습니다. 이 경우 RootCert.pem은 고려되지 않습니다. 따라서 위 명령에 의존하기 전에 Intermediate.pem이 신뢰할 수있는 소스에서 제공되는지 확인하십시오.


이것이 실제로 루트 인증서에 대한 중간 인증서를 확인합니까?
augurar

그렇습니다. 나는 올바른 체인 (내 고용주에게 생산 트래픽을 제공함)으로 명령을 다시 실행 한 다음 관련이없는 다른 루트 인증서로 다시 실행합니다. 성적표 참조 .
피터

8
경고 : Intermediate.pem을 전혀 신뢰할 수없는 경우에는 사용 하지 마십시오 . 자세한 내용은 여기를 참조하십시오 : mail.python.org/pipermail/cryptography-dev/2016-August/…
Greg Smethells

1
지적 해줘서 고마워, 그렉 답변을했을 때 발행인 홈페이지에서 근본과 중간체를 모두 다운로드했기 때문에 생각이 나에게 발생하지 않았습니다. 중간체 가이 명령으로 암시 적으로 신뢰된다는 것을 분명히하기 위해 대답을 업데이트했습니다.
Peter

1
@somenickname, Tony의 의견을 참조하십시오. 어쨌든 -unrusted 옵션이 선호됩니다. 추가 도움이 필요하면 직접 질문하십시오. 의견은 문제를 디버깅하기에 적합한 장소가 아닙니다.
피터

17

문제는 그 일을 openssl -verify하지 않는 것입니다.

Priyadi가 언급 한 바와 같이 , openssl -verify종종 중간 인증서가 자체 서명 한, 따라서 당신이 정말로 체인을 확인하지, 첫 번째 자체 서명 된 인증서에서 멈 춥니 다.

생산적인 웹 서비스에 인증서 파일을 설치하기 전에 인증서 파일이 올바른지 101 % 확신한다고 가정합니다. 이 레시피는 여기서 사전 비행 점검을 정확하게 수행합니다.

주의하시기 바랍니다 베드로의 대답이 올바른지 ,의 그러나 출력은 openssl -verify모든 것을 단서없는 정말 이후 작품. 예, 문제가있을 수 있지만 전부는 아닙니다.

다음은 인증서 체인을 Apache에 설치하기 전에 인증서 체인을 확인하는 작업을 수행하는 스크립트입니다. 아마도 이것은 좀 더 신비한 OpenSSL 마술로 향상 될 수 있지만 OpenSSL 전문가가 아니며 다음과 같은 작품입니다.

#!/bin/bash
# This Works is placed under the terms of the Copyright Less License,
# see file COPYRIGHT.CLL.  USE AT OWN RISK, ABSOLUTELY NO WARRANTY. 
#
# COPYRIGHT.CLL can be found at http://permalink.de/tino/cll
# (CLL is CC0 as long as not covered by any Copyright)

OOPS() { echo "OOPS: $*" >&2; exit 23; }

PID=
kick() { [ -n "$PID" ] && kill "$PID" && sleep .2; PID=; }
trap 'kick' 0

serve()
{
kick
PID=
openssl s_server -key "$KEY" -cert "$CRT" "$@" -www &
PID=$!
sleep .5    # give it time to startup
}

check()
{
while read -r line
do
    case "$line" in
    'Verify return code: 0 (ok)')   return 0;;
    'Verify return code: '*)    return 1;;
#   *)  echo "::: $line :::";;
    esac
done < <(echo | openssl s_client -verify 8 -CApath /etc/ssl/certs/)
OOPS "Something failed, verification output not found!"
return 2
}

ARG="${1%.}"
KEY="$ARG.key"
CRT="$ARG.crt"
BND="$ARG.bundle"

for a in "$KEY" "$CRT" "$BND"
do
    [ -s "$a" ] || OOPS "missing $a"
done

serve
check && echo "!!! =========> CA-Bundle is not needed! <========"
echo
serve -CAfile "$BND"
check
ret=$?
kick

echo
case $ret in
0)  echo "EVERYTHING OK"
    echo "SSLCertificateKeyFile $KEY"
    echo "SSLCertificateFile    $CRT"
    echo "SSLCACertificateFile  $BND"
    ;;
*)  echo "!!! =========> something is wrong, verification failed! <======== ($ret)";;
esac

exit $ret

출력 후주의 EVERYTHING OK사용하는 사람들 때문에 아파치 설정이며, NginX또는 haproxy일반적으로 읽고, 너무 완벽이 이해할 수 있습니다)

이것에 대한 GitHub Gist 가 있습니다.

이 스크립트의 전제 조건 :

  • /etc/ssl/certs평소 와 같이 신뢰할 수있는 CA 루트 데이터가 있습니다 (예 : Ubuntu).
  • DIR3 개의 파일을 저장 하는 디렉토리를 작성하십시오 .
    • DIR/certificate.crt 인증서가 들어있는
    • DIR/certificate.key 여기에는 웹 서비스의 비밀 키가 포함되어 있습니다 (암호 없음)
    • DIR/certificate.bundle여기에는 CA 번들이 포함됩니다. 번들을 준비하는 방법은 아래를 참조하십시오.
  • 이제 스크립트를 실행하십시오 : ./check DIR/certificate(스크립트의 이름 check이 현재 디렉토리에 있다고 가정합니다 )
  • 스크립트가 출력되는 경우는 거의 없습니다 CA-Bundle is not needed. 이는 귀하 (읽기 /etc/ssl/certs/:)가 이미 서명 인증서를 신뢰 함을 의미 합니다. 그러나 이것은 WWW에는 거의 없을 것입니다.
  • 이 테스트 포트 4433은 워크 스테이션에서 사용하지 않아야합니다. 그리고 포트 4433이 대중에게 곧 열리기 때문에 안전한 환경에서만 실행하는 것이 좋습니다. 이로 인해 적대적인 환경에서 외부 연결이 발생할 수 있습니다.

certificate.bundle파일 을 만드는 방법 ?

WWW에서 트러스트 체인은 일반적으로 다음과 같습니다.

  • 의 신뢰할 수있는 인증서 /etc/ssl/certs
  • 알 수없는 중간 인증서, 다른 CA에서 서명 한 크로스 인증서
  • 당신의 증명서 ( certificate.crt)

이제 평가는 아래에서 위로 진행됩니다. 즉, 먼저 인증서를 읽은 다음 알 수없는 중간 인증서가 필요하고 교차 서명 인증서가 필요한 /etc/ssl/certs경우 적절한 신뢰할 수있는 인증서를 찾기 위해 문의합니다.

ca 번들은 올바른 처리 순서로 정확하게 구성해야합니다. 즉, 첫 번째로 필요한 인증서 (인증서에 서명하는 중간 인증서)가 번들에서 먼저 나옵니다. 그런 다음 교차 서명 인증서가 필요합니다.

일반적으로 CA (인증서에 서명 한 기관)는 해당 ca 번들 파일을 이미 제공합니다. 그렇지 않은 경우 필요한 모든 중간 인증서와 cat단일 파일 (UNIX의 경우)을 함께 선택해야합니다 . Windows에서는 (와 같은 notepad.exe) 텍스트 편집기를 열고 인증서를 파일에 붙여 넣을 수 있습니다.

또 다른 것이 있습니다. 파일은 PEM 형식이어야합니다. 일부 CA는 DER (2 진) 형식을 발행합니다. PEM은 쉽게 알아볼 수 있습니다. ASCII로 읽을 수 있습니다. 무언가를 PEM으로 변환하는 방법에 대한 내용은 .crt를 .pem으로 변환 하고 노란색 벽돌 길을 따르는 방법을 참조하십시오 .

예:

당신은 :

  • intermediate2.crt 귀하의 서명 한 중간 증명서 certificate.crt
  • intermediate1.crt 노래 한 또 다른 중간 증명서 intermediate2.crt
  • crossigned.crt 다른 CA의 서명 인증서 인 서명 한 intermediate1.crt
  • crossintermediate.crt서명 한 다른 CA와 다른 중간체입니다 crossigned.crt(아마도 그런 것을 보지 못할 것입니다)

그런 다음 적절한 내용 cat은 다음과 같습니다.

cat intermediate2.crt intermediate1.crt crossigned.crt crossintermediate.crt > certificate.bundle

어떤 파일이 필요한지 어떤 순서로 알 수 있습니까?

실험이 끝날 때까지 check모든 것이 정상임을 알 수 있습니다. 수수께끼를 해결하는 컴퓨터 퍼즐 게임과 같습니다. 마다. 단일. 시각. 전문가조차도. 그러나 이렇게 할 때마다 더 나아질 것입니다. 따라서 당신은 모든 고통을 겪고있는 것이 확실하게 혼자가 아닙니다. SSL이야, 알아? SSL은 아마도 30 년 이상의 전문 시스템 관리에서 본 최악의 디자인 중 하나 일 것입니다. 지난 30 년 동안 암호 화폐가 왜 주류가되지 않았는지 궁금한 적이 있습니까? 그 이유입니다. '그런가 말했다.


downvoter에게 : 내 대답에 어떤 문제가 있는지 설명해주세요. 감사.
Tino

2
나는 downvoters 중 하나입니다. downvote의 원인은 다음과 같습니다. "어떤 파일이 필요한지, 어떤 순서로 어떤지 알 수있는 방법은? SSL이 특별한 경우라고 생각하지 않습니다. 이와 같은 문제에는 결정적인 솔루션이 있어야합니다.
ychaouche

2
@ychaouche 감사합니다! 당신처럼 나는 결정론적인 것을 좋아합니다. 문제는 "무엇입니까"와 "openssl verify"를 사용하여 수행하는 방법이었습니다. 우리가 스택 오버 플로우를 진행하면서 프로그래밍 방식 (따라서 결정 론적) 예 / 아니오 대답이 이어졌습니다. 새 번들을 프로덕션에 설치하기 전에이를 자동으로 확인하는 데 사용할 수도 있습니다. 이것은 질문에 완전히 대답합니다. 당신이 싫어하는 것은 "적절한 번들을 만드는 방법"에 대한 좌절에 대해 이야기했다는 것입니다. 나는 그것에 대한 짧은 결정 론적 대답이있을 수 없다고 생각하기 때문에, 이것에 대한 대답은 여기의 맥락에서 주제가 아닐 것입니다.
Tino

6
"Pryyadi가 언급했듯이 openssl -verify는 첫 번째 자체 서명 된 인증서에서 중지되므로 중간 인증서가 자체 서명 된 것처럼 체인을 실제로 확인하지는 않습니다." 분명히 중간 인증서는 자체 서명되지 않습니다 (루트 인증서 인 경우). 그리고 검증의 요점은 체인에있는 모든 인증서를 신뢰할 수있는 루트 인증서까지 모두 포함했는지 확인하는 것입니다. 이것이 바로 openssl verify의 기능입니다. 그러나 openssl은 신뢰 정책에 다소 보수적 인 경향이 있습니다 ...
Timo

4
"중간 인증서는 종종 자체 서명됩니다". 이것은 잘못된 것이며, 이와 같은 용어 혼동으로 인해 새로 온 사람들이 올바른 방법으로 설명 할 때 실제로는 간단한 주제를 이해하기가 어렵습니다. RFC 5280에서 : "[...] CA 인증서는 세 가지 클래스, 즉 상호 인증서, 자체 발급 인증서 및 자체 서명 인증서로 세분 될 수 있습니다. 크로스 인증서는 발급자와 주체가 서로 다른 CA 인증서입니다. 상호 인증서는 두 CA 간의 신뢰 관계를 설명합니다. [...] ".
Dr. Jan-Philip Gehrcke

8

letencrypt 인증서를 확인해야했고 다음과 같이했습니다.

  1. 에서 루트 인증서와 중간 인증서를 다운로드하십시오. letsencrypt 신뢰 체인 .
  2. 이 명령을 발행하십시오.

    $ openssl verify -CAfile letsencrypt-root-cert/isrgrootx1.pem.txt -untrusted letsencrypt-intermediate-cert/letsencryptauthorityx3.pem.txt /etc/letsencrypt/live/sitename.tld/cert.pem 
    /etc/letsencrypt/live/sitename.tld/cert.pem: OK
    

1
글쎄요, 존은 내가 고맙다는 말을 좋아하지 않는 것 같습니다. 나는 "감사합니다"라고 주장하기 때문에 삭제 된 텍스트는 다음과 같습니다. letencrypt 인증서에 도움이되기를 바랍니다. Priyadi에게 감사합니다. 솔루션이이 명령을 찾는 데 도움이되었습니다. 그의 솔루션을 공감하십시오.
Michael

5

SSL 인증서에 대한 사전 지식없이 하루 종일 똑같은 문제를 겪은CERTivity Keystores Manager를 다운로드했습니다. 키 저장소를 가져와 인증서 체인을 명확하게 시각화했습니다.

스크린 샷 :

여기에 이미지 설명을 입력하십시오


1
사용 방법에 관한 질문에 대답하지 않습니다 openssl verify.
binki

예. 그러나 이러한 종류의 도구를 사용하면 openssl 명령 줄 도구의 암호 정보를 이해하지 못하는 경우 해당 종류의 정보를 시각화 할 수 있습니다.
David 天宇 Wong

2

당신이 해당 확인하려면 발행자UserCert.pem 실제로있다 Intermediate.pem (예를 들어 용도 : 다음을 수행하십시오 OpenSSL 1.1.1) :

openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem

그리고 당신은 얻을 것이다 :

UserCert.pem: OK

또는

UserCert.pem: verification failed

openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem3.7에서 동등한 명령이 있습니까?
보고타

-5

openssl을 사용하여 인증서 체인을 쉽게 확인할 수 있습니다. 전체 체인에는 CA 인증서가 포함되므로 CA 및 인증서 자체에 대한 세부 정보를 볼 수 있습니다.

openssl x509 -in fullchain.pem-텍스트 -noout


4
1) 이것은 전혀 설명이 필요 없습니다. 2) 이것은 어떤 상황도없이 질문자가 묻지 않은 질문에 대한 답변입니다.
Shadur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.