SecTrustEvaluate gibt immer kSecTrustResultRecoverableTrustFailure mit SecPolicyCreateSSL
Meine Bewerbung versucht zu bewerten, ein server-Zertifikat Vertrauen, für ein selbst signiertes Zertifikat. Das ist in Ordnung arbeiten mit SecPolicyCreateBasicX509 aber nicht die Arbeit für SecPolicyCreateSSL
Hier ist mein code:
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
//create trust from protection space
SecTrustRef trustRef;
int trustCertificateCount = SecTrustGetCertificateCount(challenge.protectionSpace.serverTrust);
NSMutableArray* trustCertificates = [[NSMutableArray alloc] initWithCapacity:trustCertificateCount];
for (int i = 0; i < trustCertificateCount; i++) {
SecCertificateRef trustCertificate = SecTrustGetCertificateAtIndex(challenge.protectionSpace.serverTrust, i);
[trustCertificates addObject:(id) trustCertificate];
}
//set evaluation policy
SecPolicyRef policyRef;
//policyRef = SecPolicyCreateBasicX509(); this is working
policyRef = SecPolicyCreateSSL(NO, (CFStringRef)
SecTrustCreateWithCertificates((CFArrayRef) trustCertificates, policyRef, &trustRef);
[trustCertificates release];
//load known certificates from keychain and set as anchor certificates
NSMutableDictionary* secItemCopyCertificatesParams = [[NSMutableDictionary alloc] init];
[secItemCopyCertificatesParams setObject:(id)kSecClassCertificate forKey:(id)kSecClass];
[secItemCopyCertificatesParams setObject:@"Server_Cert_Label" forKey:(id)kSecAttrLabel];
[secItemCopyCertificatesParams setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnRef];
[secItemCopyCertificatesParams setObject:(id)kSecMatchLimitAll forKey:(id)kSecMatchLimit];
CFArrayRef certificates;
certificates = nil;
SecItemCopyMatching((CFDictionaryRef) secItemCopyCertificatesParams, (CFTypeRef*) &certificates);
if (certificates != nil && CFGetTypeID(certificates) == CFArrayGetTypeID()) {
SecTrustSetAnchorCertificates(trustRef, certificates);
SecTrustSetAnchorCertificatesOnly(trustRef, NO);
}
SecTrustResultType result;
OSStatus trustEvalStatus = SecTrustEvaluate(trustRef, &result);
if (trustEvalStatus == errSecSuccess) {
if (result == kSecTrustResultConfirm || result == kSecTrustResultProceed || result == kSecTrustResultUnspecified) {
//evaluation OK
[challenge.sender useCredential:[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
} else {
//evaluation failed
//ask user to add certificate to keychain
} else {
//evaluation failed - cancel authentication
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
Nach viel Forschung, habe ich bereits änderungen vorgenommen, um das selbstsignierte Zertifikat durch das hinzufügen der Erweiterung, wie bereits erwähnt, in diesem post: Nicht in der Lage zu Vertrauen, dass einem selbst signierten Zertifikat auf dem iphone
Hat jemand einen Tipp was genau fehlt hier?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach viel testen bin, habe ich mir dieses problem. Im folgenden wurde geändert.
Die Richtlinie wurde NICHT für server Bewertung. Dies bedeutet, dass das Zertifikat wird überprüft, für die client-Authentifizierung. Offensichtlich ist das server-Zertifikat wird nicht das! Setzen Sie dies auf JA, tatsächlich überprüfen, ob
extendedKeyUsage
eingestellt istserverAuth
für das server-Zertifikat.SecTrustSetAnchorCertificates
undSecTrustSetAnchorCertificatesOnly
sollte immer aufgerufen werden, bevor die Auswertung und nicht nur, wenn Sie Ihre eigenen "Anker" - Zertifikate. Sie müssen diesen Aufruf mit einem leeren array, sonst wird das system bekannt Anker-Zertifikate sind nicht für die Auswertung benutzt. Einmal installiert vertrauenswürdigen root-Zertifikaten von MDM sind dann arbeiten.Hier ist ein funktionierendes Beispiel auf der Basis der ersten code:
Hoffe, dies hilft jemand.
kSecTrustResultConfirm
ist veraltet, ab iOS7.Kann es an einem server-Zertifikats-problem....
Überprüfen hier, löste ich meine kSecTrustResultRecoverableTrustFailure problem, das hinzufügen
subjectAltName = DNS:example.com
in openssl-config-Datei, speziell im server-key generation...Wenn Sie nicht mit openssl generieren, es tut mir Leid, aber ich kann dir helfen.. Eh, wenn Sie wollen, verwenden Sie openssl, hier ist ein gutes tutorial zum generieren von Schlüsseln und signieren Sie dann mit Ihren eigenen root-certificate-authority.
Aus diesem tutorial, ich habe gerade meine openssl-server config Datei:
Hoffe, es hilft !