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 daddslashes()和 saddslashes()有哪些区别分析
Oct 26 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
php代码审计比较有意思的例子
May 07 PHP
php有道翻译api调用方法实例
Dec 22 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
Mar 07 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
Feb 05 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 04 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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面向对象分析设计的61条军规小结
2010/07/17 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
php自动加载方式集合
2016/04/04 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
单链表反转python实现代码示例
2018/02/08 Python
python实现Adapter模式实例代码
2018/02/09 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
python分布式计算dispy的使用详解
2019/12/22 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
如何在Python对Excel进行读取
2020/06/04 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
大学四年职业生涯规划书范文
2014/01/02 职场文书
小学数学教学反思
2014/02/02 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL