1.取到证书
客户端需要证书(Certification file), .cer格式的文件。可以跟服务器端索取。
如果他们给个.pem文件,要使用命令行转换:
openssl x509 -inform PEM -in name.pem -outform DER -out name.cer
如果给了个.crt文件,请这样转换:
openssl x509 -in name.crt -out name.cer -outform der
如果啥都不给你,你只能自己动手了:
openssl s_client -connect www.website.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > myWebsite.cer
2.将cer证书拖进项目目录中
把生成的.cer证书摁住直接拖进你的项目相关文件中,记得勾选Copy items if needed和你的targets
3.代码
_sessionManager = [[AFHTTPSessionManager manager]initWithBaseURL:[NSURL URLWithString:BASE_URL]];
///ssl证书配置----------------------
//3.https 证书配置
//3.1 将证书拖进项目
//3.2 获取证书路径
NSString *certPath = [[NSBundle mainBundle] pathForResource:@"ssl-bundles" ofType:@"cer"];
//3.3 获取证书data
NSData *certData = [NSData dataWithContentsOfFile:certPath];
//3.4 创建AFN 中的securityPolicy
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates
:[[NSSet alloc] initWithObjects:certData,nil]];
//3.5 这里就可以添加多个server证书
NSSet *dataSet = [[NSSet alloc]initWithObjects:certData, nil];
//3.6 绑定证书(不止一个证书)
[securityPolicy setPinnedCertificates:dataSet];
//3.7 是否允许无效证书
[securityPolicy setAllowInvalidCertificates:NO];
//3.8 是否需要验证域名
/*
validatesDomainName 是否需要验证域名,默认为YES;
假如证书的域名与你请求的域名不一致,需把该项设置为NO;
如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。
因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;
当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
如置为NO,建议自己添加对应域名的校验逻辑。
*/
[securityPolicy setValidatesDomainName:YES];
_sessionManager.securityPolicy = securityPolicy;
[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
///--------------------------------------