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

2020-06-12 23:58:13 +08:00
 spddkevin

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

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

双向认证的时候,客户端需要提供自己的证书,以证明自己的身份,服务端使用签发证书的 CA 来验证来自客户端的证书确实是自己签发的。
spddkevin
2020-06-13 00:44:14 +08:00
@jinliming2
谢谢,明白了,这样的话,具体我们怎么用 curl 去访问这个网站呢?
jiangzm
2020-06-13 00:51:37 +08:00
@jinliming2 讲的很清楚了, 一般客户端证书需要手动安装的,比如支付宝证书就是本地安装客户端的时候导入到系统的。
spddkevin
2020-06-13 00:55:43 +08:00
@jiangzm
双向认证证书,有些是不需要客户端手动安装的
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
2020-06-13 01:10:08 +08:00
@jiangzm
这个命令我知道的,主要是怎么获取到客户端证书(是服务器端实时颁发的),我从浏览器导出,用 curl 但证书没有私钥
jianglai
2020-06-13 01:33:09 +08:00
@spddkevin 客户证书肯定是要 out of band 获取的,如果你访问网站的时候实时颁发证书,意义何在?
jiangzm
2020-06-13 02:32:51 +08:00
@spddkevin 如果你的浏览器访问目标网站已经可以双向认证了,说明证书已经在系统证书列表了,你要做的是从系统证书列表导出你的包含私钥的客户端证书(一定是包含私钥的)。

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

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

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

如果你本地浏览器访问某网站已经是双向证书认证了(具体是不是用 wireshark 抓包看看),你系统证书列表一定存在包含私钥的客户端证书,只是你不知道在何时手动导入的。
还有种可能其实服务端并未开启双向认证,你本地肯定只有服务端证书(公钥)了。
jiangzm
2020-06-14 02:24:20 +08:00
@spddkevin 私钥一定是手动给的
jiangzm
2020-06-14 02:26:03 +08:00
@spddkevin 如果是公网的网站 你就说下是哪个网站,可以一看究竟

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

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

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

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

© 2021 V2EX