やさしいopensslコマンドによるSSL証明書の確認方法

7月 15, 2020AmazonLinux_CentOS,Network,Ubuntu(WSL),セキュリティ関連

概要

はじめに

  • 今回は、opensslコマンドを使って、SSL証明書の情報を確認する方法をまとめます。よく使うコマンドではありますが、opensslコマンドはオプションやできることが多く、no look で打つのはまだ厳しいですね。
  • 今回の記事を書いた背景は、opensslコマンドの注意事項を共有するためです。先日、opensslコマンドを使ってシリアル番号を抜き取り、証明書の一覧を作成しておりました。その際に、opensslコマンドでは、シリアル番号の先頭が"0″から始まる場合は、"0″が省略して表示されることに気付きました! シリアルが一致しない証明書が数件あり、悩んでおりましたのでスッキリ。この続きは、本文をご覧ください。

 

SSL証明書とは

  • ウェブサイトでSSL(https)を利用する場合、SSL証明書が必要となります。SSL証明書には、通信の暗号化に必要な鍵とサイト所有者の情報が含まれており、「通信の暗号化」と「サイト所有者の身元証明」の2つの役割を持ちます。
  • SSLによる暗号化通信は、「共通鍵暗号方式」・「公開鍵暗号方式」の仕組みを利用します。公開鍵暗号方式では、公開鍵の成りすましを防止するために公開鍵証明書が使われます。この公開鍵証明書は偽装されないようにデジタル署名が使われており、認証局(CA)が署名を行い、証明書の正当性を保証します。この証明書をサーバー側に格納して、通信の暗号化に使用します。証明書には証明書の有効期間、発行者、署名アルゴリズムなどの情報も含まれ、サイトを運営する方は有効期間内に証明書を更新する必要があります。
  • SSL証明書は、AWSのACM(Certificate Manager)を利用したり、外部プロバイダー(GMOなど)やLet’s Encryptなど無料のサービスで発行することも可能です。外部プロバイダーに証明書を要求する場合のCSR 作成やACMへのインポートは、下記記事を参照ください。

opensslコマンドを使ったSSL証明書の確認方法

opensslコマンドでサーバーにアクセスして確認する

  • opensslコマンドでサーバーにアクセスして、SSL証明書の情報を確認する方法になります。下記に記載するどちらのコマンドでも証明書の情報が取得できますが、前者の openssl x509 -text -noout でデコードした方が有効期間も表示され分かりやすいです。
    • openssl s_client -connect <FQDN>:443 | openssl x509 -text -noout
    • openssl s_client -connect <FQDN>:443 -showcerts
  • 次に、証明書を確認する際の基本的なポイントは、下記の通りです。
    • Version(バージョン)
    • Serial Number(シリアル番号)
    • Issuer(発行者)
    • Validity(有効期間の開始と満了)
    • Subject(主体者)
    • Subject Public Key Info(主体者の公開鍵アルゴリズム、主体者の公開鍵)
  • また、openssl x509 -text -nooutで表示した場合、X509v3 extensionsセクションのBasic ConstraintsにあるCA属性を確認することで、サーバー証明書かCA証明書かを判断します。CA属性は、下記の通り。
    • CA:FALSE → サーバー証明書
    • CA:TRUE → CA証明書
  • 試しに"https://www.ipa.go.jp/" にアクセスして、証明書の情報を確認します。

