HTTPS协议详解 SSL库使用说明 SSL调用错误 SSL高级配置 数字信封
- 2018-10-14 16:53:00
- admin
- 原创 2387
一、HTTPS协议详解
什么是SSL、TLS、HTTPS
1、TLS1.1文档:https://www.ietf.org/rfc/rfc4346.txt
2、TLS1.1文档:https://datatracker.ietf.org/doc/html/rfc4346
3、TLS1.1文档:https://www.rfc-editor.org/rfc/rfc4346,RFC包含IETF的所有文档;
4、SSL,Secure Sockets Layer,安全套接字协议;
5、TLS,Transport Layer Security,传输层安全协议,IETF标准化之后改名;6、TLS版本:SSLv2、SSLv3、TLSv1、TLSv1.1、TLSv1.2、TLSv1.3,最广泛使用的是TLSv1.2,最快最安全的是TLSv1.3;
7、TLSv1.3使用半关闭策略,TLSv1.2以及之前版本使用全关闭策略;
8、HTTPS,HTTP Over SSL,安全的超文本传输协议;
SSL子协议
1、握手协议,协商加密算法和会话密钥;
2、告警协议,两字节告警消息,第1个字节表示告警类型,分为告警和致命错误,第2个字节表示错误原因;
3、记录协议,握手协议之后发送加密数据,消息格式encrypt(compress(message)+mac(message))
SSL握手协议过程
1、加密算法包括:密钥交换、消息认证、加密算法、哈希算法;
2、引入三个随机数原因:协议不信任真随机pre-master-secret,三个伪随机接近真随机;
3、SNI,Server Name Indication,服务器名称用来支持多域名配置;
4、ALPN,Application Layer Protocol Negotiation,OpenSSL1.0.2开始用来支持应用层协议协商,比如支持HTTP/2;
步骤1 通信安全协商
client:ClientHello,包括SSL支持的最高版本、加密算法、压缩算法、客户端生成的随机数、服务器名称;
server:ServerHello,包括SSL版本号、加密算法、压缩算法、会话ID、服务端生成的随机数;
步骤2 服务器鉴别与密钥交换
server:
Certificate,服务端证书链
ServerKeyExchange,服务端密钥交换,RSA没有该报文,ECDH包含该报文,并且报文需要签名
IfRequestClient,可选是否验证客户端
ServerHelloDone,服务端握手完成
步骤3 客户机鉴别与密钥交换
client:
Certificate,可选客户端证书
ClientKeyExchange,客户端密钥交换,加密pre-master-secret,这里使用服务端公钥加密
CertificateVerify,客户端证书验证,签名pre-master-secret,证明客户端拥有客户端证书
步骤4 握手结束
client:
ChangeCipherSpec,后续消息使用协定加密算法
EncryptedHandshakeMessage,消息哈希
server:
ChangeCipherSpec,后续消息使用协定加密算法
EncryptedHandshakeMessage,消息哈希
二、ssl协议诊断
展示默认加密套件:openssl ciphers -v
展示所有加密套件:openssl ciphers -v ALL
解析指定加密套件:openssl ciphers -v 'cipherlist'
根证书哈希计算:c_rehash dir,通过文件名为哈希值的软链接可以快速找到根证书;
验证服务端证书:
openssl s_client -showcerts -connect baidu.com:443 </dev/null
查看证书签发时间和过期时间:
openssl s_client -showcerts -connect baidu.com:443 </dev/null 2>&1 | openssl x509 -noout -dates
三、ssl库使用说明
1、证书库包含三个:java.security、java.security.cert、javax.security.cert;
2、推荐使用java.security.cert,因为java.security已经过时,证书由扩展库迁移到标准库;
3、SSLContext是安全套接字实现,可以设置TrustManager进行证书校验,SSLSession是安全套接字会话;
4、SSLSocketFactory使用SSLContext,HostnameVerifier用于证书备选名称校验,一般在客户端层面进行校验;
5、HttpClient默认加载security目录的cacerts根证书,如果使用loadTrustMaterial则加载指定根证书;
6、HttpClient:TrustAllStrategy取消根证书校验和证书有效期校验,NoopHostnameVerifier取消证书备选名称校验;
7、SSL配置参数:https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html
8、curl根证书源:ca-bundle操作系统根证书,默认使用ca-bundle,ca-path独立根证书目录,ca-fallback库文件自带根证书;
9、curl:CURLOPT_SSL_VERIFYPEER控制根证书校验和证书有效期校验,CURLOPT_SSL_VERIFYHOST控制证书备选名称校验;
10、Java版本https代码示例:httpsdemo.zip
四、opensl实现细节
1、SSL_CTX用于保存HTTPS配置信息,SSL用于建立HTTPS连接;
2、先初始化SSL_CTX,然后初始化SSL,SSL包含一个成员指向SSL_CTX;
3、SSL_CTX和SSL同时包含证书信息;
五、ssl调用错误
Java调用https常见错误:
无法找到合适的根证书校验服务端证书
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
证书已过有效期
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed
域名不匹配证书的备选名称
javax.net.ssl.SSLPeerUnverifiedException: Certificate for <host> doesn't match any of the subject alternative names
客户端证书没有配置正确
400 No required SSL certificate was sent
新版curl调用https常见错误:
无法找到合适的根证书校验服务端证书
证书已过有效期
域名不匹配证书的备选名称
curl_easy_perform() failed: SSL peer certificate or SSH remote key was not OK
客户端证书没有正确配置
400 No required SSL certificate was sent
旧版curl调用https常见错误:
无法找到合适的根证书校验服务端证书
证书已过有效期
curl_easy_perform() failed: Peer certificate cannot be authenticated with given CA certificates
域名不匹配证书的备选名称
curl_easy_perform() failed: SSL peer certificate or SSH remote key was not OK
客户端证书没有正确配置
400 No required SSL certificate was sent
六、ssl高级配置
完全正向保密,Perfect Forward Secrecy。要求一个密钥只能访问由它所保护的数据;用来生成密钥的元素一次一换,不能再生成其他的密钥;一个密钥被破解,并不影响其他密钥的安全性。设计旨在长期使用密钥不能确保其安全性的情况下而不影响过去会话的保密性。算法主要包括DH、DHE、ECDH、ECDHE,其中E表示服务端密钥是临时生成的,安全性更高一些,另外DH包含一个公开公共密钥,密钥强度和RSA算法一致,公开公共密钥通过nginx的ssl_dhparam参数配置。国际ECDH使用2对公私钥生成会话密钥,国密ECDH使用4对公私钥生成会话密钥。
ATS,App Transport Security,苹果系统要求其安装的应用需要符合ATS规范,保证网络请求在一个安全的HTTPS上传输。不符合要求的应用将无法在App Store顺利上架。主要在SSL协议版本、加密套件、私钥长度、哈希算法上有要求。
CAA,Certification Authority Authorization,证书颁发机构授权是一项防止HTTPS证书错误颁发的安全机制,遵从IETF RFC6844。从2017年9月8日起,要求CA机构执行CAA强制性检查,从此不再是任意CA都可以给任意域名颁发证书。CAA要求在DNS上配置可信的CA列表,CA机构颁发证书的时候进行检查,如果不在列表里面则颁发证书失败。
HSTS,HTTP Strict Transport Security,作用是强制客户端使用HTTPS与服务器建立连接,HSTS最核心的是一个HTTP响应头,响应头的语法Strict-Transport-Security: <max-age=31536000>[; includeSubDomains][; preload]。
1、max-age是必选参数,HSTS响应头过期时间,单位为秒,通常设置为1年即31536000秒;
2、includeSubDomains是可选参数,如果包含它,则意味当前域名及其子域名均开启HSTS保护;
3、preload是可选参数,域名加入到浏览器内置列表的时候使用,内置列表强制第一次请求使用HTTPS;
七、数字信封
数字信封是公钥密码体系在实际中的一个应用,是用加密技术来保证只有规定的特定收信人才能阅读通信的内容。在数字信封中,信息发送方采用对称密钥来加密信息内容,然后将对称密钥用接收方的公开密钥加密,这部分称数字信封,然后将它和加密的信息一起发送给接收方,接收方先用相应的私有密钥打开数字信封,得到对称密钥,然后使用对称密钥解开加密信息。