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完全过滤HTML,JS,CSS等标签
Jan 16 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
PHP高级对象构建 工厂模式的使用
Feb 05 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
PHP APC缓存配置、使用详解
Mar 06 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
Smarty最简单实现列表奇偶变色的方法
Jul 01 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
PHP copy函数使用案例代码解析
Sep 01 PHP
浅谈PHP7中的一些小技巧
May 29 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判断json格式是否正确的实现代码
2017/09/20 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
大学四年规划书范文
2013/12/27 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
大型晚会策划方案
2014/02/06 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
员工年终考核评语
2014/12/31 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
微观世界观后感
2015/06/10 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python