1. 概要

このチュートリアルでは、 openssl ツールのx509サブコマンドを使用して、X.509公開鍵証明書から情報を抽出する方法を学習します。

2. X.509公開鍵証明書とは何ですか?

TLSおよびSSL暗号化プロトコルでは、公開鍵証明書は、Webサイトがエンドユーザーに提示する電子証明書です。 証明書を通じて、Webサイトは訪問者にその正当性を証明できます。 その後、訪問者は自信を持ってWebサイトを操作できます。

X.509は、公開鍵証明書を定義するための標準の1つです。 これは、インターネット上で最も一般的に使用されているものです。

3. X.509証明書には何が含まれていますか?

サンプルのX.509証明書を見てみましょう。

Certificate:
    Data:        
        Serial Number:
            24:4e:52:d9:6b:55:1f:96:0a:00:00:00:00:f2:ba:f4
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
        Validity
            Not Before: Jul 12 01:35:31 2021 GMT
            Not After : Oct  4 01:35:30 2021 GMT
        Subject: CN = *.google.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            X509v3 Subject Alternative Name:
                DNS:*.google.com, DNS:*.appengine.google.com, DNS:*.bdn.dev, 
                ...(truncated)
    Signature Algorithm: sha256WithRSAEncryption
         c1:0b:9e:6b:58:ea:5f:31:c8:25:1a:49:b6:fc:dd:a6:46:73:
         ...(truncated)

上記の証明書スニペットは、google.com用です。 さまざまな情報が含まれています。

まず、すべての証明書にはシリアル番号が含まれています。これは、発行者が証明書に署名するときに指定する値です。

証明書の発行者は[発行者]フィールドで定義されます。この特定の証明書の場合、発行者は米国にあるGoogle TrustServicesLLC組織の下にあります。 さらに、発行者の一般名は GTS CA1C3です。

次に、有効性フィールドは証明書が有効である期間を定義します。 特に、証明書は、 NotBeforeおよびNotAfterで定義された期間のみ有効です。

Subject フィールドで、この証明書の共通名が*。google.comであることがわかります。 これは、google.comのすべてのサブドメインが同じ証明書を使用して自分自身を識別できるようにするワイルドカードの一般名です。 さらに、 Subject Public Key Infoフィールドは、この証明書の公開鍵を指定します。 同じフィールドの下で、証明書は公開鍵のアルゴリズムタイプと必要なパラメータも定義します。

X509v3拡張フィールドには、X.509証明書標準のバージョン3にあるいくつかの拡張プロパティがあります。たとえば、 X509v3サブジェクト代替名フィールドは、他のドメインを定義します。同じ証明書を使用して認証しています。 つまり、この証明書は*。cloud.google.com*。appengine.google.comなどにも有効です。

最後に、 Signature Algorithm フィールドの後に、16進数のブロックが続きます。 このフィールドは、署名が行われるときに使用されるアルゴリズムを指定します。 この場合、それはsha256WithRSAEncryptionです。 さらに、16進数のブロックは、発行者によって署名された署名です。 署名は、認証局によって検証された後、証明書の情報が踏みにじられていないことを確認するのに役立ちます。

4. opensslツール

openssl ツールは、SSL/TLSネットワークプロトコルを実装する暗号化ライブラリです。 これには、SSL/TLS通信のニーズに対応するさまざまなサブコマンドが含まれています。

たとえば、s_clientサブコマンドはSSL/TLSクライアントの実装です。 さらに、 x509サブコマンドは、X.509証明書を操作するためのさまざまな機能を提供します。

4.1. インストール

ほとんどのLinuxディストリビューションには、opensslコマンドが含まれています。 利用できない場合は、パッケージマネージャーを使用してインストールできます。

DebianベースのLinuxの場合、apt-getパッケージマネージャーを使用できます。

$ sudo apt-get update
$ sudo apt-get install -y openssl

RHELベースのLinuxの場合、yumパッケージマネージャーを使用できます。

$ sudo yum update
$ sudo yum install -y openssl

また、Alpine Linuxの場合、apkパッケージマネージャーを使用できます。

$ sudo apk add openssl

opensslサブコマンドversionを実行して、インストールが成功したことを確認できます。

$ openssl version
OpenSSL 1.1.1k  25 Mar 2021

