首页 文章

带证书的SSL身份验证:证书是否应具有主机名?

提问于
浏览
6

快速版问题

Gmail,TD(加拿大银行),皇家银行(加拿大银行)都使用ssl . 当你检查他们的证书时,他们都有

Common Name (CN)   mail.google.com

或者更一般地说:

Common Name (CN)   <url>

这是否需要防止中间人攻击?

摘要

JBoss允许客户端和服务器使用证书和ssl进行身份验证 . 有一点似乎很奇怪,你不需要在证书上提供你的主机名 .

我认为这意味着如果服务器B在您的信任库中,Sever B可以伪装成他们想要的任何服务器 .

(同样地:如果客户B在您的信托商店......)

我在这里错过了什么吗?

验证步骤

Summary of Wikipeida Page

Client                                                  Server
=================================================================================================
1) Client sends Client Hello
        ENCRIPTION: None
        - highest TLS protocol supported
        - random number
        - list of cipher suites
        - compression methods

                                                        2) Sever Hello
                                                                ENCRIPTION: None
                                                                - highest TLS protocol supported
                                                                - random number
                                                                - choosen cipher suite
                                                                - choosen compression method

                                                        3) Certificate Message
                                                                ENCRIPTION: None
                                                                -

                                                        4) ServerHelloDone
                                                                ENCRIPTION: None

5) Certificate Message
        ENCRIPTION: None

6) ClientKeyExchange Message
        ENCRIPTION: server's public key => only server can read
                => if sever can read this he must own the certificate
        - may contain a PreMasterSecerate, public key or nothing (depends on cipher)

7) CertificateVerify Message
        ENCRIPTION: clients private key
        - purpose is to prove to the server that client owns the cert


                        8) BOTH CLIENT AND SERVER:
                                - use random numbers and PreMasterSecret to compute a common secerate


9) Finished message
        - contains a has and MAC over previous handshakes
                (to ensure that those unincripted messages did not get broken)


                                                        10) Finished message
                                                                - samething

Sever知道

  • 客户端具有已发送证书的公钥(步骤7)

  • 客户的证书有效,因为:

  • 它已由CA签署(verisign)

  • 它已经自签名但它在服务器的信任库中

  • 这不是重播攻击,因为可能随机编号(步骤1或2)与每条消息一起发送

客户知道

  • 服务器具有已发送证书的公钥(步骤6,步骤8)

  • 服务器的证书有效,因为:

  • 它已由CA签署(verisign)

  • 它已经自签名但是它在客户端的信任库中

  • 这不是重播攻击,因为可能随机编号(步骤1或2)与每条消息一起发送

潜在问题

  • 假设客户端的信任库中有证书:

  • 服务器A.

  • 服务器B(恶意)

  • 服务器A的主机名为www.A.com

  • 服务器B的主机名为www.B.com

  • 假设:客户端尝试连接到服务器A,但服务器B启动中间人攻击 .

  • 自服务器B:

  • 具有将发送给客户端的证书的公钥

  • 有"valid certificate"(信任库中的证书)

  • 以及:

  • 证书中没有主机名

看起来服务器B可以轻易地伪装成服务器A.

有什么东西我不见了吗?

2 回答

  • 2

    你能否指出一些文字说JBoss不需要证书中的主机名,或者只是你的观察?我假设'主机名'是指公用名(CN)或专有名称(DN)?

    通常,应用程序应检查X.509证书:

    有效日期范围
    用法(例如;服务器验证)
    链接到受信任的根
    CN ==目标主机的DNS名称(可能是另一个名称,而不仅仅是DNS)
    未撤销(使用CRL或OCSP)

    从技术上讲,一个应用程序可以选择忽略这些中的任何一个,只是表明一切都与证书相关......但这很糟糕:)

  • 2

    我想你错过了一些东西,但我不确定我是否理解你的理由 .

    但是,当服务器B试图在中间攻击中启动一个人时,你说它有一个公钥 . 这是事实,但是要设置ssl连接,您还应该拥有属于该公钥的私钥 . 此外,使用的证书与dns名称(在https的情况下)相关联 . 所以客户试图连接到A,他在www.a.com上输入 . 由于我们假设B不知道A的私钥,他将拥有另一个密钥对 . 他永远无法从主要CA获得有效(即可信)证书,该证书与他不拥有的域相关联 .

    因此,B永远无法获得通用名称www.A.com的证书,因此,B无法在中间攻击中执行任务 .

相关问题