微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 iOS 中使用带有 SSL 固定的自签名证书

如何解决在 iOS 中使用带有 SSL 固定的自签名证书

我想要做的是连接到我的使用自签名证书的 api 服务器。我想设计一个解决方案,其中应用程序本身具有该证书并使用该证书来验证请求。我正在使用 SSL 固定来将我的自签名证书与应用程序包固定在一起。在测试时,我发现尝试连接到服务器时连接被取消。该应用程序可以获取服务器证书和本地证书数据并比较它们工作正常。但是在尝试为服务器信任设置 SSL 策略时。它总是失败并返回 kSecTrustResultRecoverableTrustFailure 。唯一的另一种方法是在设备上手动安装根证书,这是一个糟糕的 UX,如果可能的话,我不希望我的最终用户使用它。我听说它可以在 Android 中完成,但还没有找到任何适用于 ios 版本的解决方案。下面是我处理 SSL 固定的委托函数。任何帮助将不胜感激,因为很难找到阅读此类问题的帮助。我知道这个问题是由于自签名证书没有得到任何流行 CA 的验证,但我正在寻找解决方法

-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengedisposition,NSURLCredential * _Nullable))completionHandler {

// Get remote certificate
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust,0);

// Set SSL policies for domain name check
NSMutableArray *policies = [NSMutableArray array];
[policies addobject:(__bridge_transfer id)SecPolicyCreateSSL(true,(__bridge CFStringRef)challenge.protectionSpace.host)];
SecTrustSetPolicies(serverTrust,(__bridge CFArrayRef)policies);

// Evaluate server certificate
SecTrustResultType result;
SecTrustEvaluate(serverTrust,&result);
BOOL certificateIsValid = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed);

// Get local and remote cert data
NSData *remoteCertificateData = CFBridgingrelease(SecCertificatecopyData(certificate));
Nsstring *pathToCert = [[NSBundle mainBundle]pathForResource:@"randomCertificate.com" ofType:@"cer"];
NSData *localCertificate = nil;
if ([[NSFileManager defaultManager] fileExistsAtPath:pathToCert]) {
    localCertificate = [NSData dataWithContentsOfFile:pathToCert];
} else {
    NSLog(@"Certificate does not exist in app");
}

// The pinnning check
if ([remoteCertificateData isEqualToData:localCertificate] && certificateIsValid) {
    NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
    completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
} else {
    completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge,NULL);
}}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?