PHPでSSLサーバ証明書の有効期限を調べる

(1/1)
今回は、PHPを使いSSLサーバ証明書の有効期限を調べるプログラムを作る。

(2022年6月27日)FastCGIで正常動作しない不具合を修正
(2022年6月4日)PHP8対応,リファラ・チェック追加

目次

サンプル・プログラムの実行例

PHPでSSLサーバ証明書の有効期限を調べる

サンプル・プログラム

圧縮ファイルの内容
checkSSL.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。

準備

0043: //表示幅(ピクセル)
0044: define('WIDTH', 600);
0045: 
0046: //URLの初期値
0047: define('DEF_URL', 'https://www.pahoo.org/');
0048: //URLの最小長
0049: define('MIN_LEN_URL', 10);
0050: //URLの最大長
0051: define('MAX_LEN_URL', 500);
0052: 
0053: /**

データ入力に関わる関数群は別ファイル "pahooInputData.php" に分離しており、include_path が通ったディレクトリに配置すること。

解説:SSLの有効期限を調べる

0130: /**
0131:  * SSLサーバ証明書の有効期限を返す
0132:  * @param   string $url   調査するURL
0133:  * @return  long  SSL証明書の有効期限/FALSE
0134: */
0135: function getLimitSSL($url) {
0136:     $arr = parse_url($url);
0137:     if ($arr == FALSE)  return FALSE;
0138:     if ($arr['scheme'] != 'https')  return FALSE;
0139: 
0140:     $stream_context = stream_context_create(array(
0141:         'ssl' => array('capture_peer_cert' => TRUE)
0142:     ));
0143:     $resource = stream_socket_client(
0144:         'ssl://' . $arr['host'] . ':443',
0145:         $errno,
0146:         $errstr,
0147:         30,
0148:         STREAM_CLIENT_CONNECT,
0149:         $stream_context
0150:     );
0151:     $cont = stream_context_get_params($resource);
0152:     $parsed = openssl_x509_parse($cont['options']['ssl']['peer_certificate']);
0153: 
0154:     return (strpos($parsed['subject']['CN'], $arr['host']) !== FALSE) ?
0155:         $parsed['validTo_time_t'] : FALSE;
0156: }

SSLサーバ証明書の有効期限を取得するのがユーザー関数 getLimitSSL である。

ストリーム関数  stream_context_create  によってストリームコンテキストを作成し、次に関数  stream_socket_client  によってSSLソケット接続を開く。そして関数  stream_context_get_params  によってSSL証明書に関するパラメータを取得する。
取得パラメータはOpenSSL関数  openssl_x509_parse  によってパーシングし、証明書の有効期限を取り出す。

0158: /**
0159:  * SSLサーバ証明書の有効期限を調べる
0160:  * @param   string $url   調査するURL
0161:  * @return  bool TRUE:有効期限内/FALSE:期限外
0162: */
0163: function checkSSL($url) {
0164:     $limit = getLimitSSL($url);
0165:     if ($limit == FALSE)    return FALSE;
0166: 
0167:     return ($limit - time() > 0) ? TRUE : FALSE;
0168: }

有効期限はUNIX時間として取得されるので、ユーザー関数 checkSSL によって現在日付と比較し、有効期限内かどうかを判定する。
(この項おわり)
header