web-dev-qa-db-ja.com

keytoolを使用せずにプログラムでCA信頼証明書を既存のキーストアファイルにインポートする

.cer CAを既存のキーストアファイルにインポートするJavaプログラムを作成します。エンドユーザーがCA証明書をより便利に挿入できるようにします(コマンドでCMDとキーを使用せずに)。

Javaコードがこれを実行できる場所はどこですか?

私はいくつかの方法を試してみますが、それでも証明書をJavaに入れることができません

CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream certstream = fullStream (certfile);
Certificate certs = cf.generateCertificates(certstream);

エラーは互換性のないタイプですが、他に提案はありますか?

色々ありがとう

27
user2767117

次のコードは、CA証明書ファイルを挿入しますyourcert.cerを使用せずにキーストアにkeytool

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileOutputStream;
import Java.security.Key;
import Java.security.KeyStore;
import Java.security.cert.Certificate;
import Java.io.IOException;
import Java.io.InputStream;
import Java.io.DataInputStream;
import Java.io.ByteArrayInputStream;
import Java.security.spec.*;
import Java.security.cert.Certificate;
import Java.security.cert.CertificateFactory;
import Java.util.Collection;

public class ImportCA {

    public static void main(String[] argv) throws Exception {
        String certfile = "yourcert.cer"; /*your cert path*/
        FileInputStream is = new FileInputStream("yourKeyStore.keystore");

        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        keystore.load(is, "yourKeyStorePass".toCharArray());

        String alias = "youralias";
        char[] password = "yourKeyStorePass".toCharArray();

        //////

        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream certstream = fullStream (certfile);
        Certificate certs =  cf.generateCertificate(certstream);

        ///
        File keystoreFile = new File("yourKeyStorePass.keystore");
        // Load the keystore contents
        FileInputStream in = new FileInputStream(keystoreFile);
        keystore.load(in, password);
        in.close();

        // Add the certificate
        keystore.setCertificateEntry(alias, certs);

        // Save the new keystore contents
        FileOutputStream out = new FileOutputStream(keystoreFile);
        keystore.store(out, password);
        out.close();
    }

    private static InputStream fullStream ( String fname ) throws IOException {
        FileInputStream fis = new FileInputStream(fname);
        DataInputStream dis = new DataInputStream(fis);
        byte[] bytes = new byte[dis.available()];
        dis.readFully(bytes);
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        return bais;
    }
}
35
user2767117

リンクから証明書をダウンロードし、特定のパスに保存します。次に、実行中に以下のコードを使用してそのファイルをtrustStoreにロードします。この例が役立つことを願っています。

KeyStore keyStore = KeyStore.getInstance("JKS");
String fileName = "D:\\certs_path\\cacerts"; // cerrtification file path
System.setProperty("javax.net.ssl.trustStore", fileName);
6