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 正则表达式小结
Aug 31 PHP
php操作mysqli(示例代码)
Oct 28 PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
thinkPHP2.1自定义标签库的导入方法详解
Jul 20 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
Dec 08 PHP
php批量删除操作(数据访问)
May 23 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
Oct 16 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
Yii2中datetime类的使用
2016/12/17 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
jquery 选择器部分整理
2009/10/28 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
浅谈node的事件机制
2017/10/09 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
python使用7z解压软件备份文件脚本分享
2014/02/21 Python
使用python实现扫描端口示例
2014/03/29 Python
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
使用Python对Access读写操作
2017/03/30 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
九月份红领巾广播稿
2014/01/22 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
建材投资建议书
2014/05/16 职场文书
车辆转让协议书
2014/09/24 职场文书