gpt4 book ai didi

iOS 9 ATS 使用自签名证书阻止对服务器的 HTTPS 请求

转载 作者:行者123 更新时间:2023-11-29 01:15:47 24 4
gpt4 key购买 nike

这个问题遍布 Stack Overflow,过去 2 天我一直在尝试无数种 ATP 配置组合,并让我的应用程序正常工作。我将彻底解决我的问题,因为看起来最微小的事情都会影响如何解决这个问题。

我最近刚刚设置了一个启用了 SSL 和 TLS 1.2 的 Ubuntu 14 服务器。在我的服务器上是我的应用程序所依赖的服务器端脚本。在我的应用程序中,我使用 NSMutableURLRequest 从服务器请求我的 API,如下所示:

NSString * noteDataString = [NSString stringWithFormat:@"email=%@&password=%@&type=%@", companyEmail, companyPassword, @"login"];
NSData * postData = [noteDataString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString * postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];

NSMutableURLRequest * request = [[NSMutableURLRequest alloc] init];

[request setURL:[NSURL URLWithString:@"https://mydomain.me:443/path/to/file.php"]];

[request setHTTPMethod:@"POST"];

[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSHTTPURLResponse * urlResponse = nil;
NSError * error = nil;
NSData * responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
NSString * result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

NSLog(@"Response Code: %ld", (long)[urlResponse statusCode]);

当我将 url 复制到 Chrome 时,会显示正确的 PHP 返回值。当从 iOS 9 上的 Xcode 7 请求时,我收到此错误:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

我在类似问题中使用了无数的 info.plist 设置。我试过禁用前向保密的需要,我试过启用任意负载,我试过使用异常域 mydomain.me 及其子域。我取得的唯一进展是将错误代码 -9813 切换为 -9802。

我知道为 NSURLRequest 添加委托(delegate)方法,但这些方法从未被调用,并且被认为对于解决此问题是多余的。

我使用 localhost 和 http 在 MAMP 服务器上构建了很多应用程序,当我启用任意加载时请求有效,所以我的 plist 没有问题。

令人难以置信的是为什么我有一个特殊情况,我知道 Stack Overflow 是处理这种情况的地方!

谢谢,我希望这在解决后能帮助我以外的更多开发人员。

最佳答案

解决方案。感谢评论中的每个人为我指明了正确的方向。解决方案是创建一个 NSObject 来处理这种特殊情况的 NSURLRequests。

归功于:https://www.cocoanetics.com/2010/12/nsurlconnection-with-self-signed-certificates/

以下几乎是链接中教程的直接副本,但我认为留在此处会更容易。

所以,

我必须使用以下代码创建一个新的 NSObject 类:

BWWebService.h

#import <Foundation/Foundation.h>

@interface BWWebService : NSObject{
NSMutableData *receivedData;
NSURLConnection *connection;
NSStringEncoding encoding;
}

- (id)initWithURL:(NSURL *)url;

@end

BWWebService.m

#import "BWWebService.h"

@implementation BWWebService

- (id)initWithURL:(NSURL *)url{
if (self = [super init]){
NSURLRequest * request = [NSURLRequest requestWithURL:url];

connection = [NSURLConnection connectionWithRequest:request delegate:self];

[connection start];
}

return self;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
// Every response could mean a redirect
receivedData = nil;

CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)
[response textEncodingName]);
encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
if (!receivedData){
// No store yet, make one
receivedData = [[NSMutableData alloc] initWithData:data];
}else{
// Append to previous chunks
[receivedData appendData:data];
}
}

// All worked
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSString * xml = [[NSString alloc] initWithData:receivedData encoding:encoding];
NSLog(@"%@", xml);
}

// And error occurred
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"Error retrieving data, %@", [error localizedDescription]);
}

// To deal with self-signed certificates
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace{
return [protectionSpace.authenticationMethod
isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
// we only trust our own domain
if ([challenge.protectionSpace.host isEqualToString:@"myuntrusteddomain.me"]){
NSURLCredential * credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
[challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
}
}

[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
@end

如果这还不够,为了发出请求,我使用以下内容替换我的原始请求:

NSURL * url = [NSURL URLWithString:@"https://myuntrusteddomain.me:443/path/to/script.php"];
BWWebService * webService;
webService = [[BWWebService alloc] initWithURL:url];

我知道这不像原来的那样发布数据,但那是后来的。我确信这将是处理 initWithURL 中的 POST 的问题。

谢谢大家

编辑:该解决方案的应用似乎只适用于将“允许任意加载”设置为"is"的情况。

关于iOS 9 ATS 使用自签名证书阻止对服务器的 HTTPS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35207139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com