什么是客户端证书以及从何处获取它,如何使用它来连接服务器?

时间:2013-09-17 07:10:45

标签: c++ openssl ssl-certificate

我正在用c ++编写客户端应用程序,通过https从服务器检索一些信息,但是服务器请求客户端证书进行身份验证,我知道服务器证书在通过https进行Web浏览时是如何工作的:公共证书可以提供给任何人网络浏览器,附带广泛的内置可信根证书列表,连接到网站,并向网络浏览器证明提供商认为它已向网站所有者颁发了证书,但我不清楚关于客户证书。

我已经google了很多,但仍然感到困惑。有谁可以向我解释一下?我在哪里可以获得客户证书?从服务器?我知道我可以通过调用SSL_CTX_use_certificate_chain_file()加载证书文件,并在openssl中调用SSL_CTX_use_PrivateKey_file加载私钥,如果我有客户端证书和客户端私钥。

3 个答案:

答案 0 :(得分:2)

首先,我们应该知道私钥/公钥

使用私钥/公钥对进行加密可确保数据可以通过一个密钥加密,但只能由另一个密钥对解密。密钥本质上类似,可以替代使用:一个密钥加密,另一个密钥对可以解密。密钥对基于素数,它们的比特长度确保了在没有密钥对的情况下解密消息的难度。密钥对中的技巧是保持一个密钥(私钥)并将另一个密钥(公钥)分发给每个人。任何人都可以向您发送加密消息,只有您才能解密。你是唯一拥有另一个密钥对的人,对吗?相反,您可以证明邮件仅来自您,因为您已使用私钥对其进行加密,并且只有关联的公钥才能正确解密。请注意,在这种情况下,只有您签名才能保证邮件的安全。每个人都有公钥!

Message-->[Public Key]-->Encrypted Message-->[Private Key]-->Message

剩下的问题之一是知道你的记者的公钥。通常,您会要求他向您发送一份非机密签名消息,其中包含他的公钥和证书。

您如何知道您正在与合适的人或正确的网站打交道。好吧,有人花了很长时间(如果他们是认真的)确保网站所有者是他们声称的人。这个人,你必须暗中信任:你在浏览器中加载了他/她的证书(根证书)。证书,包含有关证书所有者的信息,如电子邮件地址,所有者姓名,证书使用,有效期,资源位置或可分辨名称(DN),其中包括公用名(CN)(网站地址或e) - 根据使用情况的邮件地址)以及证明(签署)此信息的人的证书ID。它还包含公钥,最后是哈希,以确保证书未被篡改。由于您选择信任签署此证书的人,因此您也信任此证书。这是证书信任树或证书路径。通常,您的浏览器或应用程序已经加载了众所周知的证书颁发机构(CA)或根CA证书的根证书。 CA维护所有已签名证书的列表以及已撤销证书的列表。证书在签名之前是不安全的,因为只有签名证书才能被修改。您可以使用自己签署证书,它称为自签名证书。所有根CA证书都是自签名的。

客户端证书:

客户端证书由证书颁发机构颁发给用户。 它们由证书的公钥部分和仅由颁发证书的实体持有的私钥组成。证书颁发机构可能是提供证书服务的知名公共组织作为其业务的一部分,或者它可以是只有贵公司使用的内部服务器。 在任何一种情况下,客户端证书都会包含某些信息,这些信息可以单独标识用户,也可以作为组的一部分标识用户。它们用于向服务器验证客户端。 例如,您可以像服务器证书一样创建自签名客户端证书:

openssl req -nodes -new -x509 -keyout clientkey.pem -out clientreq.pem -days 365 -config openssl.cnf

回答必要的问题,然后签名:

openssl x509 -x509toreq -in clientreq.pem -signkey clientkey.pem -out tmp.pem

openssl ca -config openssl.cnf -policy policy_anything -out clientcert.pem -infiles tmp.pem 

然后,您可以尝试使用客户端证书连接到服务器:

openssl s_client -connect host:443 -cert clientcert.pem -key clientkey.pe -state -quiet

客户端证书(一般证书)的一个重要细节是可以导出,大多数实现不会锁定证书的可移植性。无论是否或如何存储客户端证书,如果没有适当的措施,证书可以轻松地从一个设备复制到另一个设备。某些实现将证书存储在文件系统上(以.cer,.der,.key,.crt结尾的文件通常表示证书存储在文件系统中)。更强的实现(依赖于应用程序)可以将证书和密钥存储在密钥库(即,Java密钥库)中。密钥库可以添加额外的保护,例如确保私钥不可导出。但是,确保密钥未导出的保证仅与密钥存储本身一样强。硬件密钥库(即智能卡,usb hsm,ironkey等)提供了更强大的保证,即私钥不能出口,而不是软件密钥库。

答案 1 :(得分:1)

客户端证书用于双向或相互SSL连接。您在问题中描述的正常SSL连接是单向SSL ...客户端浏览器正在验证服务器。

在双向SSL中,服务器也需要对客户端进行身份验证。因此,客户需要证书。

此场景的一个示例是拥有服务器的公司/实体想要控制谁连接到它。因此,他们向他们信任的客户端凭据发送连接到它的客户端凭据。这些凭证可以采用USB eTokens,软键等形式。如果是软键,这些可以在客户端计算机上生成,并将CSR发送给服务器所有者(或服务器信任的CA),后者又可以签名证书并将其发回给客户。

答案 2 :(得分:0)

您必须创建密钥对,创建证书签名请求,然后由证书颁发机构签名。所有完整的OpenSSL文档,以及SO的所有主题。