V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
main1234
V2EX  ›  程序员

有爹知道 https 双向认证时候,服务端使用客户端证书干了什么么?

  •  1
     
  •   main1234 · 2024-03-15 10:19:23 +08:00 · 7142 次点击
    这是一个创建于 376 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在单向认证时候,服务端发给客户端证书,客户端校验证书然后用证书里面的公钥加密了一个 random ,服务端收到 random 后用私钥解密,为双方的第三个 random

    那么在双向认证时候,客户端发给服务端证书,服务端到底用客户端证书干了什么???查了一些博客,现在有几种说法

    1.只验证 2.验证+服务端用客户端公钥加密了加密套件,客户端用私钥解密加密套件 3.验证+服务端用客户端公钥加密 random-S

    在第二种说法中,加密套件不是 client hello 时候客户端发过去的么?在 server hello 后服务端会选择一个加密方案,双向认证时候,加密套件在客户端验证完服务端证书后发送??

    50 条回复    2024-03-16 19:59:44 +08:00
    Belmode
        1
    Belmode  
       2024-03-15 10:22:41 +08:00   ❤️ 18
    别客气。

    不是很清楚~
    suzhenyu
        2
    suzhenyu  
       2024-03-15 10:27:01 +08:00
    @Belmode 哈哈哈,这人太坏了,还配合上这个头像。
    Hf1G1sGBYS8QSLN8
        3
    Hf1G1sGBYS8QSLN8  
       2024-03-15 10:27:30 +08:00   ❤️ 20
    ThirdFlame
        4
    ThirdFlame  
       2024-03-15 10:29:38 +08:00
    客户端将发送的信息 算哈希。 将哈希用客户端自己的私钥加密。发送给服务端。

    服务端用客户的公钥解密,得到哈希。 并那这个哈希和客户端发送来的信息哈希比较,如果一致就说明这个信息时客户端发来的,并且没有被篡改。
    busier
        5
    busier  
       2024-03-15 10:33:57 +08:00 via iPhone
    服务端会获取客户端证书的信息 诸如 CN 等等。

    你可以拿 phpinfo()测试一下,好像是在 SERVER[ ]里面

    利用这个特性可以实现证书登陆验证
    FaiChou
        6
    FaiChou  
       2024-03-15 10:37:22 +08:00   ❤️ 1
    这篇讲的很详细,可以参考下

    http://www.884358.com/https-auth/
    tool2d
        7
    tool2d  
       2024-03-15 10:39:17 +08:00
    没你想那么复杂。

    做微信支付的时候,官方 API 要求 SSL 请求必须带客户端证书,好知道你是谁。客户端证书就仅仅是校验用户身份的作用,和你用证书来登录远程 SSH 一样,没啥区别。

    内容加密还是走老一套 TLS 。
    gps949
        8
    gps949  
       2024-03-15 10:44:22 +08:00   ❤️ 1
    Od37v61n5s89gXx8
        9
    Od37v61n5s89gXx8  
       2024-03-15 10:48:21 +08:00
    孩子你可以抓包看交互的过程
    tool2d
        10
    tool2d  
       2024-03-15 10:55:46 +08:00
    "在 server hello 后服务端会选择一个加密方案,双向认证时候,加密套件在客户端验证完服务端证书后发送??"

    不是,是一起发送的。你可以看 6 楼的文章里的 curl 输出,第一行是客户端证书,第二行是加密套件里的 key(也就是双方随机数计算的 pre-master secret),第三行是用客户端密钥计算的 hash 校验,防中间人篡改,三个包是连续一起发送的。

    如果客户端证书没问题,那么服务器直接就 SSL 握手完成了,不会再次请求加密 KEY 。

    * TLSv1.2 (OUT), TLS handshake, Certificate (11):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS handshake, CERT verify (15):
    wyh19970626
        11
    wyh19970626  
       2024-03-15 11:09:54 +08:00
    只做验证,服务端自签的 ca 签发客户端证书,用户携带客户端证书访问系统,服务端 Ca 校验客户端证书有效性。
    siweipancc
        12
    siweipancc  
       2024-03-15 11:36:33 +08:00 via iPhone
    ……这个不是有规范文档吗,还是我看的那份是假的?
    bruce0
        13
    bruce0  
       2024-03-15 11:49:11 +08:00
    我理解的, 单向的 https 中, 只有客户端,校验服务端是否是正确的(一般来说,会校验域名和证书是否一致)

    在双向认证的 https 中, 不光客户端校验服务端, 服务端也会校验客户端是否靠谱(使用服务端保存的客户端根证书来校验客户端发来的公钥)
    ShinichiYao
        14
    ShinichiYao  
       2024-03-15 11:54:22 +08:00
    就像你确认服务器是你要访问的服务器一样,可以确认访问服务器的是你
    yuepu
        15
    yuepu  
       2024-03-15 12:37:43 +08:00
    可以看看 SSL 的握手:
    awalkingman
        17
    awalkingman  
       2024-03-15 12:46:58 +08:00   ❤️ 2
    评论区很和谐有爱
    yulgang
        18
    yulgang  
       2024-03-15 12:58:30 +08:00   ❤️ 1
    luzemin
        19
    luzemin  
       2024-03-15 13:10:09 +08:00   ❤️ 21
    这就是提问的艺术!你看评论区有冷嘲热讽的吗?没有。
    Dynesshely
        20
    Dynesshely  
       2024-03-15 13:19:41 +08:00 via Android
    @luzemin 确实很聪明,op 有意思
    ydpro
        21
    ydpro  
       2024-03-15 13:42:16 +08:00
    双向 SSL 就是服务器和客户端相互验证以增强安全性 。,客户端和服务器交换证书以验证彼此的身份。客户端证书由服务器信任的证书颁发机构( CA )创建,而服务器证书由客户端信任的 CA 创建。这种相互验证确保了更强大的安全设置,双方在建立安全连接之前验证彼此的证书。双向 SSL 在组织希望将其平台的访问限制在特定用户的场景中特别有用,降低了在线交易中欺诈的风险
    https://cheapsslsecurity.com/p/what-is-2-way-ssl-and-how-does-it-work/
    zbowen66
        22
    zbowen66  
       2024-03-15 13:44:24 +08:00   ❤️ 19
    sleepybear1113
        23
    sleepybear1113  
       2024-03-15 13:47:51 +08:00
    学到了,下次如果我也遇到一些问题,学 op 问爹找解决方案,回复友好还更多
    ydpro
        24
    ydpro  
       2024-03-15 13:51:10 +08:00
    @ydpro 浏览器向服务器:嗨,老哥,这是我支持的加密方式和兼容的 SSL/TLS 版本,我们可以这样安全地聊天吗?(客户端发送“客户端问候”消息,包含支持的密码套件和兼容的 SSL/TLS 版本信息)

    服务器回复浏览器:嘿,听起来不错,这是我的名片(公钥证书),我也想知道你的信息,我们才能更好地交流。(服务器回应“服务器问候”消息,提供自己的公证书,并请求客户端的证书)

    浏览器查看服务器的名片,确认这是个值得信赖的老哥,然后回应:好的,我查了一下,你的名片(证书)没问题,现在轮到我了,这是我的名片(客户端证书)。(浏览器验证服务器证书后,发送自己的 SSL 证书给服务器)

    服务器仔细检查浏览器的名片,确认无误后说:很好,你的名片(证书)我也认可了,现在我们可以安心地交流了。(服务器验证客户端证书后,建立安全连接)
    huangqihong
        25
    huangqihong  
       2024-03-15 14:01:12 +08:00   ❤️ 3
    这是我最近一年看过回复最友好,最积极的帖子了
    yujianwjj
        26
    yujianwjj  
       2024-03-15 14:04:47 +08:00
    我要向楼主学习提问的技巧
    magicZ
        27
    magicZ  
       2024-03-15 14:07:11 +08:00
    学会了,提问的艺术
    oneKnow
        28
    oneKnow  
       2024-03-15 14:07:33 +08:00   ❤️ 3
    建议 op 出本书,就叫《提问的艺术》
    corcre
        29
    corcre  
       2024-03-15 14:14:28 +08:00
    @oneKnow 已经有了, 但是我觉得可以给 op 单独开一章🐶
    shawndev
        30
    shawndev  
       2024-03-15 14:15:56 +08:00
    两个独立的问题。

    1. 你描述中的第一句,只在部分条件下适用。TLS 1.2 之前是支持 PSK 方式的预共享密钥。TLS 1.2 及之后只支持密钥协商。
    2. 双向校验的核心是,HTTPS 的安全是建立在对于 CA 机构证书链的信任。双向校验的核心是,服务端只信任预置证书的客户端,客户端只信任指定的 CA 证书。
    yangzzz
        31
    yangzzz  
       2024-03-15 14:23:47 +08:00
    @zbowen66 保存了,你这张图很清晰
    mosliu
        32
    mosliu  
       2024-03-15 16:21:24 +08:00
    《提问的艺术》 rev. 2.0
    somebody1
        33
    somebody1  
       2024-03-15 16:29:43 +08:00   ❤️ 1
    你这么提问,评论区很难不开心啊
    main1234
        34
    main1234  
    OP
       2024-03-15 16:31:01 +08:00
    @zbowen66 @FaiChou 两位尊父大人给的文章有出入,zbowen66 大人的图在第一步 client hello 时候发送了加密套件,并在 server hello 时候返回了明文的加密套件选择方案; FaiChou 大人的文章再 client 校验完 server 证书时候将加密套件发送给 server ,server 校验完 client 证书后将选择的方案用 client 公钥加密了


    以上就是我一直纠结的点
    dzdh
        35
    dzdh  
       2024-03-15 16:47:31 +08:00   ❤️ 1


    看了看 go 的。

    - 验证是否是合法的证书(可以指定自签名 CA )
    - 是否在合法时间内
    - 证书 KeyExtendUsage 是否允许 客户端认证
    dzdh
        36
    dzdh  
       2024-03-15 16:50:19 +08:00
    @dzdh 都验证过了就没有其他的了,把客户端证书信息解析后放到当前请求就没有然后了。
    j6711
        37
    j6711  
       2024-03-15 17:01:18 +08:00
    学会了,提问的艺术
    tool2d
        38
    tool2d  
       2024-03-15 17:01:18 +08:00
    @main1234 似乎你的纠结点在于服务器用了客户端证书,具体干嘛。

    1. 客户端角度看,证书分公钥和私钥两部分。公钥是发给服务器作为验证的,私钥确实是本地加密数据后发给服务器,但不是加密 random 随机数,也不是 masterkey ,就仅仅是加密了 hash (因为正式加密通讯之前,任何数据都有可能被篡改,需要数字签名)

    2. 图上有一个 change cipher spec ,名字很容易误导,你以为可能是二次协商密钥。其实包里啥也没干,就是一个加密开始的 confirm 。
    holulu
        39
    holulu  
       2024-03-15 17:08:21 +08:00
    传客户端证书就相当于传登录密码一样。
    wang4012055
        40
    wang4012055  
       2024-03-15 17:19:55 +08:00
    本质就是利用非对称加密,获取其他人(中间人攻击)无法获取的密钥进行对称加密交流.
    叶文洁想要联系三体人,但是怕被罗辑知道并篡改内容,由于三体人在太阳老哥这注册过,叶文洁就问太阳老哥要到了三体人的公钥,把信息用公钥加密发给了三体人,三体人收到用三体人私钥解密后,确认是叶文洁发来的,就用在太阳老哥注册的叶文洁公钥加密信息发回去,这样双方都有了双方才知道信息,从而生成密钥进行对称加密交流.而罗辑只能干瞪眼.🤣
    nxuu
        41
    nxuu  
       2024-03-15 18:09:07 +08:00
    我看到了人间大爱.
    eairjhioaegnh
        42
    eairjhioaegnh  
       2024-03-15 18:21:04 +08:00 via iPhone
    下次我也这么提问哈哈哈
    FaiChou
        43
    FaiChou  
       2024-03-15 18:41:38 +08:00 via iPhone
    @main1234 各种实现可能不一样有出入,那就看 rfc 文档怎么写的。
    zbowen66
        44
    zbowen66  
       2024-03-16 00:22:09 +08:00
    @zbowen66 #22 这个是我之前在极客时间的课程里保存的图,课程在这: https://time.geekbang.org/column/article/9492
    iceheart
        45
    iceheart  
       2024-03-16 06:07:33 +08:00 via Android
    1. Server 端 证书:
    iceheart
        46
    iceheart  
       2024-03-16 06:09:46 +08:00 via Android
    1. Server 端证书: 防止 Server 被假冒。
    1. Client 端证书: 防止 Client 被假冒。
    cndenis
        47
    cndenis  
       2024-03-16 10:04:32 +08:00
    不同的 TLS 版本具体流程会有点区别的, 比如 TLS1.3 和 TLS1.2 相比变动就挺大的, 但很多地方并没有说明是哪个版本, op 可以注意一下
    julyclyde
        48
    julyclyde  
       2024-03-16 12:36:25 +08:00
    我理解应该是仅验证吧
    TLS 的加密协商似乎并没有用到客户端证书的内容
    l4ever
        49
    l4ever  
       2024-03-16 18:02:58 +08:00
    那么问题来了, app 里面使用双向认证可以防止 http 通讯数据被截获吗?

    client 端不还是要提供证书?
    别人逆向你的 app 依旧可以搞到方法和服务器通讯撒.
    意义在哪?
    julyclyde
        50
    julyclyde  
       2024-03-16 19:59:44 +08:00
    @l4ever “防止通信被截获”这个需求并不依赖客户端证书啊
    只能说并不会冲突而已
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3108 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:40 · PVG 20:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.