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