はじめに
PHPには openssl_x509_parse() という便利な関数があり、SSL証明書の内容を配列として取得できます。これを使うことで、対象サイトの証明書情報(ドメイン名、有効期限、発行者など)をプログラムから簡単に確認できます。この記事では、実際に「phpexam.jp」の証明書を取得し、その内容を解析するサンプルを紹介します。
目次
サーバー証明書の取得
$resource = @stream_socket_client(
'ssl://www.phpexam.jp:443',
$errno,
$errstr,
60,
STREAM_CLIENT_CONNECT,
stream_context_create(['ssl'=>['capture_peer_cert' => true]])
);
ここで ssl://www.phpexam.jp:443
はHTTPSの接続先、capture_peer_cert
を true
にすることで、サーバーが提示した証明書をキャプチャできます。
証明書の解析
取得した証明書は openssl_x509_parse() で配列に変換できます。
$cont = stream_context_get_params($resource);
$x509 = openssl_x509_parse($cont['options']['ssl']['peer_certificate']);
この $x509
には証明書の詳細が格納されています。
出力例
以下のコードで証明書の内容を確認できます。
echo "<pre>";
print_r($x509);
echo "</pre>";
出力イメージ:
Array
(
[name] => /CN=phpexam.jp
[subject] => Array
(
[CN] => phpexam.jp
)
[issuer] => Array
(
[C] => US
[O] => Let's Encrypt
[CN] => R3
)
[validFrom_time_t] => 1756667602
[validTo_time_t] => 1764446001
[signatureTypeSN] => RSA-SHA256
)
注目すべきフィールド
subject
… 証明書の対象ドメイン(例:phpexam.jp
)issuer
… 発行元(例: Let’s Encrypt R3)validFrom_time_t
… 証明書の有効開始日時(UNIXタイム)validTo_time_t
… 証明書の有効期限切れ日時(UNIXタイム)signatureTypeSN
… 署名アルゴリズム
まとめ
stream_socket_client()
で SSL サイトに接続し、証明書をキャプチャできるopenssl_x509_parse()
で配列に変換し、詳細を取り出せる- ドメイン名・発行者・有効期間などがプログラムから確認可能
試験対策としても覚えておくと、「SSL証明書に関する関数の用途」を問われる問題に対応できるでしょう。