Vraag hoe het SSL-certificaat van een website downloaden?


Ik wil het SSL-certificaat downloaden van bijvoorbeeld https://www.google.com, met behulp van wget of andere commando's. Elke unix-opdrachtregel? wget of openssl?


162
2018-05-07 21:01


oorsprong




antwoorden:


Om het certificaat te downloaden, moet je de client ingebouwd in openssl gebruiken zoals:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Dat zal het certificaat opslaan /tmp/$SERVERNAME.cert.

Je kunt gebruiken -showcerts als u alle certificaten in de keten wilt downloaden. Maar als u alleen het servercertificaat wilt downloaden, hoeft u dit niet op te geven -showcerts

echo -n geeft een antwoord op de server, zodat de verbinding wordt vrijgegeven

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' verwijdert informatie over de certificaatketen en verbindingsdetails. Dit is het formaat dat de voorkeur heeft om het certificaat in andere keystores te importeren.


219
2017-10-19 22:59



waardeer dat je niet alleen een goed antwoord gaf, maar ook een precieze uitleg. - marco.m
Doet -showcerts toon ook de server / leaf cert? Ik dacht dat het alleen tussenproducten vertoonde toen die schakelaar werd opgenomen. - Mike B
Zoals het antwoord zei, s_client toont altijd de server cert (als die er is, d.w.z. de server antwoordt hallo en kiest geen anonieme suite). -showcerts shows allemaal de ontvangen certs, server cert eerst dan tussenproducten en / of root. - dave_thompson_085
dit werkt echter niet in de aanwezigheid van een proxy. - Frederick Nord
Dit werkt ook niet met servers die SNI gebruiken (meerdere certificaten / domeinen op één IP-adres). Om problemen te voorkomen, geeft u de parameter openssl servername op: openssl s_client -connect HOST: PORTNUMBER -servernaam CN - verhage


Ik vond het antwoord. Openssl biedt het.

openssl s_client -connect $ {REMHOST}: $ {REMPORT}


54
2018-05-07 21:05



ook openssl x509 -text <<EOF cert-text EOF om details van het certificaat te bekijken - mpapis
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pem met dank aan serverfault.com/questions/139728/... - pulkitsinghal
deze volbrengt hetzelfde en slaat het sed hack. - phs
Hiermee wordt slechts één certificaat gecontroleerd, wat als de service deel uitmaakt van een uitgebalanceerde groep servers, waarvan elk een ander certificaat heeft, mogelijk ondertekend door een andere hoofd-CA? Of met andere woorden, een mitm-aanval kan dit verzoek doorlaten naar de echte site en vervolgens andere verzoeken naar zijn servers sturen. Zijn er manieren om dit te controleren? En om een ​​lijst te krijgen van alle certificaten die een domein echt heeft? - Jens Timmerman
@JensTimmerman "Of met andere woorden, een mitm-aanval kan dit verzoek doorlaten naar de echte site en vervolgens andere verzoeken naar zijn servers sturen." Dat is niet mogelijk, tenzij de man-in-the-middle een geldig certificaat heeft voor de doelserver (of de cliënt dom is, controleert het servercertificaat niet). Blijkbaar, als de server soms een ander certificaat biedt, kan je alleen maar hopen dat je ze uiteindelijk allemaal krijgt door verbindingspogingen te herhalen. - David Tonhofer


De gnutls cliënt hulpmiddel, gnutls-cli, kan dit ook eenvoudig maken:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

Het programma is ontworpen om een ​​interactieve client aan de site te leveren, dus je moet het een lege input geven (in dit voorbeeld, uit /dev/null) om de interactieve sessie te beëindigen.


20
2017-10-07 06:19



hoe zou het maken dat gnutls verbinding maken via (de systeembrede geconfigureerde) https proxy en het certificaat dat wordt uitwisseld afdrukken? - Frederick Nord


gebaseerd op @bignose antwoord, hier is een onafhankelijke versie die goed past in b.v. een recept van de chef:

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

8
2018-05-27 09:31





true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

deze modus van openssl verwacht stdin, dus we bieden het via true |, dit maakt verbinding met de server die is opgegeven in de parameter -connect. 2>/dev/null stiltes fouten (optioneel), we kunnen de hele uitvoer doorgeven aan de x509-parser, specificeren /dev/stdin om de shell-pipe als het invoerbestand te gebruiken. En dat zal alleen de -----BEGIN CERTIFICATE----- naar -----END CERTIFICATE----- gedeelte van de s_client output. U kunt dit doorverwijzen naar een bestand > google.com.pem aan het einde van het commando.


Zo goed als ik kan zien, verifieert dit niet de certificaatketen, het kan u alleen vertellen welke SSL-identiteit de eind-server biedt.


6
2018-01-12 10:38



(1) dit verbetert de antwoorden van 6 jaar geleden niet echt (2) x509 leest stdin standaard dus -in /dev/stdin is overbodig (3) s_client verifieert of de server juiste ketens heeft gedeclareerd aan een lokaal vertrouwensanker (root) en is nog niet verlopen, maar u hebt de informatie onderdrukt die dit zou laten zien (4) het controleert NIET op intrekking (5) het controleert de naam in de server alleen cert certifiëren in 1.0.2 en dan niet standaard (maar dat kun je eenvoudig zelf controleren door het cert later te bekijken) - dave_thompson_085
@ dave_thompson_085, de vraag is hoe je een certificaat downloadt, maar geen keteninformatie laat zien. Ik vind de openssl x509 veel beter dan sed in een ander antwoord. - Der_Meister


Alternatieve syntaxis met Ex en processubstitutie:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

0