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.