2010-08-23 9 views
6

Obecnie próbuję połączyć się z serwerem za pomocą certyfikatu z podpisem własnym. Używam NSURLConnection do łączenia się z serwerem. Jak mogę się upewnić, że ufam tylko właściwemu serwerowi i anulować wszystkie inne połączenia? Używam następujący kodNie można ufać własnoręcznie podpisanemu certyfikatowi na iphone

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 

    SecTrustResultType results; 
    SecTrustRef trust = [[challenge protectionSpace] serverTrust]; 

    SecTrustEvaluate(trust, &results); 

    if (results == kSecTrustResultProceed || results == kSecTrustResultConfirm) { 
     [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
    } else { 
     [challenge.sender cancelAuthenticationChallenge:challenge]; 
    } 

} 

Obecnie SecTrustEvaluate zawsze wraca z wynikiem równym kSecTrustResultRecoverableTrustFailure. Zainstalowałem profil konfiguracyjny z certyfikatem na telefonie za pomocą narzędzia konfiguracyjnego iphone i jest oznaczony jako zweryfikowany, ale nie zmieniło wyników.

Czy ktoś może mi pomóc uzyskać wynik zaufania z kSecTrustResultProceed lub kSecTrustResultConfirm dla samopodpisanego certyfikatu?

Odpowiedz

4

Musisz upewnić się, że certyfikat ma określone rozszerzenia. I skonfigurowany certyfikat z następującymi rozszerzeniami i pracował dla mnie (format OpenSSL):

basicConstraints=critical,CA:FALSE 
extendedKeyUsage=serverAuth 
subjectAltName=IP:192.168.x.y 
+1

Nicea wskazówka, to działa, jeśli są coraz ** kSecTrustResultRecoverableTrustFailure ** ... specjalnie klawisz „subjectAltName” jest bardzo ważny. Jeśli twoja odpowiedź serwera przez DNS, kiedy jest wywoływana, powinieneś użyć 'subjectAltName = DNS: example.com' lub jeśli chcesz mieć zarówno' subjectAltName = IP: 10.0.1.5, DNS: example.com'. Dzięki ! – gwdp

Powiązane problemy