Comment utiliser.clé et.le fichier crt en java généré par openssl?

j'ai besoin d'un cryptage asymétrique en java. - Je générer .clé et .crt fichiers avec propre mot de passe et .crt fichier openssl qui a déclaré dans http://www.imacat.idv.tw/tech/sslcerts.html .

Comment utiliser ces .clé et .crt fichier pour extraire publickey et la clé privée en Java?

10
demandé sur Sajad Bahmani 2011-06-26 10:20:56

4 réponses

.key et .crt les fichiers peuvent être au format PEM. Pour vérifier cela, ouvrez-les avec un éditeur de texte et vérifiez si le contenu ressemble à ------BEGIN CERTIFICATE------ (ou "begin RSA private key"...). C'est généralement le format par défaut utilisé par OpenSSL, sauf si vous avez spécifié explicitement DER.

ce n'est probablement pas nécessaire (voir ci-dessous), mais si votre certificat est au format DER (un format binaire), vous pouvez les convertir au format PEM en utilisant:

openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem

(Vérifiez l'aide pour openssl rsa pour faire quelque chose de similaire avec la clé privée si nécessaire.)

vous avez alors deux options:

  • construisez un fichier PKCS#12

    openssl pkcs12 -export -in myhost.crt -inkey myhost.key -out myhost.p12
    

vous pouvez alors l'utiliser directement depuis Java comme un keystore de type "PKCS12". La plupart des applications Java devraient vous permettre de spécifier un type de keystore en plus de l'emplacement du fichier. Pour les propriétés par défaut du système, ceci est fait avec javax.net.ssl.keyStoreType (mais l'application que vous utilisez pourrait ne pas utilisez cette). Sinon, si vous voulez charger explicitement, utilisez quelque chose comme ceci:

KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis =
    new FileInputStream("/path/to/myhost.p12");
ks.load(fis, "password".toCharArray()); // There are other ways to read the password.
fis.close();

(alors, vous devriez pouvoir itérer à travers le aliases()KeyStore et utiliser getCertificate (et getPublicKey() pour la clé publique) et getKey().

  • Utiliser BouncyCastlePEMReader.

     FileReader fr = ... // Create a FileReader for myhost.crt
     PEMReader pemReader = new PEMReader(fr);
     X509Certificate cert = (X509Certificate)pemReader.readObject();
     PublicKey pk = cert.getPublicKey();
     // Close reader...
    

pour la clé privée, vous aurez besoin d'implémenter un PasswordFinder (voir le lien de PEMReader doc) pour la construction de la PEMReader si la clé privée est protégée par mot de passe. (Vous aurez besoin de jeter le résultat de readObject() dans un Key ou PrivateKey.)

17
répondu Bruno 2011-06-26 11:37:25

cela devrait faire ce que vous voulez faire (en utilisant le BouncyCastle PEMReader comme suggéré ci-dessus) -- prendre un certificat PEM-encoded private key+, et produire un fichier PKCS#12. Utilise le même mot de passe pour le PKCS12 qui a été utilisé pour protéger la clé privée.

public static byte[] pemToPKCS12(final String keyFile, final String cerFile, final String password) throws Exception {
    // Get the private key
    FileReader reader = new FileReader(keyFile);

    PEMReader pem = new PEMReader(reader, new PasswordFinder() {
        @Override public char[] getPassword() {
            return password.toCharArray();
        }
    });

    PrivateKey key = ((KeyPair)pem.readObject()).getPrivate();

    pem.close();
    reader.close();

    // Get the certificate      
    reader = new FileReader(cerFile);
    pem = new PEMReader(reader);

    X509Certificate cert = (X509Certificate)pem.readObject();

    pem.close();
    reader.close();

    // Put them into a PKCS12 keystore and write it to a byte[]
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    KeyStore ks = KeyStore.getInstance("PKCS12");
    ks.load(null);
    ks.setKeyEntry("alias", (Key)key, password.toCharArray(), new java.security.cert.Certificate[]{cert});
    ks.store(bos, password.toCharArray());
    bos.close();
    return bos.toByteArray();
}
3
répondu Muggles Merriweather 2012-03-22 20:02:25

jetez un coup d'oeil à org.bouncycastle.cryptographique.générateur.OpenSSLPBEParametersGenerator

1
répondu Kirby 2011-06-26 06:39:26

si je comprends bien, OpenSSL a sauvegardé des fichiers au format PEM. Vous devez le convertir au format Java Key Storage (JKS), puis travailler avec ce format (qui est natif de Java) pour extraire des fichiers. Pour la conversion veuillez utiliser cette requête Google, il donne d'assez bons résultats.

chargez le fichier JKS vers java.sécurité.Fichier de stockage des clés de la classe. Ensuite, utilisez les méthodes getCertificate et getKey pour obtenir les informations nécessaires.

1
répondu Eugene Mayevski 'Allied Bits 2011-06-26 07:08:46