您的位置:首页 > 理论基础 > 计算机网络

在客户端程序中使用OpenSSL来实现HTTPS在证书认证上的一些分析

2016-12-26 18:28 417 查看
在客户端程序中使用OpenSSL来实现HTTPS在证书认证上的一些分析

ssl握手一般流程:
http://blog.csdn.net/wzsy/article/details/38332819

通过wireshark抓包,可以确认一般情况下SSl握手的主要过程:
1.客户端发送client hello,发送随机数、算法集;
2.服务器端发送server hello,发送随机数,协商的算法;
3.服务器端发送Certifacate,内含证书或者证书链;
4.服务器端发送Server Key Exchange,交换对称密钥;
5.客户端发送Client Key Exchange,交换对称密钥;
6.开始用对称密钥加密数据并传输。

在第3、4步之间,客户端需要验证服务端的证书(可选),检查抓包文件中服务器端发送过来的证书链,发现其证书链不包含根证书;

用openssl命令行验证证书链:
[@he ~]$ openssl s_client -showcerts -connect xxx.com:443
会得到包含根证书的完整证书链。

注意:
一般服务器发回的证书链中都不会包含根证书,因为要求根证书在浏览器或者系统中已经安装,以保证最根本的安全性。
http://security.stackexchange.com/questions/65332/ssl-root-certificate-optional

The server always sends a chain. As per the TLS
standard, the chain may or may not include the root certificate itself; the client does not need that root since it already has it. And, indeed, if the client does not already
have the root, then receiving it from the server would not help since a root can be trusted only by virtue of being already there.

综上:
1.客户端APP需要获得一个根证书(系统、浏览器一般自带一些根证书,也可以手动安装,如果没有,则手动拷贝一份),并调用SSL_CTX_load_verify_locations函数设置,使之成为一个可信任的证书;
2.在服务器端的证书返回之后,OpenSSL会根据本地的受信证书验证服务器端证书链;
3.通过调用SSL_set_verify设置验证证书的回调,通过回调的参数可以获取验证的结果、错误码、错误的证书深度等信息;
4.确保证书验证通过的核心就是要保证从服务器端返回的证书能在本地的受信证书中追根溯源“找到根”,否则认证会失败并会报告找不到发布者错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