什么是客户端证书,从哪里获取它,如何使用它连接到服务器?

What's a client certificate and where to get it, how to use it to connect to server?

本文关键字:何使用 连接 服务器 客户端 证书 什么 获取      更新时间:2023-10-16

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

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

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

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

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

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

怎么知道你正在与正确的人打交道,或者更确切地说是正确的网站。好吧,有人花了很长时间(如果他们是认真的)来确保网站所有者是他们声称的人。这个人,你必须隐式信任:你已经在他的浏览器中加载了他/她的证书(根证书)。证书包含有关证书所有者的信息,如电子邮件地址、所有者姓名、证书用法、有效期、资源位置或可分辨名称 (DN),其中包括公用名 (CN)(网站地址或电子邮件地址,具体取决于使用情况)和认证(签署)此信息的人员的证书 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 等)提供了比软件密钥存储更强大的保证,即私钥不可导出。

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

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

此方案的一个示例是,当拥有服务器的公司/实体想要控制谁连接到它时。因此,他们向他们信任的人颁发客户端凭据以连接到它。这些凭据可以采用 USB 电子令牌、软键等形式。如果是软键,则可以在客户端计算机上生成这些密钥,并将 CSR 发送给服务器所有者(或服务器信任的 CA),而服务器所有者又可以对证书进行签名并将其发送回客户端。

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