技术解析

遇到一个需要双向认证的 https 网站,请教如何导出客户端证书
0
2021-06-17 16:35:14
idczone

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


需要本地装一个证书吧,这个证书应该是从这个网站获取吧?!我们以前做过一个数字证书登录的系统,也是需要给用户办法一个证书,用户把证书导入到浏览器后才能访问。

注册的时候从网站下载

客户端证书是由 ca 签发的

客户端证书和网站证书其实是一样,只是一个属性不一样而已。
就是证书上的 extendedKeyUsage 这个属性,网站证书是 serverAuth 表示证明服务器身份,客户端证书是 clientAuth 表示证明客户端身份。
首先,网站管理员需要一个 CA 证书,可以是公共的 CA,也可以是自签名的 CA,这个 CA 是不需要被信任的,只用来验证。
然后和签发网站证书一样,用这个 CA 证书去签发客户端证书,只要 extendedKeyUsage 设置为 clientAuth 就可以了。
签发过程通常是客户端生成私钥,然后客户端生成证书请求 CSR 给服务端,服务端拿到证书请求 CSR 用 CA 证书的私钥签发客户端证书返回给客户端,客户端拿到证书后配合私钥使用以证明自己的身份。但是也有的是直接这一切全在服务端生成(包括私钥),然后直接给客户端提供一个打包了证书和私钥的文件。
双向认证的时候,客户端需要提供自己的证书,以证明自己的身份,服务端使用签发证书的 CA 来验证来自客户端的证书确实是自己签发的。


谢谢,明白了,这样的话,具体我们怎么用 curl 去访问这个网站呢?

讲的很清楚了, 一般客户端证书需要手动安装的,比如支付宝证书就是本地安装客户端的时候导入到系统的。


双向认证证书,有些是不需要客户端手动安装的

我说的是浏览器访问的情况, 如果用 curl 给定客户端证书参数就好了
curl -cert client.pem --key key.pem https://doamin.com
或者
curl --cert all.pem https://doamin.com


这个命令我知道的,主要是怎么获取到客户端证书(是服务器端实时颁发的),我从浏览器导出,用 curl 但证书没有私钥

客户证书肯定是要 out of band 获取的,如果你访问网站的时候实时颁发证书,意义何在?

如果你的浏览器访问目标网站已经可以双向认证了,说明证书已经在系统证书列表了,你要做的是从系统证书列表导出你的包含私钥的客户端证书(一定是包含私钥的)。
我猜你还没弄明白客户端证书如何安装到你的系统的,一定是直接安装证书或者安装本地软件间接安装的(这两者都会询问用户授权安装本地客户端证书)。
浏览器主动访问是不可能下发客户端认证证书的,即使能这么做,也存在系统安全问题。



就像 说的那样,这个网站的证书 extendedKeyUsage(增强型身份验证) 属性这里即有服务器身份验证,又有客户端身份验证,说明这个证书是一证两用,但我导出这个证书的 der x509 是不包含客户端证书密钥,而 curl --cert 是必须要有客户端证书密钥才能请求的,所以这里我就不明白了,他这个一证 2 用怎么回事

谁让你一证两用了。当然是每个客户端单独签发一张新证书了,难道你还把服务器证书私钥给用户吗?

可以做为客户端证书并不说明你可以拿来用,就像楼上说的你怎么可能拿到这个证书的密钥?

客户端私钥就是服务器验证客户端身份用的,没私钥验证的话实时发的密钥只能加密用,不能验证用,这是单向验证双向加密,不是双向认证

客户端证书可以用不同的 CA 颁发,你甚至可以用 EasyRSA 自己做一个

https 双向认证在服务端是要配置客户端证书的(一般是根证书公钥),所以不是找个有资质的 CA 签发就行还得服务端信任。
即使服务端证书和客户端证书用的是同一个(理论上应该是可以的,实际应该不会有人这么做),那也不可能从客户端导出包含私钥的证书啊?你先搞清楚证书的公钥和私钥,一般我们说的证书都是指公钥,证书可以给任何人私钥只有自己有用来验证客户端发来的交换密钥。
你的理解是不是客户端和服务端在协商过程中就把私钥给下发了???
你先明白几个点不好好,https 单向认证 服务端证书(公钥)下发给客户端,浏览器能拿到也能导出来,客户端用这个证书加密对称机密密钥给服务端,服务端用私钥解密出来,两边就可以用这个对称密钥通信了。
https 双向认证 除了会下发服务端证书(公钥)给客户端,客户端也会下发客户端证书(公钥)给服务端,服务端会校验是不是配置信任的 CA 证书下发的证书(公钥),然后两边都有自己的私钥才能进行双向认证。
如果你本地浏览器访问某网站已经是双向证书认证了(具体是不是用 wireshark 抓包看看),你系统证书列表一定存在包含私钥的客户端证书,只是你不知道在何时手动导入的。
还有种可能其实服务端并未开启双向认证,你本地肯定只有服务端证书(公钥)了。

私钥一定是手动给的

如果是公网的网站 你就说下是哪个网站,可以一看究竟

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服