遇到一个需要双向认证的 https 网站,请教如何导出客户端证书 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
spddkevin
V2EX    Linux

遇到一个需要双向认证的 https 网站,请教如何导出客户端证书

  •  
  •   spddkevin 2020-06-12 23:58:13 +08:00 4749 次点击
    这是一个创建于 1947 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个网站需要双向认证,根据网上的一些帖子,只能 chrome 导出 der 无密码证书 curl 的话是需要有密码的客户端证书去发送, 请教这种双向认证的网站,他是怎么来颁发客户端证书的?一般双向认证不是都是预先 要在客户端装上个人证书,然后才能访问?

    19 条回复    2020-06-14 02:26:03 +08:00
    abdiweli
        1
    abdiweli  
       2020-06-13 00:13:33 +08:00
    需要本地装一个证书吧,这个证书应该是从这个网站获取吧?!我们以前做过一个数字证书登录的系统,也是需要给用户办法一个证书,用户把证书导入到浏览器后才能访问。
    Tink
        2
    Tink  
    PRO
       2020-06-13 00:22:28 +08:00 via iPhone
    注册的时候从网站下载
    testtest1987
        3
    testtest1987  
       2020-06-13 00:24:52 +08:00 via iPhone
    客户端证书是由 ca 签发的
    jinliming2
        4
    jinliming2  
       2020-06-13 00:26:54 +08:00   1
    客户端证书和网站证书其实是一样,只是一个属性不一样而已。
    就是证书上的 extendedKeyUsage 这个属性,网站证书是 serverAuth 表示证明服务器身份,客户端证书是 clientAuth 表示证明客户端身份。
    首先,网站管理员需要一个 CA 证书,可以是公共的 CA,也可以是自签名的 CA,这个 CA 是不需要被信任的,只用来验证。
    然后和签发网站证书一样,用这个 CA 证书去签发客户端证书,只要 extendedKeyUsage 设置为 clientAuth 就可以了。
    签发过程通常是客户端生成私钥,然后客户端生成证书请求 CSR 给服务端,服务端拿到证书请求 CSR 用 CA 证书的私钥签发客户端证书返回给客户端,客户端拿到证书后配合私钥使用以证明自己的身份。但是也有的是直接这一切全在服务端生成(包括私钥),然后直接给客户端提供一个打包了证书和私钥的文件。

    双向认证的时候,客户端需要提供自己的证书,以证明自己的身份,服务端使用签发证书的 CA 来验证来自客户端的证书确实是自己签发的。
    spddkevin
        5
    spddkevin  
    OP
       2020-06-13 00:44:14 +08:00   1
    @jinliming2
    谢谢,明白了,这样的话,具体我们怎么用 curl 去访问这个网站呢?
    jiangzm
        6
    jiangzm  
       2020-06-13 00:51:37 +08:00
    @jinliming2 讲的很清楚了, 一般客户端证书需要手动安装的,比如支付宝证书就是本地安装客户端的时候导入到系统的。
    spddkevin
        7
    spddkevin  
    OP
       2020-06-13 00:55:43 +08:00
    @jiangzm
    双向认证证书,有些是不需要客户端手动安装的
    jiangzm
        8
    jiangzm  
       2020-06-13 01:03:59 +08:00
    我说的是浏览器访问的情况, 如果用 curl 给定客户端证书参数就好了

    curl -cert client.pem --key key.pem https://doamin.com

    或者

    curl --cert all.pem https://doamin.com
    spddkevin
        9
    spddkevin  
    OP
       2020-06-13 01:10:08 +08:00
    @jiangzm
    这个命令我知道的,主要是怎么获取到客户端证书(是服务器端实时颁发的),我从浏览器导出,用 curl 但证书没有私钥
    jianglai
        10
    jianglai  
       2020-06-13 01:33:09 +08:00 via iPad
    @spddkevin 客户证书肯定是要 out of band 获取的,如果你访问网站的时候实时颁发证书,意义何在?
    jiangzm
        11
    jiangzm  
       2020-06-13 02:32:51 +08:00
    @spddkevin 如果你的浏览器访问目标网站已经可以双向认证了,说明证书已经在系统证书列表了,你要做的是从系统证书列表导出你的包含私钥的客户端证书(一定是包含私钥的)。

    我猜你还没弄明白客户端证书如何安装到你的系统的,一定是直接安装证书或者安装本地软件间接安装的(这两者都会询问用户授权安装本地客户端证书)。
    浏览器主动访问是不可能下发客户端认证证书的,即使能这么做,也存在系统安全问题。
    spddkevin
        12
    spddkevin  
    OP
       2020-06-13 09:15:12 +08:00
    @jiangzm
    @jianglai
    就像 @jinliming2 说的那样,这个网站的证书 extendedKeyUsage(增强型身份验证) 属性这里即有服务器身份验证,又有客户端身份验证,说明这个证书是一证两用,但我导出这个证书的 der x509 是不包含客户端证书密钥,而 curl --cert 是必须要有客户端证书密钥才能请求的,所以这里我就不明白了,他这个一证 2 用怎么回事
    mengyx
        13
    mengyx  
       2020-06-13 09:27:47 +08:00
    @spddkevin 谁让你一证两用了。当然是每个客户端单独签发一张新证书了,难道你还把服务器证书私钥给用户吗?
    jianglai
        14
    jianglai  
       2020-06-13 09:33:40 +08:00 via iPad
    @spddkevin 可以做为客户端证书并不说明你可以拿来用,就像楼上说的你怎么可能拿到这个证书的密钥?
    autoxbc
        15
    autoxbc  
       2020-06-13 11:11:01 +08:00
    客户端私钥就是服务器验证客户端身份用的,没私钥验证的话实时发的密钥只能加密用,不能验证用,这是单向验证双向加密,不是双向认证
    testcaoy7
        16
    testcaoy7  
       2020-06-13 18:03:08 +08:00
    客户端证书可以用不同的 CA 颁发,你甚至可以用 EasyRSA 自己做一个
    jiangzm
        17
    jiangzm  
       2020-06-14 02:22:40 +08:00
    @testcaoy7 https 双向认证在服务端是要配置客户端证书的(一般是根证书公钥),所以不是找个有资质的 CA 签发就行还得服务端信任。

    @spddkevin 即使服务端证书和客户端证书用的是同一个(理论上应该是可以的,实际应该不会有人这么做),那也不可能从客户端导出包含私钥的证书啊?你先搞清楚证书的公钥和私钥,一般我们说的证书都是指公钥,证书可以给任何人私钥只有自己有用来验证客户端发来的交换密钥。

    你的理解是不是客户端和服务端在协商过程中就把私钥给下发了???
    你先明白几个点不好好,https 单向认证 服务端证书(公钥)下发给客户端,浏览器能拿到也能导出来,客户端用这个证书加密对称机密密钥给服务端,服务端用私钥解密出来,两边就可以用这个对称密钥通信了。
    https 双向认证 除了会下发服务端证书(公钥)给客户端,客户端也会下发客户端证书(公钥)给服务端,服务端会校验是不是配置信任的 CA 证书下发的证书(公钥),然后两边都有自己的私钥才能进行双向认证。

    如果你本地浏览器访问某网站已经是双向证书认证了(具体是不是用 wireshark 抓包看看),你系统证书列表一定存在包含私钥的客户端证书,只是你不知道在何时手动导入的。
    还有种可能其实服务端并未开启双向认证,你本地肯定只有服务端证书(公钥)了。
    jiangzm
        18
    jiangzm  
       2020-06-14 02:24:20 +08:00
    @spddkevin 私钥一定是手动给的
    jiangzm
        19
    jiangzm  
       2020-06-14 02:26:03 +08:00
    @spddkevin 如果是公网的网站 你就说下是哪个网站,可以一看究竟
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     985 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:04 PVG 07:04 LAX 16:04 JFK 19:04
    Do have faith in what you're doing.
    ubao 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