- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有作为文件提供给我的 ssl 证书 (.cer)。我将它添加到 bundle 中并希望使用它与服务器通信。
我使用了苹果提供的代码:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
DLog(@"didReceiveAuthenticationChallenge : %@",challenge);
if ([challenge.protectionSpace.authenticationMethod
isEqualToString:NSURLAuthenticationMethodServerTrust])
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:filePath];
CFDataRef myCertData = (__bridge CFDataRef)certData;
SecCertificateRef myCert = SecCertificateCreateWithData(NULL,
myCertData);
SecPolicyRef myPolicy = SecPolicyCreateBasicX509(); // 3
SecCertificateRef certArray[1] = { myCert };
CFArrayRef myCerts = CFArrayCreate(NULL,
(void *)certArray,
1,
NULL);
SecTrustRef myTrust;
OSStatus status = SecTrustCreateWithCertificates(
myCerts,
myPolicy,
&myTrust); // 4
SecTrustResultType trustResult = 0;
if (status == noErr) {
status = SecTrustEvaluate(myTrust, &trustResult); // 5
}
// If the trust result is kSecTrustResultInvalid, kSecTrustResultDeny, kSecTrustResultFatalTrustFailure, you cannot proceed and should fail gracefully.
BOOL proceed = NO;
switch (trustResult) {
case kSecTrustResultProceed: // 1
DLog(@"Proceed");
proceed = YES;
break;
case kSecTrustResultConfirm: // 2
DLog(@"Confirm");
proceed = YES;
break;
case kSecTrustResultUnspecified: // 4
DLog(@"Unspecified");
break;
case kSecTrustResultRecoverableTrustFailure: // 5
DLog(@"TrustFailure");
proceed = [self recoverFromTrustFailure:myTrust];
break;
case kSecTrustResultDeny: // 3
DLog(@"Deny");
break;
case kSecTrustResultFatalTrustFailure: // 6
DLog(@"FatalTrustFailure");
break;
case kSecTrustResultOtherError: // 7
DLog(@"OtherError");
break;
case kSecTrustResultInvalid: // 0
DLog(@"Invalid");
break;
default:
DLog(@"Default");
break;
}
if (myPolicy)
CFRelease(myPolicy);
if (proceed) {
[challenge.sender useCredential:[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust] forAuthenticationChallenge: challenge];
}else{
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
}
- (BOOL) recoverFromTrustFailure:(SecTrustRef) myTrust
{
SecTrustResultType trustResult;
OSStatus status = SecTrustEvaluate(myTrust, &trustResult); // 1
//Get time used to verify trust
CFAbsoluteTime trustTime,currentTime,timeIncrement,newTime;
CFDateRef newDate;
if (trustResult == kSecTrustResultRecoverableTrustFailure) {// 2
trustTime = SecTrustGetVerifyTime(myTrust); // 3
timeIncrement = 31536000; // 4
currentTime = CFAbsoluteTimeGetCurrent(); // 5
newTime = currentTime - timeIncrement; // 6
if (trustTime - newTime){ // 7
newDate = CFDateCreate(NULL, newTime); // 8
SecTrustSetVerifyDate(myTrust, newDate); // 9
status = SecTrustEvaluate(myTrust, &trustResult); // 10
}
}
if (trustResult != kSecTrustResultProceed) {
DLog(@"Failed with status : %li",trustResult); // 11
return NO;
}else{
DLog(@"Procced");
return YES;
}
}
但是我得到了 kSecTrustResultRecoverableTrustFailure 。在这种情况下也使用了苹果样本,但没有帮助。
也许有人可以帮我解决这个问题?
谢谢。
最佳答案
如果这是用于服务器信任身份验证的自签名证书,您应该执行以下操作:
将 .CRT 编码证书转换为 .DER 编码证书。在终端类型上:
$: openssl x509 -in certificate.crt -outform der -out "com.server.trust_cert.der"
(选择你自己有意义的名字)
将.DER 编码的证书放入包中。
按如下方式实现方法connection:didReceiveAuthenticationChallenge:
。重要提示:始终检查错误并退出,如果任何错误,让身份验证失败!!
彻底测试它!
- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([[[challenge protectionSpace] authenticationMethod] isEqualToString: NSURLAuthenticationMethodServerTrust])
{
do
{
SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust];
if (serverTrust == nil)
break; // failed
SecTrustResultType trustResult;
OSStatus status = SecTrustEvaluate(serverTrust, &trustResult);
if (!(errSecSuccess == status))
break; // fatal error in trust evaluation -> failed
if (!((trustResult == kSecTrustResultProceed)
|| (trustResult == kSecTrustResultUnspecified)))
{
break; // see "Certificate, Key, and Trust Services Reference"
// for explanation of result codes.
}
SecCertificateRef serverCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0);
if (serverCertificate == nil)
break; // failed
CFDataRef serverCertificateData = SecCertificateCopyData(serverCertificate);
if (serverCertificateData == nil)
break; // failed
const UInt8* const data = CFDataGetBytePtr(serverCertificateData);
const CFIndex size = CFDataGetLength(serverCertificateData);
NSData* server_cert = [NSData dataWithBytes:data length:(NSUInteger)size];
CFRelease(serverCertificateData);
NSString* file = [[NSBundle mainBundle] pathForResource:@"com.server.trust_cert"
ofType:@"der"];
NSData* my_cert = [NSData dataWithContentsOfFile:file];
if (server_cert == nil || my_cert == nil)
break; // failed
const BOOL equal = [server_cert isEqualToData:my_cert];
if (!equal)
break; // failed
// Athentication succeeded:
return [[challenge sender] useCredential:[NSURLCredential credentialForTrust:serverTrust]
forAuthenticationChallenge:challenge];
} while (0);
// Authentication failed:
return [[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
上述技术的一个可能改进是使用“公钥锁定”。
HTTPS Server Trust Evaluation (Apple 官方文档,技术说明 TN2232)
关于ios - 使用证书创建 SSL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17141226/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 6 年前。 Improv
我们最近构建了一个 Web 生成器应用程序(所见即所得、预先设计的模板、购物车等)。我们一直在寻找 SSL 证书的几个不同选项,甚至是通配符,以寻求解决方案。问题是我们不想每次有客户想要将 SSL 添
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 6 年前。 Improve
我想这是不可能的,但如果是这样,我想知道为什么。 假设我从附近的官方证书颁发机构之一获得了 example.com 的 SSL 证书。假设我正在运行 a.example.com 和 b.c.d.exa
在我的 java 应用程序中,我有一个带有自签名证书/ key 的 JKS keystore 。我需要加载它们并将它们转换为 BouncyCaSTLe 类型。 我正在使用 java.security.
我不是这方面的专家,但我只是遵循 Android 开发者网站上列出的代码 keytool -genkey -v -keystore orbii.jks-keyalg RSA -keysize 2048
我正在为我的一个应用程序实现推送通知系统,所以我正在关注 this教程并为此生成 SSL 证书。 我的这个应用程序还涉及应用程序和服务器之间的一些数据交换,我希望它受到 SSL 保护,我想知道从 ve
可能这是重复的问题,但我没有从上一个问题中完全清楚,这就是我发布新问题的原因。请看看这个。我会将 Ca 证书放在我的资源文件夹中以验证 ca 认证的证书,服务器中也会有相同的 ca 证书。 我正在创建
首先,我想指出这在 Internet Exporer 11 上运行良好。但出于某种原因,我无法让 FireFox 正常运行! 所以我已经添加了我自己的 rootCA 安全证书,在 Internet E
我有域“www.example.com”的 SSL 证书,我已将此证书安装在运行良好的端口 80 上的 tomcat 服务器中。现在我的要求是在 https 中运行 php 代码,因为我的 Apach
我正在构建一个 oauth 1.0a 服务,它将被 Jira 中的一个小工具使用,它是一个用 C# 编写的 .Net 3.5 应用程序。 Jira 使用 RSA-SHA1 签名方法向此服务发出请求,这
假设用户打开 https://ssl-site.example/link/index.php我用 ProxyPass 配置了我的服务器和 ProxyPassReverse在 Apache 配置中(在
我有一个 tcp 服务器,它使用证书进行 ssl/tls 和许可。对于 ssl/tls,证书存储在 pkcs#12 文件中,我认为该文件将作为安装过程的一部分进行安装。 关于 Rhino 许可,作为安
我开始想第一次在 jmeter 中记录。 我的步骤是: 我在 mac 上安装了 jmeter:brew install jmeter 我创建了新的录音模板 我点击开始按钮。它显示如下图所示的弹出窗口。
通常,我的困惑似乎正在从我在WCF上下文中理解安全性的尝试中消除。在WCF中,似乎可以将证书用于身份验证和加密。基本上,我试图理解: 如何将X509证书用作身份验证令牌? ssl证书通常不公开吗?这是
我正在尝试使用 openssl 库让客户端通过 https 连接到某些服务器。 调用堆栈是这样的: SSL_library_init(); SSL_load_error_strings(); SSL_
我正在阅读 this article其中解释了 iOS/OSX 中的代码签名。 我知道从KeyChain Access utility 我可以看到我的证书,如果展开我的开发者证书,我可以看到有一个私钥
我有一个既在互联网上又在私有(private)网络上的服务器。 我正尝试按照我的经理的要求在内部专用网络上设置 TLS。 该服务可供 Internet 和私有(private)内部网络客户端使用。 外
我在具有不同域扩展名的单个网络服务器中设置了我的站点,例如 https://mybusiness.com https://mybusiness.com.au https://mybusiness.co
我正在开发一个移动应用程序。我是网络开发的新手。 我在 GoDaddy 上有 DNS(比如 app.test.com)并且有一个只有 IP 地址的服务器(比如 31.254.42.73)。我的请求从
我是一名优秀的程序员,十分优秀!