V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
spddkevin
V2EX  ›  Linux

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

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

    这个网站需要双向认证,根据网上的一些帖子,只能 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  
       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   ·   我们的愿景   ·   实用小工具   ·   2584 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:31 · PVG 12:31 · LAX 21:31 · JFK 00:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.