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之第五天
Oct 09 PHP
php更新mysql后获取影响的行数发生异常解决方法
Mar 28 PHP
php中文字符串截取方法实例总结
Sep 30 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
Nov 12 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
54个提高PHP程序运行效率的方法
Jul 19 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 PHP
PHP命令Command模式用法实例分析
Aug 08 PHP
yii2的restful api路由实例详解
May 14 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截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
JavaScript入门基础
2015/08/12 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
python简单判断序列是否为空的方法
2015/06/30 Python
python变量不能以数字打头详解
2016/07/06 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
python实现简单文件读写函数
2021/02/25 Python
美国知名生活购物网站:Goop
2017/11/03 全球购物
会计专业自我评价
2014/02/12 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
空气的环保标语
2014/06/12 职场文书
公司外出活动方案
2014/08/14 职场文书
买卖合同协议书范本
2014/10/18 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
追讨欠款律师函
2015/06/24 职场文书