PHP利用Socket獲取網(wǎng)站的SSL證書與公鑰
通過(guò) php curl 請(qǐng)求網(wǎng)頁(yè)并不能獲取到證書信息,此時(shí)需要使用 ssl socket 獲取證書內(nèi)容。下面來(lái)一起看看看詳細(xì)的介紹:
示例代碼:
// 創(chuàng)建 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'];
// 網(wǎng)站證書中只有公鑰,通過(guò) openssl_pkey_get_details 導(dǎo)出公鑰
$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;
驗(yàn)證證書中的公鑰A是否正確,通過(guò)私鑰導(dǎo)出公鑰B,比較兩者發(fā)現(xiàn)一致。
$domain = 'blog.zhengxianjun.com'; $port = '443'; // ... $pub_a = $ret['pub']; $private_key_path = '/conf/ssl/blog.zhengxianjun.com.key'; // 證書沒有設(shè)置密碼,$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);
函數(shù) stream_socket_client 還有一個(gè)用途是當(dāng)知道服務(wù)器 IP 時(shí),能獲取到服務(wù)器可能可以使用的域名。
$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']);
以上可以看到獲取網(wǎng)站證書并不能獲得私鑰。
在一些使用 CDN 的站點(diǎn),如果使用了 HTTPS 同時(shí)又希望使用自有域名,是否需要將自己的私鑰提供給 CDN 廠商呢?實(shí)際上證書路徑與使用者名稱(支持 https 的域名)并不需要一致。
也就是使用自有域名并進(jìn)行 CDN 加速時(shí)不需要使用自有的 ssl 證書,只需將自己的 CDN 域名加到廠商證書的域名列表即可。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
ThinkPHP基于think-queue的隊(duì)列插件實(shí)現(xiàn)消息推送
think-queue是ThinkPHP官方提供的一個(gè)消息隊(duì)列服務(wù),是專門支持隊(duì)列服務(wù)的擴(kuò)展包。think-queue消息隊(duì)列適用于大并發(fā)或返回結(jié)果時(shí)間比較長(zhǎng)且需要批量操作的第三方接口,可用于短信發(fā)送、郵件發(fā)送、APP推送。2022-12-12
php面試實(shí)現(xiàn)反射注入的詳細(xì)方法
在本篇文章里小編給大家整理了關(guān)于php面試怎么實(shí)現(xiàn)反射注入的相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2019-09-09
windows服務(wù)器中檢測(cè)PHP SSL是否開啟以及開啟SSL的方法
這篇文章主要介紹了windows服務(wù)器中檢測(cè)PHP SSL是否開啟以及開啟SSL的方法,需要的朋友可以參考下2014-04-04
解決Mac OS X 自帶PHP環(huán)境gd庫(kù)擴(kuò)展缺少freetype的問(wèn)題
下面小編就為大家分享一篇解決Mac OS X 自帶PHP環(huán)境gd庫(kù)擴(kuò)展缺少freetype的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
php上的memcache和memcached兩個(gè)pecl庫(kù)
一開始就在疑惑為什么會(huì)有兩個(gè)庫(kù),且在php.net官方都有文檔支持。2010-03-03
PHP下ajax跨域的解決方案之window.name實(shí)例分析
這篇文章主要介紹了PHP下ajax跨域的解決方案之window.name,結(jié)合實(shí)例形式分析PHP ajax跨域的解決方案window.name基本原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-03-03
php daddslashes()和 saddslashes()有哪些區(qū)別分析
在Discuze 開源項(xiàng)目中會(huì)經(jīng)常用到 saddslashes 函數(shù),這里簡(jiǎn)單介紹下,方便需要的朋友2012-10-10

