PHP 怎样才能验证 ssl/tls 证书的有效性

2020-08-14 18:08:28 +08:00
 caola

现在本地有公钥和私钥(客户端上传的),但不清楚这证书是否 可信证书机构签发并且是有效的

php 可以通过 curl 和 stream_socket_client 建立握手时验证(这是架设好的服务器连接上)

想问下大家有没有什么方法,php 直接对证书文件进行真实性的验证,或者有什么插件和其他的方法。

4040 次点击
所在节点    PHP
10 条回复
julyclyde
2020-08-14 18:20:02 +08:00
调 openssl
x509 verify
caola
2020-08-14 20:57:29 +08:00
@julyclyde PHP 的 openssl_x509_verify() 只是验证,公钥和私钥是否对的(包括自签证书),无法判断出是否可信机构签发并且是有效的
除了调用外部的其他程序验证,我真想不出还有什么方法
foMM
2020-08-14 23:21:43 +08:00
解构证书文件,获取 ocsp 地址,然后查 ocsp
julyclyde
2020-08-14 23:45:10 +08:00
@caola 我的意思是调用外部命令 openssl 不是 php 的 openssl 扩展
不过真是没想到 php 的 openssl 扩展居然不支持从 CA 验证证书
xiangyuecn
2020-08-15 00:02:52 +08:00
按道理就是 用你的可信根证书列表(系统自带?)里面的根证书对 某个证书进行校验就 ok 了,签名正确就 ok,简单点不管吊销过期什么的。

然后就出来了一连串的:
根证书签发的中间证书的验证
中间证书签发的中间证书验证
....
中间证书签发的证书验证
验证完。

怎么进行验证就要一个礼拜来学了。如果你系统里面+证书里面都没有某个中间证书,还会出现证书链丢失的问题,还要用户上传证书链😂 可怕不可怕
jim9606
2020-08-15 07:28:19 +08:00
具体验证逻辑还挺复杂的,尽量用 openssl CLI 来验证吧,也就是 @julyclyde 说的方法。信任根 CA 建议自己打包一个列表,不要直接用系统的证书存储。

一路下来验证要点还蛮多的,除了要构成链条,还要检查算法强度、证书目的、使用者名称、有效期等。
jinliming2
2020-08-15 11:40:42 +08:00
curl 、openssl 之类 linux 下的应用都是使用 ca-certificates 这个包提供的 CA 证书列表来信任的。
所以你可以直接下载这个包( ubuntu 仓库镜像下载或者直接 apt 下载 deb 包),解压,就可以得到所有可信 CA 的列表了。
你可以再根据需要删除或增加部分 CA 证书。
然后用这个 CA 证书列表去验证你要验证的证书是否是可信的。
caola
2020-08-16 13:41:20 +08:00
@foMM @jim9606 @jinliming2 @julyclyde @xiangyuecn 感谢各位的回答,我目前找到两个解决方法
第一:使用 phpseclib 这个包勉强能用(不完美)
第二:按 php 官方文档 openssl_verify() 函数下面[mikey at badpenguins dot com] 给出的链接(代码)来修改一下,但这个必须要知道所有的证书链才能一级一级的验证(完整证书链的证书才能)

上面的两个方法都不能验证吊销和日期,都要手动拿所有的信任根 CA 列表去验证,
其实吊销就不太重要了,日期可以直接读取出来手动判断,
虽然不完美,但是能用就行了
julyclyde
2020-08-17 11:15:00 +08:00
@jim9606 为什么不要使用系统的证书存储啊?
julyclyde
2020-08-17 11:15:42 +08:00
@xiangyuecn 服务器端一般出示证书链,全链或者缺一层根的链

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/698323

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX