PHP利用Socket获取网站的SSL证书与公钥


Posted in PHP onJune 18, 2017

通过 php curl 请求网页并不能获取到证书信息,此时需要使用 ssl socket 获取证书内容。下面来一起看看看详细的介绍:

示例代码:

// 创建 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;

验证证书中的公钥A是否正确,通过私钥导出公钥B,比较两者发现一致。

$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);

函数 stream_socket_client 还有一个用途是当知道服务器 IP 时,能获取到服务器可能可以使用的域名。

$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']);

以上可以看到获取网站证书并不能获得私钥。

在一些使用 CDN 的站点,如果使用了 HTTPS 同时又希望使用自有域名,是否需要将自己的私钥提供给 CDN 厂商呢?实际上证书路径与使用者名称(支持 https 的域名)并不需要一致。

也就是使用自有域名并进行 CDN 加速时不需要使用自有的 ssl 证书,只需将自己的 CDN 域名加到厂商证书的域名列表即可。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php array_unique之后json_encode需要注意
Jan 02 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
PHP中抽象类、接口的区别与选择分析
Mar 29 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
yii2安装详细流程
May 23 PHP
php提取微信账单的有效信息
Oct 01 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 17 PHP
phpstorm激活码2020附使用详细教程
Sep 25 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 #PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 #PHP
Laravel中log无法写入问题的解决
Jun 17 #PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 #PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
Jun 17 #PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 #PHP
thinkphp查询,3.X 5.0方法(亲试可行)
Jun 17 #PHP
You might like
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
PHP字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
PHP循环获取GET和POST值的代码
2008/04/09 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
github配置使用指南
2014/11/18 Python
Python实现自动上京东抢手机
2018/02/06 Python
python2.7实现邮件发送功能
2018/12/12 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
python实现二维数组的对角线遍历
2019/03/02 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
电气专业应届生求职信
2013/11/01 职场文书
广告业务员岗位职责
2014/02/06 职场文书
班长自荐书范文
2014/02/11 职场文书
三八活动策划方案
2014/08/17 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
教师远程培训心得体会
2016/01/09 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang