2014-06-19 14 views
6

Piszę bardzo prostego klienta SSL, aby połączyć się z serwerem WWW HTTPS. Mogę połączyć i przetworzyć żądanie/odpowiedź w porządku. Jednak OpenSSL zgłasza UNABLE_TO_GET_ISSUER_CERT_LOCALLY, ale do tej pory zdecydowałem się zignorować ten błąd :-). Teraz chcę rozwiązać tę część problemu.Połączenie OPENSSL z serwerem publicznym daje X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY

Testuję, łącząc się z publicznym serwerem SSL na HTTPS, takim jak Google lub Yahoo, i sprawdzając zwrot SSL_get_verify_result(...).

Jak rozumiem, potrzebuję plików pem CA dla tej konkretnej witryny, aby OpenSSL mógł zweryfikować łańcuch do zaufanego urzędu certyfikacji. W tym przypadku byłby to organ, który podpisałby certyfikaty dla Google lub Yahoo.

Aby uzyskać pliki PEM, które według mnie powinny działać, otworzyłem FireFox, nawigowałem do tych stron i wykonałem certyfikat View i wyeksportowałem każdy z nich na listę. Na przykład mam plik o nazwie "GeoTrustGlobalCA.pem", który wygląda dobrze. W rzeczywistości, kiedy poszedłem bezpośrednio do strony GeoTrust i pobrałem swój certyfikat główny, jest to identyczny z tym, który eksportowałem z FireFox, jak można się było spodziewać.

Tak więc, na przykład Google, który pokazał dwa certyfikaty w drzewie w FireFox, załadować każdy z:

result = SSL_CTX_load_verify_locations(ctx,"GoogleInternetAuthorityG2.pem",NULL); 
if (result == 0) { 
    puts("Opps... Can't load the certificate"); 
} 

result = SSL_CTX_load_verify_locations(ctx,"GeoTrustGlobalCA.pem",NULL); 
if (result == 0) { 
    puts("Opps... Can't load the certificate"); 
} 

Po tym, co zwykle do łączenia i komunikować:

BIO_set_conn_hostname(bio, "www.google.com:https"); 

Nie otrzymuj żadnych błędów podczas ładowania lub łączenia.

Jednak weryfikacja nie działa.

Otrzymuję zwrot UNABLE_TO_GET_ISSUER_CERT_LOCALLY (error code 20).

Czy brakuje mi tu jakiejś koncepcji? Czy to nie dałoby mi wyniku, ponieważ ma zaufane certyfikaty? W witrynie google.com znajdowały się tylko dwa łańcuchy i użyłem ich.

Odpowiedz

2

Drugie połączenie z SSL_CTX_load_verify_locations zastępuje certyfikat z pierwszego połączenia.

Należy połączyć swoje korzenie w jednym pliku:

$ cat my-trusted-roots.pem 
-----BEGIN CERTIFICATE----- 
... (CA certificate in base64 encoding) ... 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
... (CA certificate in base64 encoding) ... 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
... (CA certificate in base64 encoding) ... 
-----END CERTIFICATE----- 

a następnie załaduj ten pojedynczy plik z SSL_CTX_load_verify_locations. Zobacz OpenSSL docs on SSL_CTX_load_verify_locations. W partuclar, że UWAGI sekcja:

Jeśli CAfile nie jest NULL, wskazuje na plik certyfikatów CA w formacie PEM . Plik może zawierać kilka certyfikatów CA zidentyfikowane przez

----- BEGIN CERTIFICATE -----

... (certyfikat CA w kodowanie base64) ...

---- -END CERTIFICATE -----

sekwencji.Przed, między i po tekście certyfikatów jest dozwolona , która może być używana np. dla opisów certyfikatów.


Wystarczy rower rzuca tutaj ...

result = SSL_get_verify_result(ssl); 
printf("The Verify Result is %d \n",result); 

To jedna z trzech testów, które trzeba wykonać.

Drugie badanie, które należy wykonać, znajduje się poniżej. Anonimowy Diffie-Hellman (ADH) nie używa certyfikatu, więc musisz to sprawdzić.

X509* cert = SSL_get_peer_certificate(ssl); 
if(cert) X509_free(cert); 

if(cert == NULL) 
    /* Error - Anonymous Diffie-Hellman */ 

SSL_get_peer_certificate wpada liczbę odwołań na świadectwie, więc trzeba zadzwonić pasujący do X509_free.

Trzecie badanie, które należy wykonać, to dopasowanie nazwy hosta. OpenSSL 1.1.0 WILL wykonuje dopasowanie nazwy hosta (i inne pasujące nazwy, takie jak adresy e-mail PKCS9); ale mniejsze wersje, takie jak 0.9.8 i 1.0.1, DO NOT wykonują dopasowanie.

+0

Doceniam to (nie otrzymuję wiadomości e-mail z odpowiedzią ... może powinienem napisać pytanie na ten temat :-). Co do sprawdzania certyfikatu równorzędnego, nie dotyczy to tylko sytuacji, gdy chcę zweryfikować klienta? Jeśli zezwalam na anonimowych klientów, ale chcę tylko unikać węszenia, to nie jest to konieczne? – SpacemanScott

+0

(tak, to jest test jako klient, po prostu pytam, ponieważ w końcu będę musiał obsługiwać oba typy) – SpacemanScott

Powiązane problemy