niikawa@niikawa1:~$ openssl s_client -connect www.ipa.go.jp:443 | openssl x509 -text -noout
depth=2 C = JP, O = "SECOM Trust Systems CO.,LTD.", OU = Security Communication RootCA2
verify return:1
depth=1 C = JP, O = "SECOM Trust Systems CO.,LTD.", CN = SECOM Passport for Web EV 2.0 CA
verify return:1
depth=0 C = JP, ST = Tokyo, L = Bunkyo, O = "Information-technology Promotion Agency, Japan", jurisdictionC = JP, businessCategory = Private Organization, serialNumber = 5010005007126, CN = www.ipa.go.jp
verify return:1
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            be:a1:b5:52:60:2f:77:dd:00:00:00:00:53:fb:ef:1f
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, O = "SECOM Trust Systems CO.,LTD.", CN = SECOM Passport for Web EV 2.0 CA
        Validity
            Not Before: May 15 02:30:27 2020 GMT
            Not After : May 27 14:59:59 2021 GMT
        Subject: C = JP, ST = Tokyo, L = Bunkyo, O = "Information-technology Promotion Agency, Japan", jurisdictionC = JP, businessCategory = Private Organization, serialNumber = 5010005007126, CN = www.ipa.go.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:de:bb:93:d3:5f:c3:bd:e8:eb:86:ee:07:b2:6b:
                    96:b5:af:26:d3:f9:be:bb:00:05:d9:fd:02:d9:79:
                    51:c0:9c:27:e0:45:ea:35:f9:de:06:17:25:92:18:
                    54:59:37:3f:71:8b:fb:be:4e:f6:25:42:1b:a8:02:
                    d8:a2:70:ed:76:26:2b:ce:26:0f:33:50:64:e4:9e:
                    75:af:f5:15:6f:8c:4b:9c:9d:5a:00:66:14:06:71:
                    23:d0:7c:39:eb:d4:2f:5a:9d:37:d0:70:3c:72:3e:
                    a8:b8:94:38:ec:ea:c2:27:04:e6:77:7e:5a:07:f3:
                    91:a9:89:66:ca:3e:49:75:4f:c0:f5:d1:6e:ea:5e:
                    0d:b8:9a:ab:de:6d:b0:9a:d3:a3:34:95:60:89:c5:
                    a2:23:6c:48:8e:60:51:d3:44:f6:8d:ce:48:65:99:
                    17:9b:17:d7:0d:fc:51:62:41:e4:24:ef:b5:29:fe:
                    66:7d:81:28:e1:f3:d9:5a:44:f1:97:07:d9:3c:df:
                    ff:20:f0:73:b1:8a:14:ee:4c:e5:46:b6:fe:35:c3:
                    74:1f:b2:26:ce:be:9d:5a:16:b2:cb:30:ef:bb:0e:
                    25:0f:69:57:fb:4d:03:d2:ab:3c:28:f8:ee:17:16:
                    c1:d1:db:ac:dc:ff:8b:df:96:4a:f6:0c:76:66:4c:
                    98:af
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            CT Precertificate SCTs:
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : F6:5C:94:2F:D1:77:30:22:14:54:18:08:30:94:56:8E:
                                E3:4D:13:19:33:BF:DF:0C:2F:20:0B:CC:4E:F1:64:E3
                    Timestamp : May 15 03:00:27.946 2020 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:46:02:21:00:82:C3:97:5E:9E:A7:EB:AF:CA:9B:33:
                                CE:E6:18:C2:0A:47:75:04:0E:B9:CB:85:28:77:14:69:
                                C8:E3:26:88:B6:02:21:00:C9:71:E0:CF:6B:23:1B:D8:
                                F8:A8:F0:BE:75:81:E0:8A:E4:3B:91:D1:64:48:6C:A7:
                                5C:E7:32:46:17:6B:FA:2B
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 7D:3E:F2:F8:8F:FF:88:55:68:24:C2:C0:CA:9E:52:89:
                                79:2B:C5:0E:78:09:7F:2E:6A:97:68:99:7E:22:F0:D7
                    Timestamp : May 15 03:00:29.824 2020 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:A0:4A:BF:C5:6D:E9:C6:11:F0:E8:ED:
                                A5:E5:D7:36:1B:F6:38:81:75:80:DC:FD:28:54:62:DD:
                                1C:6A:ED:19:10:02:20:42:E8:B4:12:D1:12:05:5D:C6:
                                28:3C:61:82:CD:95:3D:24:0E:60:21:3F:60:4A:4C:3D:
                                E5:D0:F1:8E:B6:CA:2B
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 5C:DC:43:92:FE:E6:AB:45:44:B1:5E:9A:D4:56:E6:10:
                                37:FB:D5:FA:47:DC:A1:73:94:B2:5E:E6:F6:C7:0E:CA
                    Timestamp : May 15 03:00:30.731 2020 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:44:02:20:1C:EB:F6:DA:2A:93:8C:AD:08:91:87:9A:
                                59:BC:5B:9D:AD:BA:1B:70:33:AD:FF:CD:FC:66:8C:05:
                                1A:4E:BE:86:02:20:34:C3:49:D1:91:F8:06:53:E4:E4:
                                23:18:FE:BD:E2:5D:42:12:27:72:F1:9D:F1:FA:78:AB:
                                56:10:7E:A0:63:5C
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            Authority Information Access:
                OCSP - URI:http://ev2.ocsp.secomtrust.net
            X509v3 Certificate Policies:
                Policy: 1.2.392.200091.100.721.1
                  CPS: https://repo1.secomtrust.net/spcpp/pfw/pfwev2ca/
                Policy: 2.23.140.1.1
            X509v3 Subject Alternative Name:
                DNS:www.ipa.go.jp
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://repo1.secomtrust.net/spcpp/pfw/pfwev2ca/fullcrl.crl
                Full Name:
                  DirName:C = JP, O = "SECOM Trust Systems CO.,LTD.", CN = SECOM Passport for Web EV 2.0 CA, CN = CRL6
            X509v3 Authority Key Identifier:
                keyid:16:4B:FB:0C:97:38:8A:18:5A:54:A1:46:CF:89:24:47:CC:C4:76:B3
            X509v3 Subject Key Identifier:
                97:AA:86:CE:FE:61:78:95:E1:61:D9:DB:65:40:19:6B:61:26:82:C5
    Signature Algorithm: sha256WithRSAEncryption
         34:ec:7a:05:00:17:43:8d:07:c6:bd:a7:21:05:dd:79:fa:4b:
         3e:26:95:72:e7:f4:3d:b3:5c:20:6d:4b:07:e7:82:70:1a:9e:
         ae:f2:f6:de:6c:63:a5:56:0b:38:21:fa:f6:13:51:5d:96:eb:
         47:01:51:23:9c:80:c8:a4:b4:d0:0c:26:32:0a:ee:76:ed:2d:
         a8:39:28:d1:d4:cf:8b:76:ff:39:dd:b2:03:c8:66:32:07:16:
         4a:0b:9e:f9:cb:23:60:54:04:e5:ec:1f:cd:56:15:f4:14:67:
         18:6f:d3:4c:ff:84:fe:98:bd:af:0c:05:d2:36:ee:a8:42:25:
         5d:f0:1d:10:19:36:a1:b8:59:f5:97:5b:b3:49:2e:f3:55:e0:
         0f:b9:6a:9d:50:86:4b:2d:18:8b:03:4b:4e:b9:21:5d:55:91:
         f8:94:09:7d:29:d8:ba:58:a2:af:d3:6d:3d:7a:5e:81:47:10:
         eb:f6:c8:95:aa:65:86:16:42:24:c1:1c:08:78:55:ae:eb:ee:
         b5:0f:52:e5:88:c2:7f:8d:2a:6e:f8:30:b5:d4:92:0d:75:41:
         58:2f:f5:ed:5c:cc:0f:8f:67:cf:2a:90:b3:ea:11:a1:ae:f6:
         bd:46:0c:f0:a7:ec:52:fc:b0:5e:0f:ef:68:b2:09:4d:dc:6a:
         a6:0b:09:d3
