SSL Pinning
SSL Pinning 即证书绑定,客户端直接保存服务端证书,建立HTTPS连接时会校验服务端返回证书和客户端证书是否一致,一致则不再去信任证书机构里验证。域名ssl证书
SSL Pinning 为什么安全
其实如果中间人从客户端取出证书(公钥),并使用证书冒充服务器与客户端进行通信时,也可以通过证书验证,但后续流程走不下去,因为客户端会用公钥加密,中间人从客户端截取的证书是公钥,缺少对应私钥即使截获了信息也无法解密。所以能够最大程度保护信息安全
PS: 从上面的通信过程中,最重要的是存储在服务器的私钥。因为只有私钥生成了在通信过程中传递的证书(公钥),且只有通过私钥才能对公钥加密的信息进行解密,所以在开发过程中保护好私钥的安全。
什么时候使用SSL Pinning
如果证书是从受信任的CA机构颁布的,验证是没有问题的,如果是自己颁发证书,无法通过系统受信任的CA机构列表验证证书时,需要通过SSL Pinnig的方式来验证

1.将.cer 证书放进工程中
2.设置securityPolicy证书校验策略
#pragma mark - SecurityPolicy
+ (void)securityPolicy:(AFHTTPSessionManager *)sessionManager{
sessionManager.securityPolicy = [AFSecurityPolicy defaultPolicy];
sessionManager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
/** allowInvalidCertificates 是否允许不信任的证书(证书无效、证书时间过期)通过验证 ,默认为NO */
[sessionManager.securityPolicy setAllowInvalidCertificates:NO];
/** validatesDomainName 是否验证域名证书的CN(common name)字段 默认YES*/
sessionManager.securityPolicy.validatesDomainName = YES;
/** NSSet<NSData*> *pinnedCertificates 根据验证模式来返回用于验证服务器的证书。*/
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"XXXX" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath]; [sessionManager.securityPolicy setPinnedCertificates:[NSSet setWithArray:@[certData]]];
}
SSL协议(传输层安全协议)工作方式:客户端要收发几个握手信号:
1.发送一个“ClientHello”消息。内容包括支持的协议版本,比如TLS1.0版
2.收到一个“ServerHello”消息。内容包括支持的协议版本,
3.客户端与服务端交换证书。(依靠被选择的公钥系统)
4.服务端请求客户端公钥。客户端有证书即双向身份认证,没证书时随机生成公钥
5.客户端与服务端通过公钥保密协议共同的主私钥(伪随机数)
加强
在SSL 3.0中发现设计缺陷后,SSL 被禁用,之后 ETF将SSL标准化,即 RFC 2246 ,并将其称为TLS(Transport Layer Security),即TLS 1.0
TLS 1.0包括可以降级到SSL 3.0的实现,这削弱了连接的安全性
TLS 1.1 添加对CBC攻击的保护:隐式IV被替换成一个显式的IV。更改分组密码模式中的填充错误。支持IANA登记的参数。
TLS 1.2 可使用密码组合选项指定伪随机函数使用SHA-256替换MD5-SHA-1组合。AES加密的支持
TLS 1.3 草案 2016年1月
作者:StarkShen
链接:https://www.jianshu.com/p/309d5359d5cb
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-70435-2.html
刺杀总统本来就是刑事