我想使用以下代码通过PHP提取所有SSL证书数据
$orignal_parse = parse_url($url, PHP_URL_HOST);
$get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE)));
$read = stream_socket_client("ssl://".$orignal_parse.":443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get);
$cert = stream_context_get_params($read);
$certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
这样,除了密钥大小,弱密钥,SSL证书类型,公共密钥算法,指纹(SHA256)细节之外,我已经获得了有关我的SSL证书的所有详细信息。
有人可以帮我吗
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在PHP中提取SSL证书详细信息时,您已经使用了stream_context_create
、stream_socket_client
以及openssl_x509_parse
等函数来获取大部分证书信息。要补充您提到的密钥大小、弱密钥检查、SSL证书类型、公共密钥算法和指纹(SHA256),您可以基于已有的 $certinfo
变量进行进一步处理。下面是如何获取这些额外信息的示例代码:
密钥大小:通常可以从公钥信息中获取。如果您的 $certinfo
包含公钥信息,可以这样获取密钥大小:
$keySize = openssl_pkey_get_details($certinfo['pubKey'])['bits'];
弱密钥检查:这需要您定义什么样的密钥被认为是“弱”的。例如,如果您认为小于2048位的RSA密钥是弱的,可以这样判断:
$isWeakKey = $keySize < 2048;
SSL证书类型:这个信息一般包含在证书的X509
结构中,但直接从解析结果中获取可能不直观。通常,商业证书与自签名证书的区别在于颁发者字段是否与主题相同,但这不是严格意义上的“类型”。对于更具体的分类(如DV, OV, EV等),您可能需要查看issuerDN
和subjectDN
并结合其他外部信息。
公共密钥算法:这应该已经在 $certinfo
中,可以通过以下方式访问:
$publicKeyAlgorithm = $certinfo['pubKey']['algorithm'];
指纹(SHA256):虽然 openssl_x509_parse
不直接提供指纹,但您可以使用 openssl_x509_fingerprint
函数来计算它:
$certificateData = $certinfo['cert'];
$fingerprint = openssl_x509_fingerprint($certificateData, "sha256");
整合以上代码段,您的完整代码可能看起来像这样:
$orignal_parse = parse_url($url, PHP_URL_HOST);
$get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE)));
$read = stream_socket_client("ssl://".$orignal_parse.":443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get);
$cert = stream_context_get_params($read);
$certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
// 获取密钥大小
$keySize = openssl_pkey_get_details($certinfo['pubKey'])['bits'];
// 检查是否为弱密钥(示例条件:小于2048位)
$isWeakKey = $keySize < 2048;
// 公共密钥算法
$publicKeyAlgorithm = $certinfo['pubKey']['algorithm'];
// 计算SHA256指纹
$certificateData = $certinfo['cert'];
$fingerprint = openssl_x509_fingerprint($certificateData, "sha256");
// 输出或进一步处理这些信息
echo "密钥大小: " . $keySize . "\n";
echo "是否为弱密钥: " . ($isWeakKey ? "是" : "否") . "\n";
echo "公共密钥算法: " . $publicKeyAlgorithm . "\n";
echo "SHA256指纹: " . $fingerprint . "\n";
请注意,实际应用中可能需要根据具体情况调整上述代码,比如错误处理和对不同证书类型的更细致区分。