# SSL Zertifikat - modulus auslesen und vergleichen



## andi1337 (19. Apr 2009)

Hallo,

ich schreibe gerade ein kleines Java-Programm, welches mir aus einer XML-Datei den modulus eines SSL-Zertifikats auslesen soll und diesen dann mit dem modulus eines Zertifikats vergleicht, dass ich in meine Java-Anwendung über eine Datei lade. Den Eintrag in die XML-Datei habe ich manuell hinzugefügt, indem ich das Zertifikat in Firefox importiert habe und ihn daraus kopiert habe. Das importiere Zertifikat im Firefox stimmt natürlich mit dem überein, das ich in meine Java-Anwendung laden möchte.

Der XML-Eintrag sieht folgendermaßen aus:
 [xml]<rsa:RSAPublicKey>
        <cert:identity rdf:resource="#thing" />
        <rsa:modulus cert:hex="ae 4a ff 22 b6 94 37 9e d0 5e 5b 33 46 ff ee 4c 
                               5b 69 be 56 61 b8 83 10 a3 19 1f 44 46 7f 8d cd 
                               e7 cb 02 4b db 24 ab a6 5c 0b 57 a3 28 22 98 dc 
                                 4b 1c 60 1b cd a8 69 07 27 84 44 bd d9 3a 1d 21 
                               7a e0 17 ce fc 95 b7 37 85 2c fc 19 24 f0 bf 7d 
                               7d a3 47 00 fb 9b 22 f2 8c 1b ab f6 2a 0d 07 5f 
                               a4 18 aa bc 24 a3 40 5c 16 18 53 e5 b3 d4 0d 83 
                               ea 20 bb a5 09 11 0c 57 d7 87 42 8a 82 ba b9 d5" />
        <rsaublic_exponent cert:decimal="65537" />
</rsa:RSAPublicKey>
 [/xml]

Und mein Java-Code sieht so aus (das Auslesen des modulus aus der XML-Datei fehlt, da das wunderbar funktioniert) :

http://www.google.com/search?hl=en&q=allinurl:keystore+java.sun.com&btnI=I'm Feeling Lucky

```
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("test.p12"), "1337"
                    .toCharArray());

X509Certificate cert = (X509Certificate) keyStore
                    .getCertificate("1");

String modulus = cert.getPublicKey().toString().split("modulus: ")[1]
                    .split("public exponent")[0];
```
 

Die Ausgabe der Variable modulus lautet so: 122392675650615617839048276106761560466803693108686979061459190430525133710497558213777604662727205981277376145916850227111622692729217629860579246290753232825097436649067807499111270500277165695945432047095130398463209647773144352972682560276964720832762375056982616951723146308482657833238677929094761069013

Scheint eine sehr lange Dezimalzahl zu sein. Diese passt gerade so in den Wertebereich eines Doubles, also hab ich mir gedacht, ich wandel das ganze in Hexadezimal um und vergleich die beiden Strings, natürlich den modulus aus der XML-Datei entsprechenden angepasst. 
Die Umwandlung habe ich so versucht:
     Java Code:

```
Double d = Double.parseDouble(pk);
String test = Double.toHexString(d);
```
http://www.google.com/search?hl=en&q=allinurl:double+java.sun.com&btnI=I'm Feeling Lucky​ In der Variable test steht dann dieser Wert: 0x1.5c95fe456d287p1023
Der Vergleich mit equals des Hex-Werts aus der XML-Datei und meinem umgewandelten erbrachten natürlich false.
Meine Frage ist nun, wie ich den modulus des Zertifikats in meiner Java-Andwendung so umgewandelt oder noch besser direkt geliefert bekomme, dass ein Vergleich mit dem modulus aus der XML-Datei ein true zurückliefert, denn sie müssten ja eigentlich identisch sein.
Über Antworten und Tipps bedanke ich mich schon einmal ;-)

Viele Grüße,
Andi


----------



## andi1337 (19. Apr 2009)

Hallo nochmal,

ich habe das Problem soeben selbst gelöst. Theoretisch lautet der Lösungsweg so:

Aus dem Zertifikat der PublicKey lesen, diesen aber in einen RSAPublicKey casten. Hier bekommt man den encodierten Key als Byte-Array, den man dann nur noch in Hexadezimal umwandeln muss und die entsprechenden Bytes auslesen kann.
Der zugehörige Code lautet:


```
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("test.p12"), "1337"
                    .toCharArray());

X509Certificate cert = (X509Certificate) keyStore
                    .getCertificate("1");

RSAPublicKey pkey = (RSAPublicKey) cert.getPublicKey();
byte[] bKey = pkey.getEncoded();
String hexKeyCert = "";
for (int i = 0; i < bKey.length; i++) {
                hexKeyCert += Integer.toString((bKey[i] & 0xff) + 0x100, 16)
                        .substring(1);
}
            
hexKeyCert = hexKeyCert.substring(58, hexKeyCert.length()-10);
```

Vielleicht hilft es ja nochmal jemanden, der vor einem ähnlichen Problem steht. Vielen Dank trotzdem und viele Grüße,
Andi


----------

