jfl*_*fly 7 c++ openssl ssl-certificate
我正在用 C++ 编写一个客户端应用程序,以通过 https 从服务器检索一些信息,但服务器请求客户端证书进行身份验证,我知道服务器证书在通过 https 浏览网页期间是如何工作的:公共证书提供给任何网页浏览器附带一个广泛的内置可信根证书列表,这些证书连接到网站并向 Web 浏览器证明提供商认为它已向网站所有者颁发了证书,但我不清楚客户端证书。
我用谷歌搜索了很多,但仍然很困惑。谁能给我解释一下?我在哪里可以获得客户端证书?从服务器?我知道我可以通过调用来加载证书文件,如果我有客户端证书和客户端私钥,我可以SSL_CTX_use_certificate_chain_file()通过调用SSL_CTX_use_PrivateKey_fileopenssl 来加载私钥。
首先,我们应该知道私钥/公钥:
使用私钥/公钥对的加密确保数据可以用一个密钥加密,但只能用另一个密钥对解密。这些密钥本质上是相似的,可以交替使用:一个密钥加密,另一个密钥对可以解密。密钥对基于素数,它们的比特长度确保了在没有密钥对的情况下解密消息的难度。密钥对中的技巧是将一个密钥(私钥)保密,并将另一个密钥(公钥)分发给每个人。任何人都可以向您发送加密消息,只有您才能解密。你是唯一拥有另一对密钥的人,对吗?相反,您可以证明消息仅来自您,因为您已使用私钥对其进行加密,并且只有关联的公钥才能正确解密。请注意,在这种情况下,您只签署了消息不安全。每个人都有公钥!
Message-->[Public Key]-->Encrypted Message-->[Private Key]-->Message
Run Code Online (Sandbox Code Playgroud)
剩下的问题之一是知道通讯员的公钥。通常,您会要求他向您发送包含他的公钥和证书的非机密签名消息。
你怎么知道你在和正确的人打交道,或者说正确的网站。嗯,有人花了很长时间(如果他们是认真的)来确保网站所有者是他们声称的那样。这个人,你必须隐含地信任:你在浏览器中加载了他/她的证书(根证书)。证书,包含有关证书所有者的信息,例如电子邮件地址、所有者姓名、证书使用情况、有效期、资源位置或专有名称 (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
Run Code Online (Sandbox Code Playgroud)
回答必要的问题,然后签名:
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
Run Code Online (Sandbox Code Playgroud)
然后您可以尝试使用客户端证书连接到服务器:
openssl s_client -connect host:443 -cert clientcert.pem -key clientkey.pe -state -quiet
Run Code Online (Sandbox Code Playgroud)
客户端证书(一般为证书)的一个重要细节是可以导出并且大多数实现不会锁定证书的可移植性。无论是否或如何存储客户端证书,如果没有适当的措施,证书都可以轻松地从设备复制到设备。一些实现将证书存储在文件系统上(以 .cer、.der、.key、.crt 结尾的文件通常表示证书存储在文件系统中)。更强的实现(依赖于应用程序)可以将证书和密钥存储在密钥库(即 java 密钥库)中。密钥存储可以添加额外的保护,例如确保私钥不可导出。但是,密钥未被导出的保证与密钥存储本身一样强大。硬件密钥存储(即智能卡、USB hsm、ironkey、
| 归档时间: |
|
| 查看次数: |
6251 次 |
| 最近记录: |