
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
ほとんどの情報を印刷します。
Javaも参照してください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