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.
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
(tak, to jest test jako klient, po prostu pytam, ponieważ w końcu będę musiał obsługiwać oba typy) – SpacemanScott