作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 Apple's Secure Transport API在已建立的传输层之上,使用我自己的根证书。我的根证书是 SecCertificateRef
,但我不知道如何让它可信。
我检查了以下函数,每个函数似乎都非常接近我的需要:
SSLAddDistinguishedName()
未实现;SSLSetTrustedRoots()
已弃用;SSLSetCertificateAuthorities()
仅用于客户端身份验证。如果我可以覆盖 SecContextRef
中的 SecTrustRef
,那么 SecTrustSetAnchorCertificates()
就可以完成这项工作。不幸的是,这条途径只把我带到了 SSLGetPeerSecTrust()
,它似乎是一个苹果私有(private)的 API。
最佳答案
我想你想要的是以下内容:
OSStatus status = SSLSetSessionOption(sslContext, kSSLSessionOptionBreakOnServerAuth, true);
然后在握手期间
OSStatus status = SSLHandshake(sslContext);
if (status == errSSLPeerAuthCompleted)
{
SecTrustRef trust = NULL;
status = SSLCopyPeerTrust(sslContext, &trust);
// Perform your custom trust rules here. e.g.
BOOL bTrusted = NO;
NSArray* anchor = [NSArray arrayWithObject:(id)pCACert];
OSStatus result = SecTrustSetAnchorCertificates(trust, (CFArrayRef)anchor);
/* Uncomment this to enable both system certs and the one we are supplying */
//result = SecTrustSetAnchorCertificatesOnly(trust, NO);
SecTrustResultType trustResult;
result = SecTrustEvaluate(trust, &trustResult);
if (result == errSecSuccess)
{
switch (trustResult)
{
case kSecTrustResultProceed:
case kSecTrustResultUnspecified:
bTrusted = YES;
break;
case kSecTrustResultInvalid:
case kSecTrustResultDeny:
case kSecTrustResultRecoverableTrustFailure:
case kSecTrustResultFatalTrustFailure:
case kSecTrustResultOtherError:
default:
break;
}
}
// If trusted, continue the handshake
if (bTrusted)
status = SSLHandshake(sslContext);
else
{
/* Your trust failure handling here ~ disconnect */
}
}
其中 pCAcert 是您希望信任的根证书 (SecCertificateRef)
关于ios - 如何在 iOS 安全传输 API 中使用我自己的根证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30060329/
我是一名优秀的程序员,十分优秀!