Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

Extraktion der Zertifikatskette mit OpenSSL

Es kommt gele­gent­lich vor, dass bei Serveranwendungen die SSL-Zertifikate aus­ge­tauscht wer­den. Insbesondere bei einem gleich­zei­ti­gen Austausch von CA-Zertifikaten (weil z.B. eine neue Sub-CA für die Signierung neuer Zertifikate ver­wen­det wird) kann es dabei dazu kom­men, dass eine Applikation, die als Client auf die Serveranwendung zugreift die Vertrauenskette des Serverzertifikates nicht mehr prü­fen kann und dann z.B. in Java mit einer SSLHandShakeException aus­steigt. Um hier Abhilfe zu schaf­fen, benö­tigt man die CA-Zertifikate, die bei SSL-Handshakes mit­ge­schickt wer­den. Um diese zu extra­hie­ren bie­tet sich das Tool s_client der openssl-Bibliothek an.

Um beim Handshake die Zertifikate aus­ge­ben zu las­sen ruft man openssl fol­gen­der­ma­ßen auf:

openssl s_client -connect targethost.domain.tld:443 -showcerts

damit lie­fert OpenSSL die im Handshake über­mit­tel­ten Zertifikate im PEM-Format an die Standardausgabe. Mit dem fol­gen­den klei­nen Perl-Script certsplit.pl las­sen sich diese in ein­zelne .pem-Dateien schreiben:

#!/usr/bin/perl -w
#
# take output from openssl s_client -showcerts and extract certificates
# as openssl-cert-$count.pem files
#
# (C) 2009 Jan Dittberner <jan.dittberner (at) communardo (dot) de>
#
use strict;

my $state = 0;
my $count = 0;
my $filename;
my $fh;

while () {
  if ($_ =~ /BEGIN CERT/) {
    open($fh, '>', "openssl-cert-$count.pem") or die $!;
    $count++;
    $state=1;
  }
  if ($state == 1) {
    print $fh $_;
  }
  if ($_ =~ /END CERT/) {
    close($fh) or die $!;
    $state=0;
  }
}

Das Ganze lässt sich über Pipes auch schön automatisieren:

echo -e "HEAD / HTTP/1.1\nHost: targethost.domain.tld\nConnection: Close\n\n"|openssl s_client -connect targethost.domain.tld:443 -showcerts | perl certsplit.pl

Anschließend lie­gen die Zertifikatsdateien als openssl-cert-#.pem (# ist die Reihenfolge in der die Zertifikate beim Handshake über­mit­telt wer­den) im aktu­el­len Verzeichnis vor.

Die PEM-Dateien kön­nen dann z.B. mit

openssl x509 -in openssl-cert-0.pem -noout -text

genauer inspi­ziert wer­den. Die CA-Zertifikate kön­nen dann z.B. mit dem key­tool des JDK in den trus­ted Keystore impor­tiert werden:

cd $JAVA_HOME/jre/lib/security
keytool -importcert -trustcacerts -keystore cacerts -storepass changeit -alias ALIAS -file ZERTFIKAT.pem

wobei ZERTIFIKAT, ALIAS und bei einem ordent­lich gepfleg­ten System auch das bei ‑store­pass ange­ge­bene Passwort durch pas­sende Werte zu erset­zen sind.

ACHTUNG: Dieser Vorgang ist nur dann sinn­voll, wenn man wirk­lich sicher sein kann, dass die Zertifikate wirk­lich von einem ver­trau­ens­wür­di­gen System kom­men, ansons­ten kann man damit natür­lich auch einem poten­ti­el­len Angreifer sein Vertrauen aussprechen.

Related Posts

Pin It on Pinterest