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 魔术函数使用说明
Feb 21 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
nginx+php-fpm配置文件的组织结构介绍
Nov 07 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
php不写闭合标签的好处
Mar 04 PHP
laravel安装和配置教程
Oct 29 PHP
smarty实现多级分类的方法
Dec 05 PHP
php cookie工作原理与实例详解
Jul 18 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
laravel框架之数据库查出来的对象实现转化为数组
Oct 23 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 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下统计用户在线时间的一种尝试
2010/08/26 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
php实现无限级分类
2014/12/24 PHP
PHP类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
Python实现统计代码行的方法分析
2017/07/12 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
python中类与对象之间的关系详解
2020/12/16 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
大一学生假期实习的自我评价
2013/10/12 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
科长竞聘演讲稿
2014/05/16 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
节约用电倡议书
2015/04/28 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
导游词之广西漓江
2019/11/02 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python