HTTPS (全称:HyperText Transfer Protocol over Secure Socket Layer)
Google 很早就使用了HTTPS,主要是为了保证用户的数据安全。 Google、Baidu、Facebook 、字节跳动这样的互联网巨头,都在广泛使用HTTPS搭建网站、接口、服务等, 国内外的大型互联网公司很多也都已经启用了全站 HTTPS,这也是程序员学习http协议的基础,走向互联网开发必要技能。
搜索引擎巨头为了鼓励全球公司和站长们将网站HTTPS协议化,所以它们都提出了几点要求:
本文将分以下5点进行阐述。
我们都知道HTTPS比HTTP安全,并且如今大多数的网站和接口都是用HTTPS协议搭建的,大家也听说过SSL、对称加密、非对称加密、CA证书等。
但是以下三个问题作为程序员的你,真的理解吗?
HTTPS 协议之所以安全是因为 HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但是!!HTTPS 在内容传输的加密上使用的是对称加密,而非对称加密只作用在证书验证阶段。
HTTPS 的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:
证书验证阶段:
数据传输阶段:
为什么数据传输是用对称加密?
首先,非对称加密的加解密效率是非常低的,而 HTTP 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的。
另外,在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。
为什么需要 CA 认证机构颁发证书?
HTTP 协议被认为不安全是因为传输过程容易被监听者监听、伪造服务器请求,而 HTTPS 协议主要解决的便是网络传输的安全性问题。
首先我们假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的“中间人攻击”问题。
“中间人攻击”的具体过程如下:
过程原理如下:
由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。
浏览器是如何确保 CA 证书的合法性?
1.证书包含什么信息?
证书包含信息如下:
2.证书的合法性依据是什么?
3.浏览器如何验证证书的合法性?
比如打开Google.com 查看CA证书,是由GTS CA机构颁发,该机构是Google成立的权威机构
比如天猫商城,证书的颁发机构是GlobalSign 根证书权威机构
判断证书是否被篡改。需要与 CA 服务器进行校验。
判断证书是否已吊销。通过 CRL(Certificate Revocation List 证书注销列表)和 OCSP(Online Certificate Status Protocol 在线证书状态协议)实现。
其中 OCSP 可用于第 3 步中以减少与 CA 服务器的交互,提高验证效率。
以上任意一步都满足的情况下浏览器才认为证书是合法的。
这里插一个我想了很久的但其实答案很简单的问题:既然证书是公开的,如果要发起中间人攻击,我在官网上下载一份证书作为我的服务器证书,那客户端肯定会认同这个证书是合法的,如何避免这种证书冒用的情况?
其实这就是非加密对称中公私钥的用处,虽然中间人可以得到证书,但私钥是无法获取的。
一份公钥是不可能推算出其对应的私钥,中间人即使拿到证书也无法伪装成合法服务端,因为无法对客户端传入的加密数据进行解密。
4.只有认证机构可以生成证书吗?
在服务器上配置站点时,nginx的server段配置如下
Nginx配置:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name telabytes.com;
root /usr/share/nginx/html;
ssl_certificate /home/SSLKeys/3094207_telabytes.com.pem;
ssl_certificate_key /home/SSLKeys/3094207_telabytes.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
......
}
以上配置完成后,重启service nginx restart
配置。
在苹果电脑上,一般我们使用Charles,
Charles抓包和篡改数据可以看这里:https://www.jianshu.com/p/e26151084add
配置流程是:
具体操作请看我的另一篇教程
https://blog.csdn.net/u013538542/article/details/79107106
https://blog.csdn.net/u013538542/article/details/103126153
两种方式
1.一种是检测app是被代理了,如果被代理了,则禁止不发送网络请求,iOS的代码是
+ (BOOL)getProxyStatus {
NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@"http://www.baidu.com"]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
NSDictionary *settings = [proxies firstObject];
NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"]){
//没有设置代理
return NO;
} else {
//设置代理了
return YES;
}
}
2.证书验证
思路就是:
动态调试HTTPS请求主要是将HTTPS请求做一个断点breakpoints,然后当下一次请求来临时,就会在断点处停止,然后我们可以动态的修改参数,以便于调试
详细的请看:https://www.jianshu.com/p/e26151084add
注:用了 HTTPS 会被抓包吗?
HTTPS 可以防止用户在不知情的情况下通信链路被监听,对于主动授信的抓包操作是不提供防护的,因为这个场景用户是已经对风险知情。