客户端身份验证可用于 SSL/TLS 协商。
为此,客户端将CertificateVerify
在服务器请求它之后发送一个。
该CertificateVerify
消息包含将由服务器验证的客户端证书。
服务器如何验证客户端证书(包含客户端公钥)是否合法?
客户端身份验证可用于 SSL/TLS 协商。
为此,客户端将CertificateVerify
在服务器请求它之后发送一个。
该CertificateVerify
消息包含将由服务器验证的客户端证书。
服务器如何验证客户端证书(包含客户端公钥)是否合法?
TLS 1.3 协议的握手部分有三个目标:
第 1 部分 - 证书的信任
Certificate
客户端发送带有消息的证书。
服务器确定证书是否来自受信任的来源。它验证客户端证书的签名,然后验证每个中间证书的签名,直到从服务器端的受信任证书列表或受信任的证书颁发机构 (CA) 中找到受信任的证书。
伪代码:
第 2 部分 - 客户的信任
客户端发送Certificate Verify
消息:
struct {
SignatureScheme algorithm;
opaque signature<0..2^16-1>;
} CertificateVerify;
告诉使用的signature scheme
散列函数和签名算法。
由signature
客户端生成并由服务器验证。实际签名的数据为客户端和服务器所知,因此不会重新发送(它是空格、上下文字符串、零字节和先前的消息)。
伪代码:
现在,Alice 必须对她的密钥保密,并且请求之间的数据必须不同,以避免 Eve 用相同的数据和相同的签名重放请求。
我希望它可以帮助您更好地理解。
参考资料:
http ://www.garykessler.net/library/crypto.html#why3
https://tlswg.github.io/tls13-spec/draft-ietf-tls-tls13.html
https://nodejs.org/ api/crypto.html#crypto_class_sign
https://www.tutorialspoint.com/cryptography/cryptography_digital_signatures.htm
服务器有一些信任根,它使用它,或者根据应用程序,它可能有一个 CA 的证书,或者只是那个客户端的证书,固定。
无论如何,它要么通过其信任存储并检查客户端证书是否由其存储中的某些东西签名,或者如果它被固定,它只会检查它配置为检查的一个 CA 或证书。