security - 使用证书 : Should the Certificates have a hostname? 的 SSL 身份验证

标签 security authentication ssl certificate ssl-certificate

问题的快速版本

Gmail、TD(加拿大银行)、Royal Bank(加拿大银行)都使用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

服务器知道

  • 客户端拥有所发送证书的公钥(第 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)

从技术上讲,应用程序可以选择忽略其中任何一个,并简单地表明证书一切正常....但这很糟糕:)

关于security - 使用证书 : Should the Certificates have a hostname? 的 SSL 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2602453/

相关文章:

forms - 通过验证更改用户密码( symfony2 )

javascript - 通过 Azure AD 身份验证进行单点登录 (SSO) 时出错 - AADSTS50059

php - 登录页面,在同一页面查看密码

tomcat - 禁用指定路径的客户端身份验证

java - OC4J 问题与 ssl (secure-web-site.xml)

java - 生产JVM的安全调试

c# - 在 C# 中开发许可证 - 我从哪里开始?

php - 为 capthca 创建不可读的 PHP 页面

authentication - Meteor自定义登录报错: access denied

macos - OS X 10.11.6 El Capitan SSLRead() 返回错误 -9841