《PHP教程:PHP利用Socket獲取網站的SSL證書與公鑰》要點:
本文介紹了PHP教程:PHP利用Socket獲取網站的SSL證書與公鑰,希望對您有用。如果有疑問,可以聯系我們。
PHP學習通過 php curl 請求網頁并不能獲取到證書信息,此時需要使用 ssl socket 獲取證書內容.下面來一起看看看詳細的介紹:
PHP學習示例代碼:
PHP學習
// 創建 stream context
$context = stream_context_create([
'ssl' => [
'capture_peer_cert' => true,
'capture_peer_cert_chain' => true,
],
]);
$resource = stream_socket_client("ssl://$domain:$port", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
$cert = stream_context_get_params($resource);
$ssl = $cert['options']['ssl'];
$resource = $ssl['peer_certificate'];
// 網站證書中只有公鑰,通過 openssl_pkey_get_details 導出公鑰
$ret = [
'crt' => '',
'pub' => '',
];
$pkey = openssl_pkey_get_public($resource);
$ret['pub'] = openssl_pkey_get_details($pkey)['key'];
openssl_x509_export($resource, $pem);
$ret['crt'] = $pem;
foreach ($ssl['peer_certificate_chain'] as $resource)
{
openssl_x509_export($resource, $pem);
$ret['crt'] .= "\n" . $pem;
}
// 保存 $ret['crt'] 為 domain.crt
// 保存 $ret['pub'] 為 domain.pub
return $ret;
PHP學習驗證證書中的公鑰A是否正確,通過私鑰導出公鑰B,比較兩者發現一致.
PHP學習
$domain = 'blog.zhengxianjun.com';
$port = '443';
// ...
$pub_a = $ret['pub'];
$private_key_path = '/conf/ssl/blog.zhengxianjun.com.key';
// 證書沒有設置密碼,$passphrase 為空字符串
$pkey = openssl_pkey_get_private(file_get_content($private_key_path), $passphrase = '');
$pub_b = openssl_pkey_get_details($pkey)['key'];
// 兩者一致
var_dump($pub_a === $pub_b);
PHP學習函數 stream_socket_client 還有一個用途是當知道服務器 IP 時,能獲取到服務器可能可以使用的域名.
PHP學習
$resource = stream_socket_client("ssl://$ip:$port", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
$cert = stream_context_get_params($resource);
// 解析 X.509 格式證書
$info = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
// 獲取證書中的可信域名列表
$domain = str_replace('DNS:', '', $info['extensions']['subjectAltName']);
PHP學習以上可以看到獲取網站證書并不能獲得私鑰.
PHP學習在一些使用 CDN 的站點,如果使用了 HTTPS 同時又希望使用自有域名,是否需要將自己的私鑰提供給 CDN 廠商呢?實際上證書路徑與使用者名稱(支持 https 的域名)并不需要一致.
PHP學習也就是使用自有域名并進行 CDN 加速時不需要使用自有的 ssl 證書,只需將自己的 CDN 域名加到廠商證書的域名列表即可.
PHP學習總結
PHP學習以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對維易PHP的支持.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/613.html