5. X.509公開鍵証明書ファイルの取得

google.comの公開鍵証明書ファイルフェッチしたいとします。 これは、openssls_clientおよびx509サブコマンドを使用して実行できます。

$ openssl s_client -connect google.com:443 -showcerts </dev/null | openssl x509 -outform pem > googlecert.pem

s_client を使用してホストgoogle.comのポート443に接続すると、TLSハンドシェイクが開始されます。

-showcerts オプションは、証明書を標準出力に出力することを示します。 / dev / null を標準入力にリダイレクトすると、証明書を取得した後に接続が終了します。

次に、証明書を x509サブコマンドと-outformオプションにパイプ処理して、PEM形式にエンコードします。 最後に、証明書ファイルをgooglecert.pemとして保存します。

6. 証明書全体のデコード

PEM形式の証明書はbase64でエンコードされています。 たとえば、以前に取得したgooglecert.pemファイルは次のとおりです。

$ cat googlecert.pem
-----BEGIN CERTIFICATE-----
MIINUDCCDDigAwIBAgIQJE5S2WtVH5YKAAAAAPK69DANBgkqhkiG9w0BAQsFADBG
MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
...(truncated)
-----END CERTIFICATE-----

証明書全体をプレーンテキストにデコードするには、-textオプションを指定してx509コマンドを使用します

$ openssl x509 -in googlecert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            24:4e:52:d9:6b:55:1f:96:0a:00:00:00:00:f2:ba:f4
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
        Validity
            Not Before: Jul 12 01:35:31 2021 GMT
            Not After : Oct  4 01:35:30 2021 GMT
        ...(truncated)

まず、オプションで、デコードする証明書ファイルを指定します。 次に、 -noout オプションは、コマンドからの出力を防ぎます。 -nooutオプションを指定しない場合、コマンドはデフォルトでbase64でエンコードされた証明書を返します。

最後に、 -text オプションを指定して、証明書全体をプレーンテキスト形式で印刷します。

7. 証明書から特定の情報を抽出する

x509 サブコマンドを使用して、証明書からさまざまなフィールドを抽出できます。

7.1. 件名の抽出

x509サブコマンドの-subjectオプションを使用すると、証明書の件名を抽出できます

x509 を使用して、googlecert.pemファイルから件名情報を抽出してみましょう。

$ openssl x509 -in googlecert.pem -noout -subject
subject=CN = *.google.com

7.2. 発行者の抽出

-issuerオプションを使用して、証明書から発行者情報を抽出できます。

たとえば、 googlecert.pem ファイルから発行者情報を抽出するには、次のようにします。

$ openssl x509 -in googlecert.pem -noout -issuer
issuer=C = US, O = Google Trust Services LLC, CN = GTS CA 1C3

7.3. 拡張フィールドの抽出

X.509公開鍵証明書の拡張フィールドを取得するには、-extオプションを使用できます。

たとえば、-extオプションの後にsubjectAltNameを指定すると、証明書にサブジェクトの代替名が表示されます。

$ openssl x509 -in googlecert.pem -noout -ext subjectAltName
X509v3 Subject Alternative Name:
    DNS:*.google.com, DNS:*.appengine.google.com, DNS:*.bdn.dev, DNS:*.cloud.google.com, DNS:*.crowdsource.google.com, DNS:*.datacompute.google.com, ...(truncated)

同様に、同じオプションを使用して、keyUsage引数を使用してキー使用フィールドを取得できます。

$ openssl x509 -in googlecert.pem -noout -ext keyUsage
X509v3 Key Usage: critical
    Digital Signature

7.4. 名前出力のフォーマット

発行者や件名などの出力については、-nameoptオプションを使用して表示形式を追加で指定できます。

たとえば、-nameoptオプションの後にsep_multiline operatorを使用して、発行者情報を複数の行に分割できます。

$ openssl x509 -in googlecert.pem -noout -issuer -nameopt sep_multiline
issuer=
    C=US
    O=Google Trust Services LLC
    CN=GTS CA 1C3

lname演算子を-nameoptに渡すことにより、省略形の代わりに長いフィールド名を表示することもできます。

$ openssl x509 -in googlecert.pem -noout -issuer -nameopt lname
issuer=countryName=US, organizationName=Google Trust Services LLC, commonName=GTS CA 1C3

