2015-06-20 277 views
1

我是新来的SSL和证书。我一直在做我的关于客户证书验证研究。我已阅读thiswiki客户端证书认证

所以如果我要实现我的B2B REST服务的客户端证书身份验证解决方案,我应该做以下

  1. 要求客户产生自己的公钥和私钥,并生成证书(CA颁发?)他们公共密钥。通过电子邮件或USB密钥发送该证书。
  2. 在服务器端导入客户端的公共证书到信任存储和启用客户端验证
  3. 在手抖客户出示它的证书,并通过认证,因为服务器证书的副本,它的信任存储区和可核实CertificateVerify消息

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

回答

1

我有你的问题分解成两个部分。一个

部分: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 aquires一个真实的客户端的客户端证书,然后没关系。因为证书本身不包含任何秘密。这些证书可以在任何地方没有做任何损害(除非你想保持你的电子邮件地址保密,尽量不要发表公布。但它可能会在一段时间后走出去,而且公司制作的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

基于客户端证书的身份验证实际上不验证客户端连接是否在您的白名单中。假设客户端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列表)。