使用SSL.cert和.key文件请求NSURLSession



我必须在Obj-C项目中通过https登录。所有的url、用户、通行证和所需的东西都很好。对于标识,服务器通过ssl.cert和.key文件进行检查。到目前为止,一切都很好,文件被上传到了服务器,curl从终端建立了良好的连接。我的问题来了。花些时间,到处阅读可用的内容,但根本找不到任何解决方案来发送带有Obj-C请求的ssl文件。(服务器无法接受p12(

这是卷曲:

curl -q -k --cert cert2048.crt --key key2048.key https://somesite.com/ -d "username=usrnm&password=psswrd"

到目前为止,这是我的Obj-C代码:

-(void)connect {

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://somesite.com/"]];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];

NSDictionary* bodyParameters = @{
@"username": @"usrnm",
@"password": @"psswrd"
};

[request setHTTPBody:[self httpBodyForParameters:bodyParameters]];


[request setHTTPMethod:@"POST"];
[request setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"];
[request setValue:@"keep-alive" forHTTPHeaderField:@"Connection"];

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

NSError *jsonError;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
NSLog(@"%@", jsonResponse);
}];

[postDataTask resume];
}

(httpBodyForParameters只是设置请求主体(

连接建立,一切都通过了,jsonResponse按照预期保持响应(好吧,关于身份验证失败的错误消息,以常规格式(。但是我根本找不到像curl行中那样发送ssl文件的方法。遗憾的是,https身份验证远远超出了我的知识范围。我被卡住了。感谢您的每一次帮助。

谢谢,Sz

curl命令使用cert和密钥作为客户端证书进行身份验证,而不是将它们作为文件发送。它实际上是身份验证握手的一部分。

导入PKCS数据并在响应客户端证书挑战时使用它的代码相当复杂,因此,与其试图在脑海中解释这一切,我将向您介绍另一个包含大量代码片段的堆栈溢出问答。

为NSURLConnection身份验证质询创建SecCertificateRef

但是,请注意,该链接中的某些代码并不完全正确。对于未处理的保护空间,应使用默认处理,而不是取消质询。

最新更新