我有以下简单的代码连接到SSL网页
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
Run Code Online (Sandbox Code Playgroud)
如果证书是自签名的,那么它会出错.Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".有没有办法将它设置为接受连接(就像在浏览器中你可以按接受)或绕过它的方法?
https objective-c ssl-certificate ios app-transport-security
我为这个冗长的问题提前道歉.我遇到了自签名SSL证书的问题,我想记录到目前为止我尝试过的所有内容.
我正在开发一个与REST服务通信的应用程序.测试服务器使用自签名的ssl证书,我可以在我的计算机上安装该证书.这是一个需要密码才能安装的.p12文件.如果未安装此证书,则对服务器的所有请求都将返回403.
.p12在Keychain中安装三个项目,一个"根证书颁发机构",一个由"根证书颁发机构"颁发的"测试用户"证书,以及一个与"测试用户"证书相关联的私钥.
我通过给自己发送.p12文件,在iPad上安装了这个证书.我点击附件,输入密码,现在我可以在Safari中访问该网站.不幸的是,由于应用程序沙盒,这还不足以让我的应用程序与REST服务进行通信.
我正在使用ASIHTTPRequest来完成与我的应用程序中的REST服务的所有通信.每个请求都是ASIHTTPRequest的子类.我发现我必须做的第一件事就是调用,[self setValidatesSecureCertificate:NO];以便它甚至可以尝试SSL连接到服务器.如果这就是我所做的,我会从服务中获得403错误代码.
现在我似乎无法弄清楚如何获得使用证书的请求.我已经尝试将这三个项目导出为单独的.cer文件,包括它们在项目中,并使用以下代码将它们添加到请求中:
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"]];
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)data);
...
[self setClientCertificates:[NSArray arrayWithObjects:(id)cert, ..., nil]];
Run Code Online (Sandbox Code Playgroud)
虽然使用这种方法代码执行没有问题,但我仍然得到403错误.
我甚至尝试在我的应用程序中包含.p12文件并使用相同的代码导入它.这会失败,因为SecCertificateCreateWithData返回nil.
我承认我真的不知道我在这里做什么.这一切都在我头上,任何人都可以给我的任何帮助将不胜感激.