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 相关文章推荐
几种显示数据的方法的比较
Oct 09 PHP
PHP 彩色文字实现代码
Jun 29 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 PHP
关于php内存不够用的快速解决方法
Oct 26 PHP
PHP面试题之文件目录操作
Oct 15 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
php支持断点续传、分块下载的类
May 02 PHP
微信支付开发订单查询实例
Jul 12 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 PHP
PHP+MySQL实现在线测试答题实例
Jan 02 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
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
Python线程详解
2015/06/24 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
python2.7的编码问题与解决方法
2016/10/04 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
Numpy 多维数据数组的实现
2020/06/18 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
入职担保书怎么写
2014/05/12 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
2019 入党申请书范文
2019/07/10 职场文书
python中的3种定义类方法
2021/11/27 Python