Проверка открытого ключа в canAuthenticateAgainstProtectionSpace - PullRequest
3 голосов
/ 15 апреля 2011

Меня попросили проверить открытый ключ по известному значению в canAuthenticateAgainstProtectionSpace (обратный вызов делегата NSURLConnection)

Это то, что я имею до сих пор:

- (BOOL)connection:(NSURLConnection *)connection 
        canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
    {
        SecKeyRef publicKey = SecTrustCopyPublicKey([protectionSpace serverTrust]);

        NSLog(@"%@",SecTrustCopyPublicKey([protectionSpace serverTrust])); 
        return YES;
}

Как сравнить открытый ключ с известным значением?

NSLog выдает: <SecKeyRef: 0x687c000>, что бесполезно.

Ответы [ 2 ]

5 голосов
/ 09 сентября 2011

Если кому-то все равно, решение состояло в том, чтобы проверить байт сертификата на байт с сертификатом, сохраненным в комплекте.

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{
    SecTrustRef trust = [protectionSpace serverTrust];

    SecCertificateRef certificate = SecTrustGetCertificateAtIndex(trust, 0);

    NSData* ServerCertificateData = (NSData*) SecCertificateCopyData(certificate);

    // Check if the certificate returned from the server is identical to the saved certificate in
    // the main bundle
    BOOL areCertificatesEqual = ([ServerCertificateData 
                                  isEqualToData:[MyClass getCertificate]]);

    [ServerCertificateData release];

    if (!areCertificatesEqual) 
    {    
        NSLog(@"Bad Certificate, canceling request");
        [connection cancel];
    }

    // If the certificates are not equal we should not talk to the server;
    return areCertificatesEqual;
}
4 голосов
/ 14 сентября 2012

Обратите внимание, что SecCertificateCopyData возвращает сертификат в форме "DER", Distinguished Encoding Rules.Таким образом, вам нужно включить сертификат в ваше приложение в этой форме, а не в виде pem или любого другого формата.Чтобы преобразовать сертификат в DER с помощью openssl, используйте команду: openssl x509 -in server.crt -out server.der -outform DER

...