3 Stimmen

Wie man Serverzertifikatsinformationen (von HTTPS-Anfragen) im Cocoa WebView anzeigt?

In meiner Mac App habe ich eine WebView und möchte einen kleinen Button (wie in Safari) anzeigen, wenn der Benutzer eine Website mit "https" besucht. Beim Klicken auf diesen Button möchte ich die Zertifikatsinformationen anzeigen.

Hier ist, was ich bisher versucht habe...

1) Implementiert - (void)webView:(WebView *)sender resource:(id)identifier didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)dataSource

Dieser Delegat wurde jedoch nicht aufgerufen, als ich eine Website mit "https" besuchte

2) Da das obige fehlschlug, schrieb ich einen anderen Code (in einer Beispiels-App)

// Anfrage erstellen.
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.onlinesbi.com"]];

// URL-Verbindung erstellen und Anfrage senden
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];

und implementiert

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

{

if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
    // Vertrauen aus Schutzraum erstellen
    SecTrustRef trustRef;
    int trustCertificateCount = (int)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:(__bridge id) trustCertificate];
    }
}

}

Wenn ich die App jetzt ausführe, kommt dieser Delegat, jedoch ist die Anzahl der Zertifikate 0

3) Dieser bestimmte Link erwähnt die Verwendung der CFNetwork-API How to display certificate of HTTPS request in embedded WebView

Jetzt bin ich verwirrt, ob ich wirklich auf die CFNetwork-Ebene gehen und den Code implementieren muss ODER ob ich etwas falsch mache in 1) & 2), weshalb ich die Informationen nicht bekomme...

3voto

Russell Hancox Punkte 386

Der Code, den Sie in (2) haben, funktioniert bei mir gut.

 NSLog(@"%@", trustCertificates)

Gibt folgendes aus:

(
    "",
    "",
    ""
)

Zusätzlich importieren Sie und fügen Sie die folgende Zeile nach Ihrer for-Schleife ein, um ein Popup mit der Zertifikatskette anzuzeigen:

[[SFCertificatePanel sharedCertificatePanel] runModalForCertificates:trustCertificates showGroup:YES];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X