← ctrl + cで停止

 

opensslコマンドでローカルのファイルを指定して確認する

  • 自分が運営するサイトであれば、ローカルにあるファイルを指定して、前述のopensslコマンドと同じ結果を得ることができます。コマンドは、下記の通りです。

niikawa@niikawa1:~$ openssl x509 -text -noout -in <証明書ファイル>

 

ブラウザを使ったSSL証明書の確認方法

ブラウザから証明書アイコンをクリックして確認する

  • ブラウザからアクセス可能な場合は、証明書アイコンをクリックし、証明書の情報が確認できます。

 

opensslコマンド vs ブラウザから見た場合の違い

  • ご覧の通り、opensslコマンドと同じ情報を得ることができますが、opensslコマンドとブラウザで見た時の違いを2点紹介します。
  • ブラウザで見た場合、シリアル番号の先頭が"0″ から始まっていることが分かります。opensslコマンドでは、Serial Numberの先頭が"0″から始まる場合は、"0″が省略して表示されます。シリアル番号の桁数が変わるため後から気付くこともできますが、opensslコマンドでシリアル番号を管理する場合には注意が必要です。
  • 有効期間がJST(ローカルのタイムゾーン)で表示されています。opensslコマンドでは、GMT で表示されていたため、タイムゾーンの時差に注意が必要です。