HTTPS SSL/TLS问题及解决方法汇总

    之前处理过很多ThreadX平台及安卓平台上的SSL问题。

    SSL问题几乎都和握手失败有关,大致分为四种:

1.客户端没有与服务器相匹配的加密套件,以及SSL版本不匹配。

2.SSL证书错误。

3.网络链路问题。

4.其他问题。

    这时使用wireshark抓取网络报文就显得很重要了,下面列出的是使用PC模拟以上问题情况的报文:

正常报文:

PC端命令:openssl s_client -connect www.sogou.com:443

HTTPS SSL/TLS问题及解决方法汇总_第1张图片    通过https://myssl.com/,已经查到118.184.170.59不支持DES-CBC3-SHA (TLS_RSA_WITH_3DES_EDE_CBC_SHA) 加密套件,此网址可以快速知晓服务端支持的各种信息。

    HTTPS SSL/TLS问题及解决方法汇总_第2张图片

    

1.客户端没有与服务器相匹配的加密套件,或者SSL版本不匹配。

可以用火狐浏览器SSL版本查看与设置来模拟服务器是否支持某个版本TLS:

https://blog.csdn.net/weixin_30396699/article/details/98960323

或者用下面类似的openssl命令来模拟SSL连接,wireshark抓取网络报文对比分析。

PC端命令:openssl s_client -cipher DES-CBC3-SHA -connect www.sogou.com:443

 

    

    上图服务器的fatal警告很明显表示客户端的client hello报文有问题。

根据https://myssl.com/信息,对应加密套件不匹配。

解决方案:增加加密套件或更换版本。

 

2.SSL证书错误。

1)系统时间不对导致握手失败。

解决方案:本地时间同步或者修正时间。

2)服务器证书有问题。

解决方案:客户端可以不验证服务器证书,需要注意安全问题。

3)证书验证算法不支持。

解决方案:扩展相应的如SHA384摘要算法。

 

3.网络链路问题。

    此种问题一般很好查,与服务端有很多重传报文,且最后客户端一直重传,服务端没有回复,回复包括RST、警告报文,超时之后断开连接。

 

4.其他问题。

    前面几种是比较好查的,下面是遇到的比较个例的问题:

 

1) 服务器仅支持HTTP2.0导致的问题:

    大家应该清楚ALPN,其实质上是TLS的扩展,为了协商应用层协议,如HTTP2.0

之前是在android4.4平台手机无法访问亚马逊的语音平台。

首先无法握手成功,经过查看源码,android4.4平台,openssl为1.0.1版本,虽然支持亚马逊的加密套件,但是framework层没有完全扩展加密套件。

故此修改方案无法完全生效:

    Android解决okhttpUtils框架无法在4.4.4以下系统访问https协议的问题

    https://blog.csdn.net/weixin_30267253/article/details/72417399

    需在framework层添加所需加密套件的调用。此处略。

之后握手成功,但每次HTTP请求,服务器会直接RST,对比正常报文发现ALPN字段。

解决方案: 需升级平台OpenSSL 1.0.2版本(支持ALPN)并升级支持HTTP2.0。

 

2)SNI不支持导致的握手失败。

     Server Name Indication是 TLS 的扩展,用来解决一个服务器拥有多个域名的情况。

 PC端正常命令:openssl s_client -tls1_2 -connect  partner-listing.thredup.com:443 -servername partner-listing.thredup.com

 PC端模拟SNI不支持导致握手失败命令:openssl s_client -tls1_2 -connect  partner-listing.thredup.com:443

    同正常访问的client hello报文做对比

正常报文:

HTTPS SSL/TLS问题及解决方法汇总_第3张图片

SNI不支持:

HTTPS SSL/TLS问题及解决方法汇总_第4张图片

 

解决方案: 支持SNI。

 

 

你可能感兴趣的:(C语言,嵌入式,安卓)