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 相关文章推荐
打造计数器DIY三步曲(上)
Oct 09 PHP
PHP个人网站架设连环讲(二)
Oct 09 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
PHP实现根据图片色界在不同位置加水印的方法
Aug 08 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
PHP实现的CURL非阻塞调用类
Jul 26 PHP
PHP大文件切割上传并带进度条功能示例
Jul 01 PHP
Laravel 创建可以传递参数 Console服务的例子
Oct 14 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 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全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
加速IE的Javascript document输出的方法
2010/12/02 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python线程中对join方法的运用的教程
2015/04/09 Python
Python中逗号的三种作用实例分析
2015/06/08 Python
Django URL传递参数的方法总结
2016/08/28 Python
python写入已存在的excel数据实例
2018/05/03 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
土木工程应届生求职信
2013/10/31 职场文书
初中语文教学反思
2014/02/02 职场文书
2014年教研活动总结范文
2014/04/26 职场文书
财务人员担保书
2014/05/13 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
支部鉴定材料
2014/06/02 职场文书
团队拓展活动方案
2014/08/28 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
Python 键盘事件详解
2021/11/11 Python
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python
Python 文字识别
2022/05/11 Python