我想对域名https 证书过期时间进行监控,并通过钉钉机器人在群组里发送提醒消息。 直接向 chatGPT 提问,初次提供的代码示例中使用的 php curl 扩展的 curl_getinfo()
函数。经过测试,确定无法通过 curl_getinfo
获取 SSL 证书信息。于是反馈给AI ,获取如下内容。在此稍做修改后,分享给大家。
为了获取证书信息,我们需要做一些额外的处理。具体的方法是使用 stream_context_create
创建一个 HTTPS 上下文,然后通过 stream_socket_client
函数来建立一个安全的连接,从而获得证书相关信息。
以下是更新后的代码示例:
function getCertificateExpirationDate($domain) {
// 创建一个流上下文,其中包含一个ssl选项,该选项用于捕获对等证书。
$streamContext = stream_context_create(["ssl" => ["capture_peer_cert" => true]]);
// 使用stream_socket_client函数建立一个安全的SSL连接。连接的目标是在指定的域名后面的端口443上建立连接。函数的参数包括域名,错误号,错误消息,超时时间,连接选项和流上下文。
$secureConnection = stream_socket_client("ssl://" . $domain . ":443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $streamContext);
if (!$secureConnection) {
return false;
}
// 获取流上下文参数中的SSL信息,并将其赋值给$sslInfo变量。
$sslInfo = stream_context_get_params($secureConnection);
//使用openssl_x509_parse函数来解析传入的SSL证书。它首先从$sslInfo数组中获取"options"下的"ssl"数组,然后从中获取"peer_certificate"字段的值,即对等证书。然后将该证书作为参数传递给openssl_x509_parse函数,该函数将解析证书并返回一个关联数组$certInfo,包含了证书的各种信息。
$certInfo = openssl_x509_parse($sslInfo["options"]["ssl"]["peer_certificate"]);
if (isset($certInfo["validTo_time_t"])) {
$expireDate = date('Y-m-d H:i:s', $certInfo["validTo_time_t"]);
return $expireDate;
} else {
return false;
}
}
// 示例使用
$domain = 'example.com';
$expirationDate = getCertificateExpirationDate($domain);
if ($expirationDate) {
echo "域名 {$domain} 的证书过期时间为:{$expirationDate}";
} else {
echo "无法获取域名 {$domain} 的证书信息";
}
首先创建了一个包含 capture_peer_cert
设置的上下文,这样建立连接时会获取 SSL 证书。然后,我们使用 stream_socket_client
函数来建立一个安全连接,通过 stream_context_get_params
获取 SSL 证书信息。最后,我们使用 openssl_x509_parse
函数来解析证书信息并提取有效期时间。
现在,这段代码应该能够正确地获取到域名的 SSL 证书过期时间了。记得确保你的 PHP 环境开启了 OpenSSL 扩展。