Zertifikate in Java importieren

Sp4rky

Cadet 4th Year
Registriert
März 2019
Beiträge
77
Hallo zusammen,
wieder einmal habe ich ein Problem damit Zertifikate in einen Keystore (ohne KeyTool!) zu packen.

Bisher habe ich die Zertifikate welche ich für Apache2 mit Certbot erhalten habe relativ einfach in einen Keystore drücken können.
Java:
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate)certFactory.generateCertificate(new ByteArrayInputStream(decodedCert));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(decodedKey));
keyStore.setCertificateEntry(alias+"_cert", certificate);
keyStore.setKeyEntry(alias+"_key", privateKey, keyStorePass.toCharArray(), new Certificate[] {certificate});
Jetzt bin ich allerdings letztens von Apache auf Caddy umgestiegen und scheinbar läuft das da mit den Zertifikaten etwas anders ab.
  • Die Zertifikate für die Domains beinhalten nun 2 Zertifikate
  • Es gibt keinen Private Key mehr, nur noch einen EC Private Key (nur der Key, keine Parameter)

Jetzt bin ich etwas verwirrt wie ich da mein Code am besten so umbaue das das ganze passt.

Informationen zum Zertifikat habe ich mir über openssl mal angeschaut (ich bin nicht ganz sicher wie viel ich davon zeigen kann ohne zu viel zu zeigen):
Code:
Certificate:
    Data:
        Version: 3 (0x2)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
         Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                ASN1 OID: prime256v1
                NIST CURVE: P-256
         CT Precertificate SCTs:
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Signature : ecdsa-with-SHA256
     Signature Algorithm: sha256WithRSAEncryption
Wichtig für mich sind vermutlich die Werte "Signature Algorithm: sha256WithRSAEncryption", "Public Key Algorithm: id-ecPublicKey" und "ASN1 OID: prime256v1" auch wenn ich nicht ganz wüsste wie das zusammen passt.

Ich habe bereits etwas mit BouncyCastle rum probiert wie man das ganze zusammen setzen könnte, allerdings schlägt das ganze dann beim einfügen in den KeyStore fehl. Vermutlich ist somit vorher schon ein Fehler drinnen.
Java:
ECNamedCurveParameterSpec parameterSpec = ECNamedCurveTable.getParameterSpec("prime256v1");
ECPrivateKeySpec privateKeySpec = new ECPrivateKeySpec(BigIntegers.fromUnsignedByteArray(decodedKey), parameterSpec);
KeyFactory  keyFactory = KeyFactory.getInstance("EC", "BC");
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

keyStore.setCertificateEntry(alias+"_cert", certificate);
keyStore.setKeyEntry(alias+"_key", privateKey, keyStorePass.toCharArray(), new Certificate[] {certificate});
java.lang.IllegalArgumentException: standard length exceeded for value
at org.bouncycastle.util.BigIntegers.asUnsignedByteArray(Unknown Source)
at org.bouncycastle.asn1.sec.ECPrivateKey.<init>(Unknown Source)
at org.bouncycastle.asn1.sec.ECPrivateKey.<init>(Unknown Source)
at org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey.getEncoded(Unknown Source)
at java.base/sun.security.provider.KeyProtector.protect(KeyProtector.java:154)
at java.base/sun.security.provider.JavaKeyStore.engineSetKeyEntry(JavaKeyStore.java:274)
at java.base/sun.security.util.KeyStoreDelegator.engineSetKeyEntry(KeyStoreDelegator.java:111)
at java.base/java.security.KeyStore.setKeyEntry(KeyStore.java:1167)
at test.Main.main(Main.java:36)

Eventuell kann mir da jemand weiter helfen :)
 
Es geht mir ja gerade darum das ich mir nicht erst einen Keystore bauen und diesen dann verwalten muss. Deswegen würde ich gern beim Start der Anwendung das Teil nur temporär zusammen setzen um einen SSLContext daraus beziehen zu können.

Edit:
Hab es gelöst bekommen.
 
Zuletzt bearbeitet:
Dann wäre es schön die Lösung zu zeigen. Falls wer ein ähnliches Problem hat.
 
  • Gefällt mir
Reaktionen: PHuV
Das stimmt natürlich.

Ich bin nicht ganz sicher wie die ganzen Formate zusammen hängen, aber dabei scheint es sich um ein älteres/neueres/anderes Format zu handeln. Das ganze lässt sich mit openssl umwandeln, oder man nimmt den PEMReader (nicht im bcprov sondern bcpkix package zu finden) und damit ist das ganze dann recht einfach.
Java:
PEMParser pemParser = new PEMParser(/*file/string/... reader -> key file*/);
Object object = pemParser.readObject();
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
KeyPair kp = converter.getKeyPair((PEMKeyPair) object);
PrivateKey privateKey = kp.getPrivate();

Ich lass mal noch ein paar Links hier die nützlich für mich waren
MVN_BC
StackExchange
StackOverflow -> StackOverflow
 
Zurück
Oben