Chcę pobrać certyfikat ssl z, powiedzmy https://www.google.com , używając wget lub innych poleceń. Jakaś linia poleceń unix? wget czy openssl?
Chcę pobrać certyfikat ssl z, powiedzmy https://www.google.com , używając wget lub innych poleceń. Jakaś linia poleceń unix? wget czy openssl?
Odpowiedzi:
Aby pobrać certyfikat, musisz użyć klienta wbudowanego w openssl w następujący sposób:
echo -n | openssl s_client -connect HOST:PORTNUMBER \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert
To zapisze certyfikat /tmp/$SERVERNAME.cert.
Możesz użyć, -showcertsjeśli chcesz pobrać wszystkie certyfikaty w łańcuchu. Ale jeśli chcesz tylko pobrać certyfikat serwera, nie musisz tego określać-showcerts
echo -n daje odpowiedź do serwera, aby połączenie zostało zwolnione
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'usuwa informacje o łańcuchu certyfikatów i szczegółach połączenia. Jest to preferowany format importowania certyfikatu do innych magazynów kluczy.
-showcertspokazuje również serwer / certyfikat certyfikatu? Myślałem, że wyświetla półprodukty tylko wtedy, gdy włączono ten przełącznik.
s_clientzawsze pokazuje certyfikat serwera (jeśli taki istnieje, tzn. Serwer odpowiada cześć i nie wybiera anonimowego pakietu). -showcertspokazuje wszystkie otrzymane certyfikaty, najpierw certyfikat serwera, a następnie półprodukty i / lub root.
Znalazłem odpowiedź Openssl zapewnia to.
openssl s_client -connect $ {REMHOST}: $ {REMPORT}
openssl x509 -text <<EOF cert-text EOFaby zobaczyć szczegóły certyfikatu
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemdzięki uprzejmości serverfault.com/questions/139728/…
Gnutls narzędzie klienta, gnutls-climożna również zrobić to proste:
gnutls-cli --print-cert www.example.com \
< /dev/null \
> www.example.com.certs
Program został zaprojektowany w celu zapewnienia interaktywnego klienta w witrynie, więc musisz podać mu puste dane wejściowe (w tym przykładzie od /dev/null), aby zakończyć sesję interaktywną.
w oparciu o odpowiedź @bignose, oto samodzielna wersja, która dobrze pasuje np. do przepisu szefa kuchni:
sudo apt-get install gnutls-bin
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
ten tryb openssl oczekuje stdin, więc zapewniamy go przez true |, to łączy się z serwerem określonym w parametrze -connect. 2>/dev/nullwycisza błędy (opcjonalnie), możemy przekazać całe wyjście do parsera x509, określając /dev/stdinużycie potoku powłoki jako pliku wejściowego. I że wyjście będzie tylko -----BEGIN CERTIFICATE-----do -----END CERTIFICATE-----części s_clientprodukcji. Możesz przekierować to do pliku, dodając > google.com.pemna końcu polecenia.
Jak najlepiej mogę powiedzieć, nie weryfikuje to łańcucha certyfikatów, może jedynie powiedzieć, jaką tożsamość ssl zapewnia serwer końcowy.
x509domyślnie czyta stdin, więc -in /dev/stdinjest redundantne (3) s_clientsprawdza, czy certyfikat serwera poprawnie łączy się z lokalną kotwicą zaufania (root) i jest nieaktualny, ale masz ukrył informacje, które by to pokazały (4), NIE sprawdza pod kątem odwołania (5) sprawdza nazwę w certyfikacie serwera tylko w wersji 1.0.2, a następnie domyślnie (ale można to łatwo sprawdzić, patrząc na certyfikat później)