使用证书进行SSL身份验证:证书是否应具有主机名?

时间:2010-04-08 18:28:20

标签: security authentication ssl certificate ssl-certificate

问题的快速版本

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

Common Name (CN)   mail.google.com

或更一般地说:

Common Name (CN)   <url>

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

摘要

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

我认为这意味着如果服务器B在您的信任库中,则服务器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 Knows

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

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

    • 已由CA(verisign)
    • 签署
    • 它已经自签名但它位于服务器的信任库
  • 这不是重播攻击,因为可能随机编号(步骤1或2)随每条消息一起发送

客户知道

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

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

    • 已由CA(verisign)
    • 签署
    • 它已经自签名但是它在客户的信任库
  • 这不是重播攻击,因为可能是随机数(步骤1或2)     与每条消息一起发送

潜在问题

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

    • 服务器A
    • 服务器B(恶意)
  • 服务器A的主机名为www.A.com

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

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

  • 自服务器B:

    • 拥有将发送给客户端的证书的公钥
    • 拥有“有效证书”(信任库中的证书)
  • 从那以后:
    • 证书中没有主机名字段

似乎服务器B可以轻易地伪装成服务器A.

我有什么遗失的东西吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

我认为你错过了一些东西,但我不确定我是否理解你的推理。

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

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