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

问题的快速版本

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

Common Name (CN)   mail.google.com

或者更一般地说:

Common Name (CN)   <url>

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

概要

JBoss允许客户端和服务器使用证书和ssl进行身份验证。 有一件看起来很奇怪的事情是,你不需要在证书上给你的主机名。

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

(同样,如果客户B在您的信任库中)

我在这里错过了什么吗?

认证步骤

(Wikipeida页面总结)

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:

  • 拥有将发送给客户端的证书的公钥
  • 拥有“有效证书”(信任库中的证书)
  • 因为:
  • 证书中没有主机名
  • 看起来服务器B可以很容易地假装成服务器A.

    有什么我失踪了吗?


    你能指出一些文字说JBoss在证书中不需要主机名,还是仅仅是你的观察? 我认为'主机名'是指通用名称(CN)或可分辨名称(DN)?

    通常情况下,应用程序应该检查X.509证书:

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

    从技术上讲,一个应用程序可以选择忽略其中的任何一个,并简单地指出所有的证书都很好....但是这很糟糕:)


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

    然而,当服务器B试图在中间攻击中启动一个人时,你说它有一个公钥。 这是真的,但要建立一个ssl连接,你还应该有一个属于该公钥的私钥。 此外,所使用的证书与DNS名称(在https的情况下)相结合。 因此,一个客户端尝试连接到A,他在www.a.com中键入。 既然我们假设B不知道A的私钥,他将拥有另一个密钥对。 他永远不会收到来自主要CA的有效(即可信)证书,该证书与他不属于的域相关联。

    所以B永远不会得到一个通用名为www.A.com的证书,因此,B在中间人攻击中不能执行一个人。

    链接地址: http://www.djcxy.com/p/21827.html

    上一篇: SSL Authentication with Certificates: Should the Certificates have a hostname?

    下一篇: ACE SSL Error: peer did not return a certificate