사람이 읽을 수 있는 형식으로 서버의 SSL 인증서를 얻는 방법은 무엇입니까?

사람이 읽을 수 있는 형식으로 서버의 SSL 인증서를 얻는 방법은 무엇입니까?

Not After예를 들어 crypto.google.com의 인증서가 언제 만료되는지(예: 날짜), 어떤 다른 도메인에서 인증에 사용할 수 있는지(주체 대체 이름)를 알고 싶습니다 .

답변1

간단히 작성할 수 있습니다.

openssl s_client -showcerts -connect encrypted.google.com:443 < /dev/null \
   2> /dev/null | openssl x509 -noout -enddate

다른 옵션을 -enddate사용하여 다른 필드를 검색할 수 있습니다. -text대부분의 정보를 인쇄합니다.

자바 도 참조하세요 keytool:

keytool -printcert -sslserver encrypted.google.com:443

가능하다면 전체 인증서 체인(아마도 Java 인증서 저장소에서 검색된 일부)을 인쇄합니다.

답변2

openssl을 사용하여 서버의 인증서를 텍스트로 인쇄하려면 다음을 수행하십시오.

#!/bin/bash
#
# Show server's certificate in a human-readable form.
#
# Usage: $ show-cert HOST [PORT]
#
exec <&- # close stdin to suppress `read:errno=0` from openssl
exec openssl x509 -noout -text \
     -in <(openssl s_client -connect "$1":"${2:-443}" -showcerts)

또는 Python을 사용하여 json 형식으로 출력을 얻습니다.

#!/usr/bin/env python3
"""Show server's certificate as json.

Usage:
  $ %(prog)s HOST [PORT]
"""
import json
import socket
import ssl
import sys

def getcert(addr, timeout=None):
    """Retrieve server's certificate at the specified address (host, port)."""
    # it is similar to ssl.get_server_certificate() but it returns a dict
    # and it verifies ssl unconditionally, assuming create_default_context does
    with socket.create_connection(addr, timeout=timeout) as sock:
        context = ssl.create_default_context()
        with context.wrap_socket(sock, server_hostname=addr[0]) as sslsock:
            return sslsock.getpeercert()

def main(argv):
    host = argv[1]
    port = int(argv[2]) if len(argv) > 2 else 443
    print(json.dumps(getcert((host, port)), indent=2, sort_keys=True))

if __name__ == "__main__":
    main(sys.argv)

예:

$ getcert encrypted.google.com | jq -r '.notAfter, .subjectAltName[][1]'
Mar 20 00:00:00 2014 GMT
*.google.com
*.android.com
*.appengine.google.com
*.cloud.google.com
...

최신 버전:getcert.py

관련 정보