2 Stimmen

Bouncycastle X509-Zertifikatsketten-Erstellung mit gültigem Stammzertifikat: unknown object in getInstance

Versuch, ein X509 mit der BouncyCastle-API zu generieren. Hier ist mein Code-Stück.

    try {
        Security.addProvider(new BouncyCastleProvider()); // Anbieter hinzufügen
        String pathtoSave = "D://sureshtest.cer";

        KeyPair keyPair = generateKeypair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        X509Certificate trustCert = createCertificate(null,"CN=DigiCorp",
                "CN=Nextenders", publicKey, privateKey);
         // Erstelle einen Eingabe-Stream aus der Datei, die das Zertifikat enthält.
        InputStream is =new FileInputStream(new File("D://validcertFormCa.pfx"));
        /*
         * Das CertificateFactory-Objekt wird zum Lesen von Zertifikaten, CRL und Zertifikatspfaden verwendet. 
         * Erstellen Sie ein Factory-Objekt mit dem Standard-SPI-Muster, das in JCA verwendet wird.
         */
        CertificateFactory factory =
                CertificateFactory.getInstance("X.509", "BC");

        /*
         * Generiere ein X509-Zertifikat, das mit den aus dem Eingabe-Stream gelesenen Daten initialisiert ist.
         */
        X509Certificate mastercert =
                (X509Certificate) factory.generateCertificate(is);
        java.security.cert.Certificate[] outChain = { trustCert,mastercert };
        trustCert.checkValidity();
        mastercert.checkValidity();
        KeyStore outStore = KeyStore.getInstance("PKCS12");
        outStore.load(null, null);
        outStore.setKeyEntry("Mein eigenes Zertifikat", privateKey,
                "admin123".toCharArray(), outChain);

        OutputStream outputStream = new FileOutputStream(pathtoSave);
        outStore.store(outputStream, "admin123".toCharArray());
        outputStream.flush();
        outputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

Und führe die Ausnahme aus

    org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory$ExCertificateException
    at org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory.engineGenerateCertificate(Unknown Source)
    at java.security.cert.CertificateFactory.generateCertificate(Unknown Source)
    at com.nextenders.certificategeenrator.CertificateGenerator.testGenerateSignCertWithKeyStore(CertificateGenerator.java:119)
    at com.nextenders.facadeimplementation.facade.JUnitFacade.main(JUnitFacade.java:11)
Verursacht durch: java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.ASN1Integer
    at org.bouncycastle.asn1.ASN1Sequence.getInstance(Unknown Source)
    at org.bouncycastle.asn1.x509.TBSCertificate.getInstance(Unknown Source)
    at org.bouncycastle.asn1.x509.Certificate.(Unknown Source)
    at org.bouncycastle.asn1.x509.Certificate.getInstance(Unknown Source)
    at org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory.readDERCertificate(Unknown Source)
    ... 4 weitere

2voto

mpontillo Punkte 13067

Was soll mastercert sein?

Laut der Dokumentation für generateCertificate() erwartet die Methode, dass ein "im inStream bereitgestelltes Zertifikat im DER-Format kodiert sein muss und in binärer oder druckbarer (Base64) Kodierung bereitgestellt werden kann". Mit anderen Worten, ein DER- oder PEM-kodiertes X509-Zertifikat.

Das, was du über diesen InputStream bereitstellst, ist eine PFX-Datei (eine PKCS#12-Datei), nicht ein DER- oder PEM-kodiertes Zertifikat.

Mein Rat ist, openssl pkcs12 zu verwenden, um das notwendige Zertifikat aus der PKCS#12-Datei zu extrahieren und in eine separate Datei zu platzieren, dann ändere den Code, um stattdessen diese Datei zu laden, anstatt deiner PFX-Datei.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X