客户端证书认证

我是SSL和证书的新手。 我一直在做我的客户端证书认证研究。 我读过这个和维基。

因此,如果我必须为我的B2B REST服务实施客户端证书身份验证解决方案,那么我应该如下执行

  • 要求客户生成他们自己的私钥和公钥,并为其公钥生成证书(CA颁发?)。 通过电子邮件或USB密钥发送该证书。
  • 在服务器端将客户端的公共证书导入到信任存储并启用客户端身份验证
  • 在握手过程中,客户端会显示证书并进行身份验证,因为服务器在其信任存储中具有证书的副本,并且可以验证CertificateVerify消息
  • 我的问题是如何阻止任何人作为我的客户。 让我们假设黑客X将一个通过认证的CA作为握手的一部分发送给服务器。 然后服务器会自动信任它并授予访问权限。


    我必须把你的问题分成两部分。

    第一部分: 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. 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可以强制一个可信的客户端并登录到您的系统中。 因此客户必须保护这些私钥不被盗用!

    这是因为在client-auth握手中,服务器不仅要求客户端证书。 客户还必须证明他是证书的真正拥有者,通过使用他引用的私钥,如您引用的wiki中所述: The client sends a CertificateVerify message, which is a signature over the previous handshake messages using the client's certificate's private key. 这样的签名只能在客户端拥有属于证书的私钥的情况才能完成,如维基中所述: 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,请记住?顺便说一句,这是我的证书” - 请检查两次。


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

    假设客户端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列表的复杂性)。

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

    上一篇: Client certificate authentication

    下一篇: mutual authentication