Ich arbeite mit einem Server, der erfordert, dass ein Teil der Login-URL eine Authentifizierung enthält. Die Art und Weise dieses Schema funktioniert (wie in den Handbuch empfohlen) ist, dassWie verwendet man openssl, um die Java-Signatur-Methode zu emulieren?
- ein öffentliches/privates Schlüsselpaar wird Java JDK keytool generiert mit (denen sie in einem Java-Schlüsselspeicher erstellt)
- ein Zertifikat für das erzeugt wird Schlüsselpaar mit Java JDK keytool
- Das Zertifikat ist auf dem Server installiert.
Wenn auf der Client-Protokollierung (mein Code)
- erzeugt eine Klartext-Tokenketten
- Zeichen der Klartext-Tokenketten mit dem privaten Schlüssel mit SHA1 und DSA
- der signierten Token Zeichenfolge enthält in der Login-URL.
Die Java keytool bietet keinen Mechanismus, um den privaten Schlüssel aus dem Schlüsselspeicher zu exportieren, aber getrennt habe ich Java-Code, den privaten Schlüssel aus dem Schlüsselspeicher zu extrahieren und sie in einer Datei speichern - basierend auf How do I list/export private keys from a keystore?.
Das alles funktioniert, wenn der Client Java verwendet, um die Unterzeichnung mit Code wie dem folgenden auszuführen.
String plaintext = "This is a sample plaintext token string";
Signature instance = Signature.getInstance("SHA1withDSA");
instance.initSign(privateKey);
instance.update((plaintext).getBytes());
byte[] signature = instance.sign();
Es funktioniert auch, wenn der Client PHP verwendet die Unterzeichnung zu tun, mit Code wie folgt aus. Hier ist der private Schlüssel wird von der Java-Schlüsselspeicher-Datei in PHP abgerufen]
$privateKey = openssl_pkey_get_private("file://$keyfile", $keystorePassword);
openssl_sign($paramsEncoded, $signature, $privateKey, OPENSSL_ALGO_DSS1))
Jedoch habe ich jetzt eine Situation, wo ein Kunde möchte die Login-URL mit einem Bash-Skript und openssl konstruieren -. Und das nicht funktioniert. Meine aktuellste Version dieses Codes sieht folgendermaßen aus: Sie führt einen SHA1-Nachrichtenauszug und dann ein DSA-Zeichen aus. Aber der Server lehnt das Token ab.
echo $tokenString | openssl dgst -sha1 > tokendigest
openssl dgst -dss1 -passin pass:$storePassword -sign $privateKeyFile > tokensigned
Ich kam in diesem Beitrag (Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher), die diese Methode der Java Signature Zeichen schlägt das Digest nicht unterschreiben, sondern schließt die Verkettung des Algorithmus ID verdauen und den Digest. Nach dem Durchlaufen des Codes in der Post erscheint, dass (für SHA1) dem Digest die Bytes 48 33 48 9 6 5 43 14 3 2 26 5 0 4 20
vorangestellt werden müssen. Aber selbst nach dem Hinzufügen kann ich immer noch kein opensll bekommen, um ein signiertes Token zu erzeugen, das für den Server akzeptabel ist.
Kann jemand openssl verwenden, um die Java Signature-Methode zu emulieren?
Ich habe gerade versucht, dass mit den gleichen "Error in Token Login" Ergebnisse. Ich habe sogar eine openssl verify hinzugefügt (wie unten) - wo openssl Verified OK gemeldet hat. 'echo $ tokenString | openssl dgst -dss1 -passin-pass: $ storePassword -zeichen $ privateKeyFile> $ signedTokenOpensslFile echo $ tokenString | openssl dgst -dss1 -verify $ publicKeyFile -signature $ signedTokenOpensslFile' – Torid
@Torid: Ihr Problem könnte die zusätzliche neue Zeile sein, die 'echo' zur Zeichenkette hinzufügt. Probiere 'echo -n' aus. –
Ja. Das 'echo -n' hat es behoben. Ich liebe stackoverflow.com - auch wenn es mich etwas blödsinnig macht. Vielen Dank! – Torid