https你使用对了吗?

作者 : 开心源码 本文共4449个字,预计阅读时间需要12分钟 发布时间: 2022-05-11 共75人阅读

HTTPS是HTTP over SSL/TLS,HTTP是应使用层协议,TCP是传输层协议,在应使用层和传输层之间,添加了一个安全套接层SSL/TLS:

https你使用对了吗?

SSL/TLS层负责用户端和服务器之间的加解密算法协商、密钥交换、通信连接的建立,安全连接的建立过程如下所示:

https你使用对了吗?

后面会单独开一篇来说明https握手过程,喜欢的能先关注,定期发布技术文章

如何用HTTPS

数字证书、CA与HTTPS

信息安全的基础依赖密码学,密码学涉及算法和密钥,算法一般是公开的,而密钥需要得到妥善的保护,密钥如何产生、分配、用和回收,这涉及公钥基础设备。

公钥基础设备(PKI)是一组由硬件、软件、参加者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、用、存储以及撤销数字证书。公钥存储在数字证书中,标准的数字证书一般由可信数字证书认证机构(CA,根证书颁发机构)签发,此证书将使用户的身份跟公钥链接在一起。CA必需保证其签发的每个证书的使用户身份是唯一的。

链接关系(证书链)通过注册和发布过程创立,取决于担保级别,链接关系可可以由CA的各种软件或者在人为监督下完成。PKI确实定链接关系的这一角色称为注册管理中心(RA,也称中级证书颁发机构或者者中间机构)。RA确保公钥和个人身份链接,能防抵赖。假如没有RA,CA的Root 证书遭到破坏或者者泄露,由此CA颁发的其余证书就一律失去了安全性,所以现在主流的商业数字证书机构CA一般都是提供三级证书,Root 证书签发中级RA证书,由RA证书签发使用户用的证书。

X509证书链,左边的是CA根证书,中间的是RA中间机构,右边的是使用户:

https你使用对了吗?

www.google.com 网站的证书链如下,CA证书机构是 GeoTrust Global CA,RA机构是 Google Internet Authority G2,网站的证书为 *.google.com:

https你使用对了吗?

HTTPS通信所使用到的证书由CA提供,需要在服务器中进行相应的设置才可以生效。另外在我们的用户端设施中,只需访问的HTTPS的网站所使用的证书是可信CA根证书签发的,假如这些CA又在浏览器或者者操作系统的根信任列表中,即可以直接访问,而如12306.cn网站,它的证书是非可信CA提供的,是自己签发的,所以在使用谷歌浏览器打开时,会提醒“您的连接不是私密连接”,证书是非可信CA颁发的:

https你使用对了吗?

所以在12306.cn的网站首页会提醒为了我们的购票顺利,请下载安装它的根证书,操作系统安装后,就不会再有上图的提醒了。

https你使用对了吗?

自有数字证书的生成

HTTPS网站所使用的证书可向可信CA机构申请,不过这一类基本上都是商业机构,申请证书需要缴费,一般是按年缴费,费使用由于CA机构的不同而不同。假如只是APP与后端服务器进行HTTPS通信,能用openssl工具生成自签发的数字证书,能节约费使用,不过得妥善保护好证书私钥,不可以泄露或者者丢失。HTTPS通信所使用的数字证书格式为X.509。

自签发数字证书步骤如下:

Step1 生成自己的CA根证书

生成CA私钥文件ca.key:

openssl genrsa -out ca.key 1024

生成X.509证书签名请求文件ca.csr:

openssl req -new -key ca_private.key -out ca.csr

在生成ca.csr的过程中,会让输入少量组织信息等。

生成X.509格式的CA根证书ca_public.crt(公钥证书):

openssl x509 -req -in ca.csr -signkey ca_private.key -out ca_public.crt

Step2 生成服务端证书

先生成服务器私钥文件server_private.key:

openssl genrsa -out server_private.key 1024

根据服务器私钥生成服务器公钥文件server_public.pem:

openssl rsa -in server_private.key -pubout -out server_public.pem

服务器端需要向CA机构申请签名证书,在申请签名证书之前仍然是创立自己的证书签名请求文件server.csr:

openssl req -new -key server_prviate.key -out server.csr

https你使用对了吗?

对于使用于HTTPS的CSR,Common Name必需和网站域名一致,以便之后进行Host Name校验。

服务器端使用server.csr文件向CA申请证书,签名过程需要CA的公钥证书和私钥参加,最终颁发一个带有CA签名的服务器端证书server.crt:

openssl x509 -req -CA ca_public.crt -CAkey ca_private.key -CAcreateserial -in server.csr -out server.crt

假如服务器端还想校验用户端的证书,能按生成服务器端证书的形式来生成用户端证书。

用openssl查看证书信息:

openssl x509 -in server.crt -text -noout

使用web.py搭建一个简单的服务器测试生成的server.crt,文件webpytest.py为:

https你使用对了吗?

在本地运行web服务器程序:

python webpytest.py 1234

