我是SSL和证书的新手。我一直在研究客户端证书身份验证。我看过this和wiki。
因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,请执行以下操作
我的问题是它如何阻止任何人摆出我的客户。假设黑客X将一个颁发认证的CA作为握手的一部分发送给服务器。然后,服务器会自动信任它并授予访问权限。
答案 0 :(得分: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,还记得吗?顺便说一句。这是我的证书" - 检查两次。
答案 1 :(得分: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列表的复杂性)。