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 -servername
overslaan:
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 openssl
gebruiken en u kunt deze vinden tussen BEGIN CERTIFICATE
en END CERTIFICATE
die 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 extract
uit.
Kopieer ze in Ubuntu naar /usr/local/share/ca-certificates
en voer sudo update-ca-certificates
uit.
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 starttls
en smtp
toevoegen:
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
-
CERTIFICATE_NAMEuitvoer (BASE 64/PEM-indeling)
Bestandsnaam van
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