在safari浏览器中输入 https://0.0.0.0:1234 ,提醒此证书无效(主机名不相符),由于在生成服务器端证书签名请求文件server.csr时,在Common Name中输入的是localhost,与0.0.0.0不符:

https你使用对了吗?

在safari浏览器中输入 https://localhost:1234 ,不再提醒主机名不相符了,而是提醒此证书是由未知颁发机构签名的,由于是私有CA签发的证书,私有CA不在浏览器或者者操作系统的的根信任列表中

https你使用对了吗?

还可使用以下命令查看网站证书信息:

openssl s_client -connect localhost:1234

服务器端搭建成功,接下来讲Android用户端怎样和服务端进行HTTPS通信。

用HttpsURLConnection进行HTTPS通信

Android官网给出了用HttpsURLConnection API访问HTTPS的网站示例:

https你使用对了吗?

此方法的特点:

  • 由Android系统校验服务端数字证书的合法性,使用可信CA签发的数字证书的网站才能正常访问,私有CA签发的数字证书的网站无法访问。

  • 不可以抵御在使用户设施上安装证书(将中间人服务器的证书放到设施的信任列表中)进行中间人攻击,做此类攻击的一般是为了分析应使用和服务器的交互协议,找应使用和服务器的其余漏洞。

  • 假如网站没有启使用SSL site wide(use HTTPS only)或者HSTS(HTTP Strict Transport Security)则无法抵御SSL Strip(HTTPS降级为HTTP)攻击,局域网攻击,如针对免费WiFi。

假如要用私有CA签发的证书,必需重写校验证书链TrustManager中的方法,否则的话会出现javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found。但是在重写TrustManger中的checkServerTrusted()很多开发者什么也没有做,会导致证书弱校验(没有真正校验证书)。

如下是错误的写法:

https你使用对了吗?

正确的写法是真正实现TrustManger的checkServerTrusted(),对服务器证书域名进行强校验或者者真正实现HostnameVerifier的verify()方法。

真正实现TrustManger的checkServerTrusted()代码如下:

https你使用对了吗?

其中serverCert是APP中预埋的服务器端公钥证书,假如是以文件形式,其获取为如下形式:

https你使用对了吗?

对服务器证书域名进行强校验:

https你使用对了吗?

真正实现HostnameVerifier的verify()方法:

https你使用对了吗?

另外一种写法证书锁定,直接使用预埋的证书来生成TrustManger,过程如下:

https你使用对了吗?

参数certStream是证书文件的InputSteam流:

https你使用对了吗?

另外能使用以下命令查看服务器证书的公钥:

keytool -printcert -rfc -file uwca.crt

直接复制粘贴能将公钥信息硬编码在代码中:

https你使用对了吗?

能使用以下形式获取此公钥对应的X.509证书:

https你使用对了吗?

用OKHttp3.0进行HTTPS通信

除了用Android系统提供的HttpsURLconnection进行https通信,还有其余的第三方库能用,以OKhttp3.0为例,先看未校验服务器端证书链、未校验服务端证书域名的错误写法:

https你使用对了吗?

这些错误的发生其实和HttpsURLConnection的其实相同,都涉及SSLContext和HostnameVerifier,处理办法也和2.3 节相同用HttpsURLConnection都是真正实现TrustManager和HostnameVerifier中的方法。

Webview的HTTPS安全

目前很多应使用都使用webview加载H5页面,假如服务端采使用的是可信CA颁发的证书,在 webView.setWebViewClient(webviewClient) 时重载 WebViewClient的onReceivedSslError() ,假如出现证书错误,直接调使用handler.proceed()会忽略错误继续加载证书有问题的页面,假如调使用handler.cancel()能终止加载证书有问题的页面,证书出现问题了,能提醒使用户风险,让使用户选择加载与否,假如是需要安全级别比较高,能直接终止页面加载,提醒使用户网络环境有风险:

不建议直接使用handler.proceed(),

假如webview加载https需要强校验服务端证书,能在 onPageStarted() 中使用 HttpsURLConnection 强校验证书的方式来校验服务端证书,假如校验不通过中止加载网页。当然这样会拖慢网页的加载速度,需要进一步优化,具体优化的办法不在本次探讨范围,这里也不详细讲解了。

很多APP都存在HTTPS用不当的风险。正确用HTTPS可以有效抵御在使用户设施上安装证书进行中间人攻击和SSL Strip攻击。

但是上述方法都需要在用户端中预埋证书文件,或者者将证书硬编码写在代码中,假如服务器端证书到期或者者由于泄露等其余起因需要更换证书,也就必需强制使用户进行用户端更新,体验效果不好。APP开发者只要要将公钥放在安全组件中,安全组件的动态密钥功可以能实现公钥的动态更新。

另外正确用HTTPS并非完全可以够防住用户端的Hook分析修改,要想保证通信安全,也需要依靠其余方法,比方重要信息在交给HTTPS传输之前进行加密,另外实现用户端请求的签名解决,保证用户端与服务端通信请求不被伪造.

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » https你使用对了吗?

发表回复