7

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

我用谷歌搜索了很多,但仍然很困惑。谁能给我解释一下?我在哪里可以获得客户证书?从服务器?我知道如果我有客户端证书和客户端私钥,我可以通过调用加载证书文件并通过调用 opensslSSL_CTX_use_certificate_chain_file()加载私钥。SSL_CTX_use_PrivateKey_file

4

3 回答 3

7

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

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

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

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

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

于 2013-09-27T07:32:06.640 回答
1

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

在 2-way SSL 中,服务器也需要对客户端进行身份验证。因此,客户端需要一个证书。

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

于 2013-09-18T18:47:21.123 回答
0

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

于 2013-09-17T08:49:46.643 回答