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
GD输出汉字的函数的分析
Oct 09 PHP
php防注
Jan 15 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
自己写了一个php检测文件编码的函数
Apr 21 PHP
详解PHP防止盗链防止迅雷下载的方法
Apr 26 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
php实现微信企业转账功能
Oct 02 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
May 09 PHP
php DES加密算法实例分析
Sep 18 PHP
Laravel 实现添加多语言提示信息
Oct 25 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创建PDF中文文档
2006/10/09 PHP
php横向重复区域显示二法
2008/09/25 PHP
php allow_url_include的应用和解释
2010/04/22 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
js中关于String对象的replace使用详解
2011/05/24 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
JavaScript实现重置表单(reset)的方法
2015/04/02 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
Python常用模块介绍
2014/11/21 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
浅谈python中get pass用法
2019/03/19 Python
深入了解Python在HDA中的应用
2019/09/05 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
一个C/C++编程面试题
2013/11/10 面试题
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
致铅球运动员加油稿
2014/02/13 职场文书
电子银行营销方案
2014/02/22 职场文书
党员干部承诺书范文
2014/03/25 职场文书
大学新闻系自荐书
2014/05/31 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
乐山大佛导游词
2015/02/02 职场文书
2015年大学生实习评语
2015/03/25 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
聘任书范文大全
2015/09/21 职场文书
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