更新

编辑2/6/14:

我创建了一个本地Apache Tomcat服务器来测试带有证书身份验证的SSL.我成功了!使用下面的两种方法,一切都按预期工作. (MKNetworkKit和自定义代码).虽然这确实告诉我我的代码正在运行,但我的原始问题仍未解决.我更新了问题的标题,以更具体地反映问题.有谁知道SAP Portal是否需要特殊设置来接受来自iOS应用程序的证书?请记住,在将CA和.p12导入共享密钥链后,我能够使用Safari移动设备成功进行身份验证,我只是在代码中失败(我现在知道代码可以工作,而不是使用门户网站).

我正在创建一个非常简单的iOS7 Cordova 3.2应用程序,其中包含一个自定义插件,通过仅提供.p12证书进行身份验证(无需基本身份验证或其他用户凭据)从SSL Web服务获取数据.我在物理iPad(没有模拟器)上执行所有测试. Web服务使用自签名证书存在于开发SAP NetWeaver门户框中.目前,我将服务器的CA导入iOS钥匙串以避免证书信任错误.出于测试目的,我的.p12证书在应用程序内部捆绑在mainBundle的根目录中.

尝试连接到Web服务时,我在控制台中收到以下错误:

CFNetwork SSLHandshake failed (-9825)

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9825)

Error Domain=NSURLErrorDomain Code=-1205 "The server “myhostremoved.com” did not accept the certificate." UserInfo=0x14e99000 {NSErrorFailingURLStringKey=https://myhostremoved.com/sslwebservice/, NSErrorFailingURLKey=https://myhostremoved.com/sslwebservice/, NSLocalizedDescription=The server “myhostremoved.com” did not accept the certificate., NSUnderlyingError=0x14d9b1d0 "The server “myhostremoved.com” did not accept the certificate.", NSURLErrorFailingURLPeerTrustErrorKey=}

有很多关于SO的问题与我想要做的事情有关,但没有一个与我所看到的错误有关.我以两种不同的方式处理代码的开发.

首先,我尝试使用已经在SO上的代码,使其适应我的用例.见下面的代码:

- (void)startConnection:(CDVInvokedUrlCommand*)command {

NSDictionary *options = [command.arguments objectAtIndex:0];

NSURL *serverURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@", [options objectForKey:@"host"]]];//hostname provided by Cordova plugin, but could just as easily be hardcoded here

NSMutableURLRequest *connectionRequest = [NSMutableURLRequest requestWithURL:serverURL];

NSURLConnection *connection = nil;

connection = [[NSURLConnection alloc] initWithRequest:connectionRequest delegate:self startImmediately:YES];

}

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {

// gets a certificate from local resources

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"mycert" ofType:@"p12"];

NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];

CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data;

SecIdentityRef identity;

// extract the ideneity from the certificate

[self extractIdentity :inPKCS12Data :&identity];

SecCertificateRef certificate = NULL;

SecIdentityCopyCertificate (identity, &certificate);

const void *certs[] = {certificate};

CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);

// create a credential from the certificate and ideneity, then reply to the challenge with the credential

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identity certificates:(__bridge NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];

[challenge.sender useCredential:credential forAuthenticationChallenge:challenge];

}

- (OSStatus)extractIdentity:(CFDataRef)inP12Data :(SecIdentityRef*)identity {

OSStatus securityError = errSecSuccess;

CFStringRef password = CFSTR("MyCertPassw0rd");

const void *keys[] = { kSecImportExportPassphrase };

const void *values[] = { password };

CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);

CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

securityError = SecPKCS12Import(inP12Data, options, &items);

if (securityError == 0) {

CFDictionaryRef ident = CFArrayGetValueAtIndex(items,0);

const void *tempIdentity = NULL;

tempIdentity = CFDictionaryGetValue(ident, kSecImportItemIdentity);

*identity = (SecIdentityRef)tempIdentity;

}

if (options) {

CFRelease(options);

}

return securityError;

}

在我的第二种方法中,我尝试使用MKNetworkKit库,它抽象出许多与证书接口所需的代码.您需要做的就是提供证书和密码的路径.再次,我得到与上面相同的错误.这段代码如下.

- (void)startConnection:(CDVInvokedUrlCommand*)command {

NSDictionary *options = [command.arguments objectAtIndex:0];

NSURL *serverURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@", [options objectForKey:@"host"]]];//hostname provided by Cordova plugin, but could just as easily be hardcoded here

MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:serverURL customHeaderFields:nil];

MKNetworkOperation *op = [engine operationWithPath:nil params:nil httpMethod:@"GET" ssl:YES];

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"mycert" ofType:@"p12"];

[op setShouldContinueWithInvalidCertificate:YES];

op.clientCertificate = thePath;

op.clientCertificatePassword = @"MyCertPassw0rd";

[op addCompletionHandler:^(MKNetworkOperation *operation) {

NSLog(@"[operation responseData]-->>%@", [operation responseString]);

}errorHandler:^(MKNetworkOperation *errorOp, NSError* err) {

NSLog(@"MKNetwork request error : %@", [err localizedDescription]);

}];

[engine enqueueOperation:op];

}

我使用这两种方法得到了同样的错误.有任何想法吗?

已知信息

>我知道该应用程序正在查找.p12证书,因为当我捏造.p12证书的路径时,我收到一条错误消息,说它无法找到我通常不会看到的证书.

>我知道我为证书文件提供的密码是正确的,因为当我捏造密码时,我收到一个关于我通常不会看到的密码的错误.

>我不认为证书信任是一个问题,因为如果我从iOS钥匙串中删除我的服务器的CA,我在控制台中得到一个错误,特别声明服务器不可信任.添加CA后,不再出现此错误,但我得到与上面相同的错误(-9825)

其他测试

