首页 文章

客户端证书认证

提问于
浏览
2

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

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

  • 要求客户生成自己的私钥 - 公钥并为其公钥生成证书(CA颁发?) . 通过电子邮件或USB密钥发送该证书 .

  • 在服务器端将客户端的公共证书导入信任库并启用客户端身份验证

  • 在握手期间,客户端会显示's certificate and gets authenticated, because server has a copy of cert in it' s信任存储,并且可以验证 CertificateVerify 消息

我的问题是它如何阻止任何人摆出我的客户 . 假设黑客X将一个颁发认证的CA作为握手的一部分发送给服务器 . 然后服务器会自动信任它并授予访问权限 .

2 回答

  • 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可以强加一个真实的客户端并登录到您的系统 . 因此客户 must 保护这些私钥不被盗!

    's because within the client-auth handshake, the server not only requests the client certificate. The client must also prove that he'是证书的真正所有者,通过使用_959946中所述的私钥: The client sends a CertificateVerify message, which is a signature over the previous handshake messages using the client's certificate's private key. 如果客户端拥有属于证书的私钥,也可以 only 这样做,如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密钥执行此操作,并且客户亲自将它们交给您,那没关系 .

    如果您收到一封说"hello, i'm your friend XYZ from ABC, remember? Btw. here's my certificate"的电子邮件 - 请检查两次 .

  • 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列表的复杂性) .

相关问题