Openssl gebruiken om het certificaat van een server te halen

Ik probeer het certificaat van een externe server te krijgen, dat ik vervolgens kan gebruiken om toe te voegen aan mijn keystore en te gebruiken in mijn Java-toepassing.

Een senior ontwikkelaar (die op vakantie is 🙁 ) heeft me laten weten dat ik dit kan uitvoeren:

openssl s_client -connect host.host:9999

om een onbewerkt certificaat te laten dumpen, dat ik vervolgens kan kopiëren en exporteren. Ik ontvang de volgende uitvoer:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

Ik heb het ook geprobeerd met deze optie:

-showcerts

en deze (draaiend op Debian, let wel):

-CApath /etc/ssl/certs/

Maar ik krijg dezelfde foutmelding.

Deze bronzegt dat ik die CApath-vlag kan gebruiken, maar dat doet het niet lijken te helpen. Ik heb meerdere paden geprobeerd zonder resultaat.

Laat me alsjeblieft weten waar ik de fout in ga.


Antwoord 1, autoriteit 100%

Met SNI

Als de externe server SNI gebruikt (dat wil zeggen, meerdere SSL-hosts delen op een enkel IP-adres), moet u de juiste hostnaam verzenden om het juiste certificaat te krijgen.

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

Zonder SNI

Als de externe server geen SNI gebruikt, kunt u de parameter -servernameoverslaan:

openssl s_client -showcerts -connect www.example.com:443 </dev/null

Als u de volledige details van het certificaat van een site wilt bekijken, kunt u ook deze reeks opdrachten gebruiken:

$ echo | \
    openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
    openssl x509 -text

Antwoord 2, autoriteit 13%

Hoewel ik het eens ben met Ari’s antwoord (en het upvote :), moest ik een extra stap doen om het te laten werken met Java op Windows (waar het moest worden geïmplementeerd):

openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der

Voordat ik de openssl x509 -outform DER-conversie toevoeg, kreeg ik een foutmelding van keytool op Windows die klaagde over het formaat van het certificaat. Het importeren van het .der-bestand werkte prima.


Antwoord 3, autoriteit 12%

Een one-liner om het certificaat van een externe server in PEM-formaat te extraheren, dit keer met behulp van sed:

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

Antwoord 4, autoriteit 8%

Het blijkt dat er hier meer complexiteit is: ik moest veel meer details verstrekken om dit op gang te krijgen. Ik denk dat het iets te maken heeft met het feit dat het een verbinding is die clientauthenticatie nodig heeft, en de hankshake had meer informatie nodig om door te gaan naar het stadium waarin de certificaten werden gedumpt.

Hier is mijn werkcommando:

openssl s_client -connect host:port -key our_private_key.pem -showcerts \
                 -cert our_server-signed_cert.pem

Hopelijk is dit een duwtje in de goede richting voor iedereen die wat meer informatie kan gebruiken.


Antwoord 5, autoriteit 7%

De eenvoudigste opdrachtregel hiervoor, die de PEM-uitvoer bevat om deze aan de keystore toe te voegen, evenals een door mensen leesbare uitvoer en ook SNI ondersteunt, wat belangrijk is als u met een HTTP-server werkt, is:

openssl s_client -servername example.com -connect example.com:443 \
    </dev/null 2>/dev/null | openssl x509 -text

De optie -servernameis om SNI-ondersteuning in te schakelen en de openssl x509 -textdrukt het certificaat af in een door mensen leesbaar formaat.


Antwoord 6, autoriteit 5%

Om het certificaat van de externe server te krijgen, kunt u de tool opensslgebruiken en u kunt deze vinden tussen BEGIN CERTIFICATEen END CERTIFICATEdie u nodig heeft om te kopiëren en in uw certificaatbestand (CRT) te plakken.

Hier is het commando dat het demonstreert:

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

Als u alle certificaten van de keten wilt retourneren, voegt u gewoon g(algemeen) toe zoals:

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

Vervolgens kunt u eenvoudig uw certificaatbestand (file.crt) in uw sleutelhanger importeren en het vertrouwd maken, zodat Java niet moet klagen.

In OS X kun je dubbelklikken op het bestand of slepen en neerzetten in Sleutelhangertoegang, zodat het verschijnt in aanmelding/certificaten. Dubbelklik vervolgens op het geïmporteerde certificaat en maak het Always Trust for SSL.

Op CentOS 5 kun je ze toevoegen aan het bestand /etc/pki/tls/certs/ca-bundle.crt(en uitvoeren: sudo update-ca-trust force-enable), of kopieer ze in CentOS 6 naar /etc/pki/ca-trust/source/anchors/en voer sudo update-ca-trust extractuit.

Kopieer ze in Ubuntu naar /usr/local/share/ca-certificatesen voer sudo update-ca-certificatesuit.


Antwoord 7, autoriteit 2%

HOST=gmail-pop.l.google.com
PORT=995
openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem

Antwoord 8

om alleen de certificaatketen af te drukken en niet het servercertificaat:

# MYHOST=myhost.com
# MYPORT=443
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'

om CA-vertrouwen op CentOS/RHEL 6/7 bij te werken:

# update-ca-trust enable
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >/etc/pki/ca-trust/source/anchors/myca.cert
# update-ca-trust extract

op CentOS/RHEL 5:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >>/etc/pki/tls/certs/ca-bundle.crt

Antwoord 9

Je kunt het server-rootcertificaat ophalen en opslaan met het volgende bash-script:

CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'

Overschrijf gewoon de vereiste variabelen.


Antwoord 10

Als uw server een e-mailserver is (MS Exchange of Zimbra), moet u misschien de vlaggen starttlsen smtptoevoegen:

openssl s_client -starttls smtp -connect HOST_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem

Waar,

  • HOST_EMAILis het serverdomein, bijvoorbeeld mail-server.com.

  • SECURE_PORTis de communicatiepoort, bijvoorbeeld 587 of 465

  • Bestandsnaam van

  • CERTIFICATE_NAMEuitvoer (BASE 64/PEM-indeling)


Antwoord 11

Ten behoeve van anderen zoals ik die probeerden het goede advies hier op te volgen bij het openen van AWS CloudFrontmaar mislukt, is de truc om -servername domain.name..toe te voegen.

Bron: https://serverfault.com/a/780450/8972


Antwoord 12

Ik had ook dezelfde uitdaging en daarnaast ontdekte ik dat openssl de root ca. niet teruggeeft. Ik heb speciaal voor dit doel een alternatief gebouwd dat misschien handig is voor andere ontwikkelaars, zie hier: GitHub – Certificaat ripper

Gebruik

  • Afdrukken naar de console
crip print --url=https://stackoverflow.com/ --format=pem
  • Exporteren naar een p12 trustore
crip export --url=https://stackoverflow.com/

Antwoord 13

Start de klant:

openssl s_client -showcerts stackoverflow.com:443

Sluit af door STDIN te stoppen (CTRL+D), of beëindig het proces (CTRL+C).

Invoer uitschakelen en de client dwingen te stoppen nadat de certificaten zijn weergegeven:

openssl s_client -showcerts stackoverflow.com:443 < /dev/null

Other episodes