PHP 怎样才能验证 ssl/tls 证书的有效性 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
caola
V2EX    PHP

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

  •  
  •   caola Aug 14, 2020 4890 views
    This topic created in 2082 days ago, the information mentioned may be changed or developed.

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

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

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

    10 replies    2020-08-17 11:15:42 +08:00
    julyclyde
        1
    julyclyde  
       Aug 14, 2020
    调 openssl
    x509 verify
    caola
        2
    caola  
    OP
       Aug 14, 2020
    @julyclyde PHP 的 openssl_x509_verify() 只是验证,公钥和私钥是否对的(包括自签证书),无法判断出是否可信机构签发并且是有效的
    除了调用外部的其他程序验证,我真想不出还有什么方法
    foMM
        3
    foMM  
       Aug 14, 2020 via Android
    解构证书文件,获取 ocsp 地址,然后查 ocsp
    julyclyde
        4
    julyclyde  
       Aug 14, 2020 via iPad
    @caola 我的意思是调用外部命令 openssl 不是 php 的 openssl 扩展
    不过真是没想到 php 的 openssl 扩展居然不支持从 CA 验证证书
    xiangyuecn
        5
    xiangyuecn  
       Aug 15, 2020
    按道理就是 用你的可信根证书列表(系统自带?)里面的根证书对 某个证书进行校验就 ok 了,签名正确就 ok,简单点不管吊销过期什么的。

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

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

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

    上面的两个方法都不能验证吊销和日期,都要手动拿所有的信任根 CA 列表去验证,
    其实吊销就不太重要了,日期可以直接读取出来手动判断,
    虽然不完美,但是能用就行了
    julyclyde
        9
    julyclyde  
       Aug 17, 2020
    @jim9606 为什么不要使用系统的证书存储啊?
    julyclyde
        10
    julyclyde  
       Aug 17, 2020
    @xiangyuecn 服务器端一般出示证书链,全链或者缺一层根的链
    About     Help     Advertise     Blog     API     FAQ     Solana     3315 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 62ms UTC 13:14 PVG 21:14 LAX 06:14 JFK 09:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86