这个网站需要双向认证,根据网上的一些帖子,只能 chrome 导出 der 无密码证书 curl 的话是需要有密码的客户端证书去发送, 请教这种双向认证的网站,他是怎么来颁发客户端证书的?一般双向认证不是都是预先 要在客户端装上个人证书,然后才能访问?
1
abdiweli 2020-06-13 00:13:33 +08:00
需要本地装一个证书吧,这个证书应该是从这个网站获取吧?!我们以前做过一个数字证书登录的系统,也是需要给用户办法一个证书,用户把证书导入到浏览器后才能访问。
|
2
Tink 2020-06-13 00:22:28 +08:00 via iPhone
注册的时候从网站下载
|
3
testtest1987 2020-06-13 00:24:52 +08:00 via iPhone
客户端证书是由 ca 签发的
|
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 来验证来自客户端的证书确实是自己签发的。 |
5
spddkevin OP @jinliming2
谢谢,明白了,这样的话,具体我们怎么用 curl 去访问这个网站呢? |
6
jiangzm 2020-06-13 00:51:37 +08:00
@jinliming2 讲的很清楚了, 一般客户端证书需要手动安装的,比如支付宝证书就是本地安装客户端的时候导入到系统的。
|
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 |
9
spddkevin OP @jiangzm
这个命令我知道的,主要是怎么获取到客户端证书(是服务器端实时颁发的),我从浏览器导出,用 curl 但证书没有私钥 |
10
jianglai 2020-06-13 01:33:09 +08:00 via iPad
@spddkevin 客户证书肯定是要 out of band 获取的,如果你访问网站的时候实时颁发证书,意义何在?
|
11
jiangzm 2020-06-13 02:32:51 +08:00
@spddkevin 如果你的浏览器访问目标网站已经可以双向认证了,说明证书已经在系统证书列表了,你要做的是从系统证书列表导出你的包含私钥的客户端证书(一定是包含私钥的)。
我猜你还没弄明白客户端证书如何安装到你的系统的,一定是直接安装证书或者安装本地软件间接安装的(这两者都会询问用户授权安装本地客户端证书)。 浏览器主动访问是不可能下发客户端认证证书的,即使能这么做,也存在系统安全问题。 |
12
spddkevin OP @jiangzm
@jianglai 就像 @jinliming2 说的那样,这个网站的证书 extendedKeyUsage(增强型身份验证) 属性这里即有服务器身份验证,又有客户端身份验证,说明这个证书是一证两用,但我导出这个证书的 der x509 是不包含客户端证书密钥,而 curl --cert 是必须要有客户端证书密钥才能请求的,所以这里我就不明白了,他这个一证 2 用怎么回事 |
14
jianglai 2020-06-13 09:33:40 +08:00 via iPad
@spddkevin 可以做为客户端证书并不说明你可以拿来用,就像楼上说的你怎么可能拿到这个证书的密钥?
|
15
autoxbc 2020-06-13 11:11:01 +08:00
客户端私钥就是服务器验证客户端身份用的,没私钥验证的话实时发的密钥只能加密用,不能验证用,这是单向验证双向加密,不是双向认证
|
16
testcaoy7 2020-06-13 18:03:08 +08:00
客户端证书可以用不同的 CA 颁发,你甚至可以用 EasyRSA 自己做一个
|
17
jiangzm 2020-06-14 02:22:40 +08:00
@testcaoy7 https 双向认证在服务端是要配置客户端证书的(一般是根证书公钥),所以不是找个有资质的 CA 签发就行还得服务端信任。
@spddkevin 即使服务端证书和客户端证书用的是同一个(理论上应该是可以的,实际应该不会有人这么做),那也不可能从客户端导出包含私钥的证书啊?你先搞清楚证书的公钥和私钥,一般我们说的证书都是指公钥,证书可以给任何人私钥只有自己有用来验证客户端发来的交换密钥。 你的理解是不是客户端和服务端在协商过程中就把私钥给下发了??? 你先明白几个点不好好,https 单向认证 服务端证书(公钥)下发给客户端,浏览器能拿到也能导出来,客户端用这个证书加密对称机密密钥给服务端,服务端用私钥解密出来,两边就可以用这个对称密钥通信了。 https 双向认证 除了会下发服务端证书(公钥)给客户端,客户端也会下发客户端证书(公钥)给服务端,服务端会校验是不是配置信任的 CA 证书下发的证书(公钥),然后两边都有自己的私钥才能进行双向认证。 如果你本地浏览器访问某网站已经是双向证书认证了(具体是不是用 wireshark 抓包看看),你系统证书列表一定存在包含私钥的客户端证书,只是你不知道在何时手动导入的。 还有种可能其实服务端并未开启双向认证,你本地肯定只有服务端证书(公钥)了。 |