CLI 도구를 사용하여 원격 SSL 인증서 세부 사항 표시


187

Chrome에서 녹색 HTTPS 잠금 아이콘을 클릭하면 인증서 세부 정보가 포함 된 창이 열립니다.

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

cURL로 동일하게 시도했을 때 몇 가지 정보 만 얻었습니다.

$ curl -vvI https://gnupg.org
* Rebuilt URL to: https://gnupg.org/
* Hostname was NOT found in DNS cache
*   Trying 217.69.76.60...
* Connected to gnupg.org (217.69.76.60) port 443 (#0)
* TLS 1.2 connection using TLS_DHE_RSA_WITH_AES_128_CBC_SHA
* Server certificate: gnupg.org
* Server certificate: Gandi Standard SSL CA
* Server certificate: UTN-USERFirst-Hardware
> HEAD / HTTP/1.1
> User-Agent: curl/7.37.1
> Host: gnupg.org
> Accept: */*

전체 인증서 정보를 명령 줄 도구 (cURL 또는 기타)로 얻는 방법에 대한 아이디어가 있습니까?



아마도 버전에 따라 다를 수 있습니다. curl플래그 --verbose가있는 현재 는 전체 서버 인증서 내용을 보여줍니다.
Patrick Mevzek

답변:


263

다음과 같은 목적으로 OpenSSL을 사용할 수 있어야합니다.

echo | openssl s_client -showcerts -servername gnupg.org -connect gnupg.org:443 2>/dev/null | openssl x509 -inform pem -noout -text

이 명령은 원하는 웹 사이트에 연결하고 PEM 형식의 인증서를 세부 정보를 읽고 구문 분석하는 다른 openssl 명령에 파이프합니다.

( SNI 지원을 요청 -servername하려면 "중복" 매개 변수가 필요합니다 openssl.)


이 명령에 오류가있는 것 같습니다 :OpenSSL> openssl:Error: 'CONNECTED(00000003)' is an invalid command.
Adam Matan

2
@AdamMatan 두 번째 파이프 다음에 전체 명령을 포함 했습니까? 오류 메시지는 두 번째 openssl 호출이 대화식 모드에서 실행 된 것처럼 보입니다 (예 : opensslvs openssl x509 -inform pem -noout -text). 페드로가 쓴 것은 나에게 잘 작동합니다.
Håkan Lindqvist

4
s_client는 전체 체인을 인쇄하지만 마지막 파이프 명령은 첫 번째 인증서에 대한 정보 만 인쇄합니다.
chutz

1
echo자체는 echo ''.. 와 같습니다 . 빈 문자열을 stdout으로 보냅니다. cat /dev/null |또한 작동하고 좀 더 설명이 필요합니다.
hemp

2
만료 날짜 만 알고 싶다면로 교체 -text하고 -enddate다른 옵션 ( openssl x509 help)을 확인하십시오 .
adriaan

63

간단한 솔루션

그것은 나의 일상적인 대본이다 :

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* SSL connection/ { cert=1 } /^\*/ { if (cert) print }'

산출:

* SSL connection using TLS1.2 / ECDHE_RSA_AES_128_GCM_SHA256
*    server certificate verification SKIPPED
*    server certificate status verification SKIPPED
*    common name: www.google.com (matched)
*    server certificate expiration date OK
*    server certificate activation date OK
*    certificate public key: RSA
*    certificate version: #3
*    subject: C=US,ST=California,L=Mountain View,O=Google Inc,CN=www.google.com
*    start date: Wed, 24 May 2017 17:39:15 GMT
*    expire date: Wed, 16 Aug 2017 17:13:00 GMT
*    issuer: C=US,O=Google Inc,CN=Google Internet Authority G2
*    compression: NULL
* ALPN, server accepted to use http/1.1
* Connection #0 to host www.google.com left intact

5
나를 위해 작동하지 않습니다, 시작 / 만료 날짜를 포함하지 않습니다.
Per Lundberg

4
최근 컬이 변경되었으므로 (49에서 52 사이) 인증서에 대해서는 전혀 표시되지 않습니다. :(
Ross Presser


27

원하는 정보의 종류에 따라 다르지만

openssl s_client -showcerts -connect gnupg.org:443

Chrome이 제시하는 것처럼 사람이 읽을 수는 없지만 가장 많이 제공해야합니다.


1
불행하게도, 인증서 데이터의 거의가 해당 명령에 의해 사람이 읽을 수있는 형식으로 제공됩니다.
Håkan Lindqvist

9
이전 의견에 동의하지 않습니다.이 명령은 내가 알아야 할 내용을 알려주며 매우 유용합니다. 답변 +1
camdixon

TLS 1.2를 구체적으로 테스트하려면 -tls1_2
camdixon

23
nmap -p 443 --script ssl-cert gnupg.org

-p 443지정 포트 443 만 스캔합니다. 모든 포트가 생략되면 스캔되고 발견 된 SSL 서비스에 대한 인증서 세부 사항이 표시됩니다. 이 스크립트--script ssl-certNmap 스크립팅 엔진ssl-cert스크립트 만 실행하도록 지시합니다 . 문서에서이 스크립트는 "(r) 서버의 SSL 인증서를 가져옵니다. 인증서에 대해 인쇄되는 정보의 양은 상세 수준에 따라 다릅니다."

샘플 출력 :

Starting Nmap 7.40 ( https://nmap.org ) at 2017-11-01 13:35 PDT
Nmap scan report for gnupg.org (217.69.76.60)
Host is up (0.16s latency).
Other addresses for gnupg.org (not scanned): (null)
rDNS record for 217.69.76.60: www.gnupg.org
PORT    STATE SERVICE
443/tcp open  https
| ssl-cert: Subject: commonName=gnupg.org
| Subject Alternative Name: DNS:gnupg.org, DNS:www.gnupg.org
| Issuer: commonName=Gandi Standard SSL CA 2/organizationName=Gandi/stateOrProvinceName=Paris/countryName=FR
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2015-12-21T00:00:00
| Not valid after:  2018-03-19T23:59:59
| MD5:   c3a7 e0ed 388f 87cb ec7f fd3e 71f2 1c3e
|_SHA-1: 5196 ecf5 7aed 139f a511 735b bfb5 7534 df63 41ba

Nmap done: 1 IP address (1 host up) scanned in 2.31 seconds

6

SSL 인증서 세부 정보를 확인하기 위해 다음 명령 줄 도구를 사용할 수있게되었습니다.

https://github.com/azet/tls_tools

그것은 당신이 인증서 표시를 다시 발행하거나 기존의 유효성을 검사하고, 또한 적은 종속성을위한 올바른 모든 정보가 한 번 확인 중대 는 별도의 설정이 필요하지 않습니다를.

출력의 처음 몇 줄은 다음과 같습니다.

$ ./check_certificate_chain.py gnupg.org 443

>> Certificate Chain:

 [+]*       OU=Domain Control Validated, OU=Gandi Standard SSL, CN=gnupg.org
 [+]**      C=FR, O=GANDI SAS, CN=Gandi Standard SSL CA
 [+]***     C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Hardware

>> Certificate Information:

................................................................................
- [Subject]:        OU=Domain Control Validated, OU=Gandi Standard SSL, CN=gnupg.org
- [Issuer]:     C=FR, O=GANDI SAS, CN=Gandi Standard SSL CA
- [Valid from]:     Mar 18 00:00:00 2014 GMT
- [Valid until]:    Mar 18 23:59:59 2016 GMT
- [Authority]:      Is not a CA
- [Version]:        2
- [Serial No.]:     43845251655098616578492338727643475746
- [X.509 Extension Details]:
  -- [x509_authorityKeyIdentifier]:
       keyid:B6:A8:FF:A2:A8:2F:D0:A6:CD:4B:B1:68:F3:E7:50:10:31:A7:79:21 

그 결과 뒤에는 동일한 수준의 전체 인증서 체인이 이어집니다.

openssl의 s_client와 같은 ssl 중심 cli 도구 대신 내가 좋아하는 것은 대부분 우리가 필요로하는 하나의 일을하려고합니다. 물론 openssl은 더 유연합니다 (예 : clientcerts, 이상한 포트의 imaps 확인 등). 그러나 항상 그런 것은 아닙니다.

또는 파고 들어가고 더 많은 기능을 감상 할 시간이 있다면 sslyze라는 더 큰 도구가 있습니다 (종속성 및 설치 이후로 사용하지 않음 ...)


5

완전성 : 시스템에 Java 7 이상을 설치 한 경우

 keytool -printcert -sslserver $host[:$port]

체인 주로 오히려 추한 형식의 거의 모든 세부 사항 (제공하면서).

시스템에 Java를 설치 했는지 여부 대답하지 않습니다.


openssl (디코딩이 필요함)보다 훌륭하고 훨씬 유용한 기본 출력입니다.
사이먼

4

나는 이것을 위해 쉘 스크립트를 사용한다. openssl 명령의 래퍼 일뿐이므로 구문을 기억하지 않아도됩니다.

일반적으로 관심있는 대부분의 인증서 정보를 구문 분석하거나 원시 openssl 출력을 표시하는 옵션을 제공합니다.

로컬 인증서 파일 또는 원격 서버를 쿼리 할 수 ​​있습니다.

용법:

$ ssl-cert-info --help
Usage: ssl-cert-info [options]

This shell script is a simple wrapper around the openssl binary. It uses
s_client to get certificate information from remote hosts, or x509 for local
certificate files. It can parse out some of the openssl output or just dump all
of it as text.

Options:

  --all-info   Print all output, including boring things like Modulus and 
               Exponent.

  --alt        Print Subject Alternative Names. These will be typically be 
               additional hostnames that the certificate is valid for.

  --cn         Print commonName from Subject. This is typically the host for 
               which the certificate was issued.

  --debug      Print additional info that might be helpful when debugging this
               script.

  --end        Print certificate expiration date. For additional functionality
               related to certificate expiration, take a look at this script:
               "http://prefetch.net/code/ssl-cert-check".

  --dates      Print start and end dates of when the certificate is valid.

  --file       Use a local certificate file for input.

  --help       Print this help message.

  --host       Fetch the certificate from this remote host.

  --issuer     Print the certificate issuer.

  --most-info  Print almost everything. Skip boring things like Modulus and
               Exponent.

  --option     Pass any openssl option through to openssl to get its raw
               output.

  --port       Use this port when conneting to remote host. If ommitted, port
               defaults to 443.

  --subject    Print the certificate Subject -- typically address and org name.

Examples:

  1. Print a list of all hostnames that the certificate used by amazon.com 
     is valid for.

     ssl-cert-info --host amazon.com --alt
     DNS:uedata.amazon.com
     DNS:amazon.com
     DNS:amzn.com
     DNS:www.amzn.com
     DNS:www.amazon.com

  2. Print issuer of certificate used by smtp.gmail.com. Fetch certficate info
     over port 465.

     ssl-cert-info --host smtp.gmail.com --port 465 --issuer
     issuer= 
         countryName               = US
         organizationName          = Google Inc
         commonName                = Google Internet Authority G2

  3. Print valid dates for the certificate, using a local file as the source of 
     certificate data. Dates are formatted using the date command and display
     time in your local timezone instead of GMT.

     ssl-cert-info --file /path/to/file.crt --dates
     valid from: 2014-02-04 16:00:00 PST
     valid till: 2017-02-04 15:59:59 PST


  4. Print certificate serial number. This script doesn't have a special option
     to parse out the serial number, so will use the generic --option flag to
     pass '-serial' through to openssl.

     ssl-cert-info --host gmail.com --option -serial
     serial=4BF004B4DDC9C2F8

여기에서 스크립트를 얻을 수 있습니다 : http://giantdorks.org/alain/shell-script-to-check-ssl-certificate-info-like-expiration-date-and-subject/


연결이 끊어졌습니다.
Adam Matan

4

Windows에서이 작업을 수행하려면 다음 기능과 함께 PowerShell을 사용할 수 있습니다.

function Retrieve-ServerCertFromSocket ($hostname, $port=443, $SNIHeader, [switch]$FailWithoutTrust)
{
    if (!$SNIHeader) {
        $SNIHeader = $hostname
    }

    $cert = $null
    try {
        $tcpclient = new-object System.Net.Sockets.tcpclient
        $tcpclient.Connect($hostname,$port)

        #Authenticate with SSL
        if (!$FailWithoutTrust) {
            $sslstream = new-object System.Net.Security.SslStream -ArgumentList $tcpclient.GetStream(),$false, {$true}
        } else {
            $sslstream = new-object System.Net.Security.SslStream -ArgumentList $tcpclient.GetStream(),$false
        }

        $sslstream.AuthenticateAsClient($SNIHeader)
        $cert =  [System.Security.Cryptography.X509Certificates.X509Certificate2]($sslstream.remotecertificate)

     } catch {
        throw "Failed to retrieve remote certificate from $hostname`:$port because $_"
     } finally {
        #cleanup
        if ($sslStream) {$sslstream.close()}
        if ($tcpclient) {$tcpclient.close()}        
     }    
    return $cert
}

이것은 당신이 같은 깔끔한 일을 할 수 있습니다

#Save to file and open 
Retrieve-ServerCertFromSocket www.wrish.com 443 | Export-Certificate -FilePath C:\temp\test.cer ; start c:\temp\test.cer

#Display the cert details
Retrieve-ServerCertFromSocket www.wrish.com 443 | fl subject,*not*,Thumb*,ser*

2
nmap -sV -sC google.com -p 443

3
더 많은 설명이 필요합니다.
Sven

설명의 필요성에 동의하지만, 그것은 나를 위해 작동합니다 +1
Jeff

2

만료일 만 원한다면 (정답은 아니지만 사람들이 Chrome 인증서 세부 정보를 사용하는 9/10), 다음을 사용할 수 있습니다.

echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -enddate

스크립트 등에 유용

c4urself@eos ~ → which ssl_expiry
ssl_expiry () {
  echo | openssl s_client -connect ${1}:443 2> /dev/null | openssl x509 -noout -enddate
}
c4urself@eos ~ → ssl_expiry google.com
notAfter=Jun 12 16:54:00 2018 GMT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.