jr.*_*jr. 10 iphone macos ssl nsurlconnection
我有一个与许多不同站点通信的应用程序,每个站点都有自己的SSL证书,由我们自己的内部CA签名.这样做可以防止我们为每个站点购买SSL证书(数百或数千),并且在每个站点上使用带有共享密钥的通配符证书时更安全.因此,基本上使用CA证书是唯一的方法.
现在,我有一个mobileprovision文件,它将CA证书作为配置文件安装在手机上.如果我们的iPhone应用程序在获得SSL证书错误时启动,它将通过Safari重定向到此移动配置文件,系统将提示用户安装CA.
问题是我担心Apple AppStore可能会拒绝我的应用程序(此时只是来自其他开发人员的一些反馈),我想研究其他方法来实现这一目标.
基本上我需要完成的是允许SSL连接,该连接将验证将嵌入我的应用程序中的自定义CA证书.这将使CA证书仅对我拨打的电话有效.我使用标准的NSURLConnection方法来与服务进行通信.
这可能吗?有人可以告诉我如何加载CA(PEM的形式是什么?)并将其添加到我的应用程序的可信CA证书列表中?如果那是不可能的,我还有其他选择吗?只是信任所有证书并不是真正的选择,我们希望防止中间人攻击并且只信任我们的CA颁发的证书.
谢谢!
使用 NSURLConnection 的以下两个委托方法来访问任何证书无效的网站
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
NSLog(@"canAuthenticateAgainstProtectionSpace");
if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) {
// Note: this is presently only called once per server (or URL?) until
// you restart the app
NSLog(@"Authentication checking is doing");
return YES; // Self-signed cert will be accepted
// Note: it doesn't seem to matter what you return for a proper SSL cert
// only self-signed certs
}
return NO;
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"didReceiveAuthenticationChallenge");
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
NSLog(@"chalenging protection space authentication checking");
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1441 次 |
最近记录: |