ドキュメントには次のように記載されています。 」
ただし、SecTrustSetKeychains() は iOS では使用できないため、この関数がアプリケーションのキーチェーンも参照するかどうかは明確ではありません。
投稿からしばらく経っているようですので、まだ回答が必要かどうかわかりません。あなたのユースケースが「私は でヒットし、正確なconnection:didReceiveAuthenticationChallenge:
証明書が評価されていることを確認したい」である場合は、iOS 組み込みの信頼メソッドを使用するか、Foundation API を介してもう少し作業を行うことができます。 (SecTrustEvaulate はここでは特に呼び出されていませんが、非常に簡単に追加できることに注意してください)
#import <Security/Security.h>
#import <CommonCrypto/CommonDigest.h>
そこから、証明書の完全な配列を反復し、それをチャレンジのサーバー信頼参照の SHA1 のようなものと比較できます。
// way #1 - iOS built-in ================================================ //
SecTrustRef trust = challenge.protectionSpace.serverTrust;
CFIndex cnt = SecTrustGetCertificateCount(trust);
// way #2 - build it in yourself from a file ============================ //
OSErr err;
NSString *path = [[NSBundle mainBundle] pathForResource:@"my.cert"
ofType:@"der"];
NSData *derData = [NSData dataWithContentsOfFile:path];
SecCertificateRef myCert =
SecCertificateCreateWithData(NULL, (CFDataRef)derData);
CFMutableArrayRef array = CFArrayCreateMutable(NULL, 1, NULL);
CFArrayInsertValueAtIndex(array, 0, myCert);
err = SecTrustSetAnchorCertificates(trust, array);
if (err != errSecSuccess) {
// do something smarter here, obviously, logging would be a start
abort();
}
CFArrayRef certs = NULL;
err = SecTrustCopyCustomAnchorCertificates(trust, &certs);
if (err != errSecSuccess) {
// again, better choices needed
abort();
}
CFIndex cnt = CFArrayGetCount(certs);
// loop and compare 'em
for (int i = 0; i < cnt; i++) {
SecCertificateRef cert = SecTrustGetCertificateAtIndex(trust, i);
CFDataRef cdata = SecCertificateCopyData(cert);
NSData *data = [[NSData alloc] initWithData:(NSData *)cdata];
unsigned char digest_result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, data.length, digest_result);
// compare each byte with your in-code SHA1 bytes
if (allBytesMatch) {
NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
[challenge.sender useCredential:cred
forAuthenticationChallenge:challenge];
}
}
// don't forget to release & CFRelease all the alloc'ed stuff from above
Apple Devforums の eskimo1 は次のように答えています。
- SecTrustEvaluate() はアプリケーション キーチェーンでルート証明書を探しますか?
デフォルトではありません。ただし、キーチェーンから (またはどこからでも) 証明書を取得し、SecTrustSetAnchorCertificates を使用してそれらを SecTrust オブジェクトに適用することで、これを行うのは簡単です。
SecTrustEvaluation はキーチェーン内の中間証明書を /will/ 見つけます。