V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
main1234
V2EX  ›  程序员

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

  •  1
     
  •   main1234 · 43 天前 · 6211 次点击
    这是一个创建于 43 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    50 条回复    2024-03-16 19:59:44 +08:00
    Belmode
        1
    Belmode  
       43 天前   ❤️ 18
    别客气。

    不是很清楚~
    suzhenyu
        2
    suzhenyu  
       43 天前
    @Belmode 哈哈哈,这人太坏了,还配合上这个头像。
    ThirdFlame
        4
    ThirdFlame  
       43 天前
    客户端将发送的信息 算哈希。 将哈希用客户端自己的私钥加密。发送给服务端。

    服务端用客户的公钥解密,得到哈希。 并那这个哈希和客户端发送来的信息哈希比较,如果一致就说明这个信息时客户端发来的,并且没有被篡改。
    busier
        5
    busier  
       43 天前 via iPhone
    服务端会获取客户端证书的信息 诸如 CN 等等。

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

    利用这个特性可以实现证书登陆验证
    FaiChou
        6
    FaiChou  
       43 天前   ❤️ 1
    这篇讲的很详细,可以参考下

    http://www.884358.com/https-auth/
    tool2d
        7
    tool2d  
       43 天前
    没你想那么复杂。

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

    内容加密还是走老一套 TLS 。
    gps949
        8
    gps949  
       43 天前   ❤️ 1
    lxh1983
        9
    lxh1983  
       43 天前
    孩子你可以抓包看交互的过程
    tool2d
        10
    tool2d  
       43 天前
    "在 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  
       43 天前
    只做验证,服务端自签的 ca 签发客户端证书,用户携带客户端证书访问系统,服务端 Ca 校验客户端证书有效性。
    siweipancc
        12
    siweipancc  
       43 天前 via iPhone
    ……这个不是有规范文档吗,还是我看的那份是假的?
    bruce0
        13
    bruce0  
       43 天前
    我理解的, 单向的 https 中, 只有客户端,校验服务端是否是正确的(一般来说,会校验域名和证书是否一致)

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

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

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

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

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


    以上就是我一直纠结的点
    dzdh
        35
    dzdh  
       43 天前   ❤️ 1


    看了看 go 的。

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

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

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

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