效果:
经过app的SSL证书验证之后,就是这样子,别人无法获取报文,除非服务器的证书信任Charles的证书
前言
1、目前采用的是AFSSLPinningModePublicKey 方式验证。
2、 若想采用AFSSLPinningModeCertificate方式验证,请提供正确的cer 证书。
使用AFSSLPinningModeCertificate 方式验证的时候,获取 DER 表示的数据时
发生如下错误: Create a certificate Return NULL 。
根据“@result Return NULL if the passed-in data is not a valid DER-encoded ”,从而推测cer证书 is not a valid DER-encoded。
• 关于 DER 的概念:
1) 可参见 Wikipedia -》 https://en.wikipedia.org/wiki/X.690#DER_encoding
2)或者 如何查看证书的16进制DER编码,及证书的各个域DER格式-》 http://blog.csdn.net/taolinke/article/details/6248968
使用 AFSecurityPolicy 时,总共有三种验证服务器是否被信任的方式:
AFSSLPinningModeNone
• 这个模式不做本地证书验证(不做 SSL Pinning 操作)
• 直接从客户端系统中的受信任颁发机构 CA 列表中去验证
AFSSLPinningModePublicKey
• 客户端需要一份证书文件的拷贝
• 验证时只验证证书里的公钥,不验证证书的有效期等信息
• 即使伪造证书的公钥,也不能解密传输的数据,必须要私钥
AFSSLPinningModeCertificate
• 客户端需要一份证书文件的拷贝
• 第一步验证、先验证证书的域名/有效期等信息
• 第二步验证、对比服务端返回的证书跟客户端存储的证书是否一致
AFSSLPinningModeCertificate
dispatch_once(&onceToken, ^{
_manager = [AFHTTPRequestOperationManager manager];//只初始化一次
// [_manager setSecurityPolicy:[HTTPRequestManager setupSecurityPolicy]];
});
btn.enabled = NO;
//1. 设置安全策略
[_manager setSecurityPolicy:[HTTPRequestManager setupSecurityPolicy]];
#pragma mark - ******** ssl证书检测设置
+ (AFSecurityPolicy*)setupSecurityPolicy
{
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"cxxxxweimpliuay"ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
[securityPolicy setPinnedCertificates:@[certData]];
securityPolicy.allowInvalidCertificates =NO;//定义了客户端是否信任非法证书
securityPolicy.validatesDomainName =YES;//是指是否校验在证书中的domain这一个字段
securityPolicy.validatesCertificateChain =NO;//指的是是否校验其证书链。
return securityPolicy;
}
作者:u011018979 发表于2017/8/12 14:15:24 原文链接
阅读:25 评论:0 查看评论