最後に、 -nameopt オプションを複数回指定して、さまざまなオペレーターの動作を組み合わせることができます。 たとえば、lname演算子とsep_multiline演算子を組み合わせることができます。

$ openssl x509 -in googlecert.pem -noout -issuer -nameopt lname -nameopt sep_multiline
issuer=
    countryName=US
    organizationName=Google Trust Services LLC
    commonName=GTS CA 1C3

opensslコマンドのmanページには、フォーマット引数の完全なリストがあります。

7.5. 開始日と有効期限の抽出

すべての証明書は、開始日と有効期限を指定します。 証明書はこの期間中にのみ有効であるため、これら2つの日付は重要です。

両方の日付を取得するには、-datesオプションを指定できます。

$ openssl x509 -in googlecert.pem -noout -dates
notBefore=Jul 12 01:35:31 2021 GMT
notAfter=Oct  4 01:35:30 2021 GMT

または、 -startdate オプションを使用して、開始日のみを印刷することもできます。

$ openssl x509 -in googlecert.pem -noout -startdate
notBefore=Jul 12 01:35:31 2021 GMT

同様に、 -enddate オプションを使用すると、証明書の有効期限を取得できます。

$ openssl x509 -in googlecert.pem -noout -enddate
notAfter=Oct  4 01:35:30 2021 GMT

7.6. その他の情報の抽出

各証明書には、特定の証明書を一意に識別するために使用されるフィンガープリントがあります。

フィンガープリントを抽出するには、-fingerprintオプションを指定してx509サブコマンドを実行できます。

$ openssl x509 -in googlecert.pem -noout -fingerprint
SHA1 Fingerprint=5E:0B:46:9E:55:07:70:5A:C3:40:12:66:06:89:9A:92:E8:C2:15:E4

そのほか、-serialオプションを使用して証明書のシリアル番号を取得できます。 例えば:

$ openssl x509 -in googlecert.pem -noout -serial
serial=244E52D96B551F960A00000000F2BAF4

最後に、-pubkeyオプションを使用して証明書の公開鍵を抽出できます。

$ openssl x509 -in googlecert.pem -noout -pubkey 
-----BEGIN PUBLIC KEY----- 
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESDHX4ovWPfaIWPNZPCKJGTx7QjE5 
0gifWTUyw+t7DkNvq+2nErrpWocdifYDOoX8E+63JdEFlrRwhu4jXZheYA== 
-----END PUBLIC KEY-----

7.7. 証明書の有効期限が近づいているかどうかの確認

x509サブコマンドの-checkendオプションを使用すると、証明書の有効期限が近づいているかどうかをすばやく確認できます。

このオプションは、秒単位の追加の引数nを取ります。 一般的:

$ openssl x509 -in <certificate-filename> -noout -checkend n

上記のコマンドは、証明書が次のn秒で期限切れになるかどうかを確認します。 そうである場合、コマンドは1リターンステータスコードになります。 指定された証明書が次のn秒以内に期限切れにならない場合、コマンドは0ステータスコードを返します。 さらに、コマンドは証明書の有効期限ステータスを示すメッセージを返します。

たとえば、証明書が次の60秒以内に期限切れになるかどうかを判断するには、次のようにします。

$ openssl x509 -in googlecert.pem -noout -checkend 60
Certificate will not expire
$ echo $?
0

上記のコマンドは、証明書が次の60秒で期限切れにならないため、ステータスコード0を返します。

同じ証明書が今後20週間で期限切れになるかどうかを確認しましょう。

$ openssl x509 -in googlecert.pem -noout -checkend 12096000
Certificate will expire
$ echo $?
1

証明書は今後20週間以内に期限切れになるため、返品ステータスコードは1になります。

8. 結論

この記事では、X.509証明書とは何か、証明書に含まれるデータ、および作業中のWebサイトから証明書を取得する方法について学習しました。

また、 openssl ツールと、その x509 サブコマンドを使用して証明書をデコードし、サブジェクト、発行者、有効期間などのさまざまな情報を抽出する方法についても学びました。証明書、拡張フィールドなど。 それから。 また、証明書の有効期限が近づいているかどうかを判断する方法もわかりました。