关于HTTPS的配置和理解及证书配置

最近,公司要搞HTTPS,现说下HTTPS的简单原理和配置过程,希望对你有帮助。

HTTPS和HTTP的区别

HTTPS 是运行在 TLS/SSL 之上的 HTTP,与普通的 HTTP 相比,在数据传输的安全性上有很大的提升。
要了解它安全性的巧妙之处,需要先简单地了解对称加密和非对称加密的区别:
1.对称加密只有一个密钥,加密和解密都用这个密钥;
2.非对称加密有公钥和私钥,私钥加密后的内容只有公钥才能解密,公钥加密的内容只有私钥才能解密。
3.为了提高安全性,我们常用的做法是使用对称加密的手段加密数据。可是只使用对称加密的话,双方通信的开始总会以明文的方式传输密钥。那么从一开始这个密钥就泄露了,谈不上什么安全。所以 TLS/SSL 在握手的阶段,结合非对称加密的手段,保证只有通信双方才知道对称加密的密钥。

百科:超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

如何防止通讯过程中的数据的泄密和被篡改

单向认证:
材料:买来的服务器证书server.cer(客户端要放一个,用来验证服务端),客户端,服务器。

数据加密基本原理:RSA加密+对称加密(数据data经对称密钥key加密,然后把对称密钥key经RSA公钥加密)
1、客户端向服务器发起请求。
2、服务器响应到请求,同时把服务器的证书发给客户端。
3、客户端接收到证书,然后和客户端中的证书对比,如果证书不一致或者无效,那么断开连接。如果通过,那么进行第四部。
4、客户端产生一个随机密钥,然后经服务器证书中的公钥进行加密,传给服务端。
5、服务端拿到加密数据和加密密钥,用服务器的私钥解开密钥,得到对称密钥key。
6、服务端和客户端互相通讯指定这个密钥为加密密钥。握手结束
7、客户端和服务端开始通讯,通讯数据由对称密钥加密。

百科:
一般意义上的https,就是服务器有一个证书。(单向)
(a) 主要目的是保证服务器就是他声称的服务器,这个跟第一点一样。
(b)服务端和客户端之间的所有通讯都是加密的。
(1). 具体讲,是客户端产生一个对称的密钥,通过服务器的证书来交换密钥,即一般意义上的握手过程。
(2). 接下来所有的信息往来就都是加密的。第三方即使截获,也没有任何意义,因为他没有密钥,当然篡改也就没有什么意义了。

双向认证
双向认证比单向认证多了一步,就是服务器要认证客户端,按照百度百科上的步骤,客户端应该有一个由CA(或正规机构)签发的p12证书,和CA根证书(签名的p12就是由这个签名的,上面的CA根证书和p12证书 其实都可以自签的,下面介绍的也是自签的
材料:买来的服务器证书server.cer(客户端要放一个,用来验证服务端),客户端,服务器端,CA的根证书(放到服务器中,用来验证客户端的证书),p12证书(用来放到客户端,网络请求的时候会传给服务端)。

步骤:就是在上面第4步的时候,要用p12文件来对一段数据进行签名,然后把签名和p12证书,加密的对称密钥(上面的说过的)传给服务器,然后服务器接到以后,会用CA根证书(或自签的根证书)来对证书和签名数据进行验证,如果正确,通讯继续,否则,断开连接。

百科:
少许对客户端有要求的情况下,会要求客户端也必须有一个证书。(双向)
(a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码,还有一个CA 认证过的身份。因为个人证书一般来说是别人无法模拟的,所有这样能够更深的确认自己的身份。
(b) 目前大多数个人银行的专业版是这种做法,具体证书可能是拿U盘(即U盾)作为一个备份的载体。

简单配置HTTPS

如果公司买的CA颁发的证书,那什么都不用处理。
如果是自签证书需要做一下操作
1.后台同事会给你发一份. crt后缀的证书,我们需要的是.cer 的,所以我们可以导入到钥匙串中,然后找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书,然后直接放进工程里。

2.修改发起请求的类

+ (AFSecurityPolicy*)customSecurityPolicy
{
    // /先导入证书
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];//证书的路径
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    
    // AFSSLPinningModeCertificate 使用证书验证模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    
    // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
    // 如果是需要验证自建证书,需要设置为YES
    securityPolicy.allowInvalidCertificates = YES;
    
    //validatesDomainName 是否需要验证域名,默认为YES;
    //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
    //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
    //如置为NO,建议自己添加对应域名的校验逻辑。
    securityPolicy.validatesDomainName = NO;
    
    securityPolicy.pinnedCertificates = @[certData];
    
    return securityPolicy;
}

在请求时加上这行代码,

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//https ssl 验证
[mgr setSecurityPolicy:[self customSecurityPolicy]];

3.这样基本就完成了。如果你发现有些请求失败了。就要检查下是不是一个域名了。比如图片,后台可能用的另一个域名。比如webview可以正常显示么。如果有问题,就要修改info.plist,看这篇文章,很详细。
https://www.jianshu.com/p/ef59129ede61
把你需要特殊处理的域名设置一下。
我们一般抓包工具抓取我们App请求数据,会很容易,都是明文,但是也有一些是乱码,因为数据已经加密了,如果你看到你们的请求是https,
然后就告诉后台OK了。

参考文章
简单原理链接
https://blog.csdn.net/qq_35612929/article/details/60962138
https://www.cnblogs.com/oc-bowen/p/5896041.html
具体配置链接
https://www.jianshu.com/p/ef59129ede61

你可能感兴趣的:(关于HTTPS的配置和理解及证书配置)