OpenSSL的client端验证server端证书主机名
2023-10-18 本文已影响0人
CodingCode
利用openssl命令行client验证server
- 启动server
$ openssl s_server -accept 4443 -cert tls.pem -key tls.key -www
- client 验证
$ echo quit | openssl s_client -connect <yourserver>:4443 -CAfile ca.pem
...
Start Time: 1697648561
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
DONE
- 验证主机名
$ echo quit | openssl s_client -connect <yourserver>:4443 -CAfile ca.pem -verify_hostname <hostname>
验证主机名(<hostname>)和证书里面定义的主机信息一致。注意证书的主机信息有两个来源:
- SUBJ域的CN字段
...
Subject: ..., CN=<hostname>
...
- 还有一个可以是SAN域
...
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:<hostname>
- 本地验证
验证本地证书是否支持指定的主机名。
$ openssl x509 -noout -in tls.pem -checkhost <hostname>
Hostname <hostname> does [NOT] match certificate
- 验证结论
CN值:
- 可以至简单主机名,例如'$(hostname)'
- 可以是full-qualitied domain name,例如:'$(hostname -f)'
- 可以支持通配符'*',例如 '*.$(hostname -d)'
SAN值:
用法和CN值一样,但是SAN值会覆盖CNvalue,也就是说如果证书定义了SAN值,那么做主机名验证的时候就不会去访问CN的值;因此当主机名验证SAN域失败,此时即使主机名验证CN值成功,整个验证过程也是标记失败的。
Verify return code: 62 (Hostname mismatch)