s_client 在 SSL 握手协议中的应用
在连接 SSL 服务器时最常见的问题就是客户端认证服务器端身份失败,有多种原因造成这些失败,以下列举了常见的错误并解析了如何应用 s_client 进行确诊。
- 服务器的证书在传输过程中被篡改
1.提取服务器的证书:
在 linux 平台下创建脚本 retrieve-cert.sh 并存入一下清单 2 中的内容。该脚本的输出内容就是服务器端的 X509 证书经过 Base64 编码后的内容,执行脚本并将脚本输出存入文件 server.pem 中。
清单 2. 提取证书
###usage: retrieve-cert.sh remote.host.name [port] SSLHOST=$1 SSLPORT=${2:-443} echo |\ openssl s_client -connect ${SSLHOST}:${SSLPORT} 2>&1 |\ sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' |
1.验证获取的证书,在命令行下执行”openss verify server.pem”。
如果证书内容被篡改,那么执行后的结果如清单 4 所示:
清单 4. 证书验证失败
[root@wks547385wss openssl]# openssl verify server.pem unable to load certificate 19280:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:947: 19280:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:304:Type=X509 19280:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:82: |
否则的话,我们就能得到认证通过,结果如下:
清单 5. 证书验证成功
[root@wks547385wss openssl]# openssl verify server.pem server.pem: OK |
- 客户端没有保存认证服务器端的证书的根证书;
1. 使用参数-state检查是否在握手协议的证书认证时失败
清单 6. 显示 SSL 握手协议状态
[root@wks547385wss openssl]# openssl s_client -connect www6.software.ibm.com:443 -state CONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=1 /C=US/O=Equifax/OU=Equifax Secure Certificate Authority verify error:num=19:self signed certificate in certificate chain verify return:0 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server done A SSL_connect:SSLv3 write client key exchange A SSL_connect:SSLv3 write change cipher spec A SSL_connect:SSLv3 write finished A SSL_connect:SSLv3 flush data SSL_connect:SSLv3 read finished A |