在代码中提供基本身份验证(绕过证书身份验证)时,一切都按预期工作,我没有收到任何错误.

我也尝试了上面所有相同的步骤,但使用.pfx文件而不是我的.p12证书,相同的错误.

SSL服务适用于移动Safari.我通过iPhone配置实用程序将.p12证书导入我的钥匙串,并通过移动safari测试了Web服务.一切都按预期工作,没有错误发生(也没有信任错误),我收到预期的输出.

我也可以使用rest-client utility在桌面上成功测试Web服务

TL; DR

我正在尝试使用objective-c中的.p12证书对SSL Web服务进行身份验证.我知道服务器和Web服务都使用auth的cert,但是当我尝试在objective-c中建立连接时,我一直收到错误,所以我的代码中必定存在错误.请帮忙!

ios 凭据验证_iOS应用SSL .p12身份验证 – 证书错误(-9825)相关推荐

  1. 身份证验证 校验码_用户身份验证最佳做法清单

    身份证验证 校验码 用户身份验证是每个Web应用程序共享的功能. 我们已经实施了很多次了,所以早就应该完善它了. 然而,错误无时无刻不在. 造成这种情况的部分原因是,可能出错的事情列表很长. 您可能会 ...

  2. api身份验证_api上下文中的身份验证

    api身份验证 APIs are becoming a main interface for interacting with many things, from enterprise service ...

  3. 采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录

    采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录 1.集成的Windows身份验证语法范例 1 <connectionStrings> <add nam ...

  4. windows 中 vpn连接提示, 虚拟专用网络 由于RAS/虚拟专用网络,服务器上配置的某个策略,服务器用于验证用户名和密码的身份验证方法可能与连接配置文件中的身份证验证方法不匹配

    windows 虚拟专用网络 由于RAS/虚拟专用网络,服务器上配置的某个策略,服务器用于验证用户名和密码的身份验证方法可能与连接配置文件中的身份证验证方法不匹配 打开网络 更换网络适配器 选项 右键 ...

  5. 找不到凭据分配oracle修正,远程连接身份验证错误,又找不到加密Oracle修正

    用远程桌面连接登陆服务器的时候跳出来一个对话框,提示"发生身份验证错误,要求的函数不受支持."的现象的解决方案如下所示. 解决方案1 策略路径:"计算机配置"- ...

  6. php ldap ad 登录验证,PHP中的LDAP身份验证 – 无需密码即可进行身份验证

    我在LDAP身份验证上遇到了一个奇怪的行为,我需要这个用他们的AD凭据来验证用户,这就是我所拥有的: session_start(); $adServer = "MY IP"; $ ...

  7. 远程桌面无法验证计算机身份验证,远程桌面时出现“身份验证错误,要求的函数不受支持”解决办法...

    远程桌面时 "出现身份验证错误,要求的函数不受支持"的错误,如图所示: 这是由于本地客户端或者服务器端一方更新了CVE-2018-0886 的 CredSSP 补丁,而另外一方未安 ...

  8. iis授权mysql验证_ASP.NET Web API身份验证和授权

    本文是作者所理解和翻译的内容. 这篇文章包括两部分:身份验证和授权. 身份验证用来确定一个用户的身份.例如,Alice用她的用户名和密码登陆系统,服务器用她的用户名和密码来确定她的身份. 授权是判断一 ...

  9. java web 手机验证_Java 手机Web开发 身份验证

    Java web和手机端开发 遇到比较麻烦的就是身份验证 目前为止觉得最好的解决方案是 Java 中使用jwt 为什么要使用jwt,让网络数据更加安全,以防其他一些人无意恶搞 在这里简单说下:jwt是 ...

最新文章

  1. 第十六届全国大学生智能汽车竞赛(西部赛区) 竞速组成绩及获奖情况公示
  2. Nginx配置——搭建 Nginx 高可用集群(双机热备)
  3. 2016 CVPR 德州仪器 ADAS Tutorial
  4. 论文辅助笔记(代码实现):Bayesian Probabilistic Matrix Factorizationusing Markov Chain Monte Carlo
  5. 【独家】百度移动云高级美女产品经理:O2O日趋火爆,下个估值过亿的上门美业将花落谁家?...
  6. 在银行存款被吞了,怎么能快速解决?
  7. 用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(二)
  8. linux 链接文件 通配符,linux globbing文件通配符
  9. 与指定数字相同的数的个数(信息学奥赛一本通-T1068)
  10. 1.4 如何学习设计模式
  11. 什么是智能决策支持系统?
  12. ISO 12233和SFR
  13. python手机版做小游戏代码大全-用Python设计一个经典小游戏
  14. iphone7p配置参数详情_求iPhone7具体参数配置
  15. $(html) 原生js,原生js仿jquery一些常用方法(必看篇)
  16. 在没有ftp上传软件时怎么上传
  17. 大数据应用对企业税务风险管理影响
  18. 【菜鸟学习论文】2020_Cascade Cost Volume for High-Resolution Multi-View Stereo and Stereo Matching
  19. 失败并不可怕,可怕的是害怕失败
  20. 哈希(Hash)算法

热门文章

  1. python车牌识别使用训练集_基于Python 实现的车牌识别项目
  2. 业绩下滑、利润缩水,除了一直涨价,涪陵榨菜还有什么招数?
  3. 风帆头,旗帜服,“背”在肩上的古国王印
  4. 电竞达人最爱五款真无线蓝牙耳机,听声辨位低延迟TWS蓝牙耳机助你《夺冠》
  5. 河北科技大学电子商务马志伟
  6. 成为一名优秀的架构师需要哪些条件?
  7. MySQL高可用方案
  8. Python 拓展之详解深拷贝和浅拷贝
  9. vue项目使用svg文件
  10. P、*P和P三者的区别