【问题标题】:Client certificate authentication客户端证书认证
【发布时间】:2015-09-06 09:58:36
【问题描述】:

我是 SSL 和证书的新手。我一直在研究客户端证书身份验证。我读过thiswiki

因此,如果我必须为我的 B2B REST 服务实施客户端证书身份验证解决方案,我应该遵循以下操作

  1. 要求客户生成他们自己的私钥-公钥并为他们的公钥生成证书(CA 颁发?)。通过电子邮件或 USB 密钥发送该证书。
  2. 在服务器端将客户端的公共证书导入信任库并启用客户端身份验证
  3. 在握手期间,客户端出示其证书并获得身份验证,因为服务器在其信任存储区中有一份证书副本,并且可以验证 CertificateVerify 消息

我的问题是如何阻止任何人冒充我的客户。假设黑客 X 在握手过程中向服务器发送了一个 CA 颁发的认证证书。然后服务器会自动信任它并授予访问权限。

【问题讨论】:

标签: authentication ssl https ssl-certificate x509


【解决方案1】:

基于客户端证书的身份验证实际上不会验证连接的客户端是否在您的白名单中。

假设客户端 X 从公共 CA Y 获得证书,并且您将 Y 的证书导入您的信任列表中,那么来自 X 的连接将成功。

现在,如果入侵者 Z 从同一个 CA Y 购买证书(知道您的应用程序信任的 CA 是一个复杂的部分),并尝试对您的应用程序进行身份验证,验证仍然会成功,因为它是来自受信任的 CA。应用程序将继续向 Z 提供您不想要的内容。

因此,最好的方法是对客户端客户端证书进行自签名(并将其部署在您信任的客户端上),在这种情况下,您将成为 CA,从而限制入侵者获得访问权限。

这里有一些参考,

# Create the CA Key and Certificate for signing Client Certs
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

# Create the Client Key and CSR
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr

# Sign the client certificate with our CA cert.
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt

如果您只想允许几个已知的 IP 地址,那么基于网络的 IP 阻止/限制是首选方法(但是,管理/更新 IP 列表有其自身的复杂性)。

【讨论】:

  • 以 Cloudflare 为例:我可以从这里获取他们发送的公共证书:support.cloudflare.com/hc/en-us/articles/…。我需要做的就是找出 CA 并从那里制作一个包含证书的证书。然后我可以从本地计算机进行身份验证?
  • 我查阅了近百篇关于这个主题的文章,他们似乎都缺少这个关键部分if a intruder Z buys a cert from same CA Y (knowing what CA your application would trust is a complex part), and tries to authenticate with your application, the verification would still succeed,
  • @RobOhRob 你不从任何外部 CA 购买它,关于客户端证书身份验证的要点是,服务器充当 CA 并签署证书。
【解决方案2】:

我要把你的问题分成两部分。

第一部分:Let's say a hacker X sends a CA issued certified to the server as part of handshake. Then server would automatically trust it and grant access.

如果 X 获取了一个真实客户端的客户端证书,那没关系。因为证书本身不包含任何秘密。这些证书可以在任何地方发布而不会造成任何损害(除非您想保密您的电子邮件地址,尽量不要发布它。但它可能会在一段时间后发布。公司精心制作的 X509CertificateExtensions 不被考虑也是。).

私钥是您的客户必须保密的重要密钥。如果 X 也获得了私钥,X 可以强加一个真实的客户端并登录到您的系统。因此,客户必须保护这些私钥不被盗!

这是因为在客户端身份验证握手中,服务器不仅请求客户端证书。客户还必须证明他是证书的真正所有者,通过使用他在the wiki you referenced 中所述的私钥:The client sends a CertificateVerify message, which is a signature over the previous handshake messages using the client's certificate's private key. 这样的签名只有可以在客户拥有私钥的情况下完成属于证书,如 wiki 中所述:This lets the server know that the client has access to the private key of the certificate and thus owns the certificate.!

第二部分:How do establish a initial trust relationship?

如果涉及到很多客户,这部分会很困难。这就是 PKI 成立的原因。您信任 CA,CA 应该对请求证书的客户端进行身份检查。

对于自制解决方案,在这种情况下您拥有自己的 CA,或者您不信任 CA,这部分取决于您。 您必须确保仅向真实客户授予对您服务的访问权限。如果您通过 USB 密钥执行此操作,并且客户亲自将它们交给您,那没关系。

如果您收到一封电子邮件,上面写着 “你好,我是你来自 ABC 的朋友 XYZ,记得吗?顺便说一句。这是我的证书” - 请检查两次。

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 2012-09-04
    • 2013-08-04
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多