php - 这有意义吗:验证公共 SSL 证书?
问题描述
我试图弄清楚以下情况是否有意义。
背景资料
我正在构建一个通过 Guzzle 进行大量 REST API 调用的 PHP 平台。我真的需要确保连接是有效的,所以除了 API 授权、NAT 防火墙和有效的 HTTPS/SSL 连接之外,我还想在我们的应用程序中构建一些检查。例如,我还在验证连接来自 API 服务提供的有效 IP 子网。
问题
然后我开始查看我们正在使用的 API 服务提供的 SSL 证书。当然,安全性基于公钥/私钥,我看不到该服务使用的私钥,但我能做的是确保公钥证书仍然与我可以在本地存储的证书相同。
现在我不知道这是否有意义?我在这里的假设是,这些组织的证书只会每两年更改一次。而且我知道它不会验证任何东西,因为我不拥有私钥,但它仍然是一个额外的检查。
实际的
然后是实际的一面,是否有可能,使用openssl s_client
我能够获得 API 使用的证书。但是 Guzzle 提供的验证选项是基于 .PEM 文件并使用私钥的,对吗?
// Use a custom SSL certificate on disk.
$client->request('GET', '/', ['verify' => '/path/to/cert.pem']);
那么在 Guzzle 或基本 CURL 中是否有可能,它是否有意义,或者这只是一种虚假的安全感?
解决方案
服务提供者的公钥允许你做两件事:
- 发送只有服务提供商才能解密而其他人无法解密的加密数据。
- 一旦建立了加密连接,您就可以确定服务提供商发回的消息来自服务提供商以外的任何其他人。
没有人会提供他们的私钥。这将破坏密钥是私有的目的。但是,证书的整个想法是提供由受信任的根证书颁发机构(例如 Verisign)签名的公钥。此类受信任的根权限已预先安装在您的操作系统上或由系统管理员添加。
如果有人操纵 DNS 以误导您连接到假主机,则不会建立加密连接,因为假服务器将无法解密您的消息,因为他没有正确的私钥。
您不需要存储任何东西。连接后,收到证书后,您可以即时验证有效性:如前所述,如果证书是由存储在您的计算机上并受信任的受信任的根证书颁发机构颁发的,那么您就可以开始了。
推荐阅读
- excel - 如何删除两个单词之间的空格?
- node.js - 如何在 Xero 中获取已付账单的 webhook 通知?
- php - 使用 password_hash 时更改密码形式
- python - 如何在python中打印具有与列数不同的行数的二维数组的所有元素?
- python - 将动态变量值从机器人框架传递到 python 文件
- mysql - 如何在 MySQL 中创建一个出现计数器,每次计数器发现它出现的 id 都会增加?
- karate - 通过空手道 DSL 中的示例关键字的动态有效负载
- python-3.x - 当特定列值对于某些行数连续时如何获取行
- semantic-versioning - 当项目各部分之间的兼容性不同时如何使用语义版本控制
- uitableview - 如何分配“字符串”类型的值?输入“UIImage?”