2017-08-03 21 views
1

私は、既存のcrtファイルからキーパッド "PCKS12"をJava apisで作成します。 それは可能ですか?そうなら、それをどうやって作るのですか?crtファイルからp12とkeyStoreを作成

EDIT

1/ のOpenSSL REQ -newkey RSA:2048 -nodes -keyout keyFile.key -x509 -days 3650アウトcertFile.crt
2/ のOpenSSL PKCS12 - 輸出-in certFile.crt -inkey keyFile.key -out tmp.p12 -name別名
3/ のkeytool -importkeystore -srckeystore tmp.p12 -srcstoretype PKCS12 -srcstorepassパスワード-destkeystore keySto reFile.jks -deststoretype JKS -deststorepass password -destkeypass password-エイリアスエイリアス

手順2と3を計画的に行うにはどうすればよいですか?

+0

は、それはあなたに多くの良いしないだろう。 p12ファイルは、通常、公開鍵/秘密鍵のペアです。 – rmlan

答えて

2

あなたがJavaのkeytoolとルートCAを含むPKCS#12キーストアを作成することができます。

keytool -importcert -trustcacerts -keystore keystore.p12 -storetype pkcs12 \ 
    -alias root -file root.crt 

無いようにするには、キーストアの完全性を保護するために使用されるパスワードの入力を求めるプロンプトが表示されます検出せずにトラストアンカーを変更することができます。別のオプションでパスワードを指定することはできますが、パスワードをシステムに残す可能性があります。

ここで、-trustcacertsは、認証機関としてインポートする証明書を信頼することを意味します。このままにしておくと、証明書が表示され、レビューと承認を求めるメッセージが表示されます。

"root"というエイリアスは、実際に店舗内の証明書のニックネームであり、後でこの証明書を識別するのに役立つものであれば何でもかまいません。

もちろん、「root.crt」ファイルはインポートするCA証明書です。プログラムによる


:CRTファイルは公開鍵のみが含まれていると仮定すると、

static void createTrustStore(Path certificate, Path keystore, char[] password) 
     throws IOException, GeneralSecurityException { 
    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    Certificate root; 
    try (InputStream is = Files.newInputStream(certificate)) { 
     root = cf.generateCertificate(is); 
    } 
    KeyStore pkcs12 = KeyStore.getInstance("PKCS12"); 
    pkcs12.load(null, null); 
    pkcs12.setCertificateEntry("root", root); 
    try (OutputStream os = Files.newOutputStream(keystore, StandardOpenOption.CREATE_NEW)) { 
     pkcs12.store(os, password); 
    } 
} 

private static final byte[] HEADER = "-----".getBytes(StandardCharsets.US_ASCII); 

static void createIdentityStore(Path certificate, Path key, Path keystore, char[] password) 
     throws IOException, GeneralSecurityException { 
    byte[] pkcs8 = decode(Files.readAllBytes(key)); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PrivateKey pvt = kf.generatePrivate(new PKCS8EncodedKeySpec(pkcs8)); 
    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    Certificate pub; 
    try (InputStream is = Files.newInputStream(certificate)) { 
     pub = cf.generateCertificate(is); 
    } 
    KeyStore pkcs12 = KeyStore.getInstance("PKCS12"); 
    pkcs12.load(null, null); 
    pkcs12.setKeyEntry("identity", pvt, password, new Certificate[] { pub }); 
    try (OutputStream s = Files.newOutputStream(keystore, StandardOpenOption.CREATE_NEW)) { 
     pkcs12.store(s, password); 
    } 
} 

private static byte[] decode(byte[] raw) { 
    if (!Arrays.equals(Arrays.copyOfRange(raw, 0, HEADER.length), HEADER)) return raw; 
    CharBuffer pem = StandardCharsets.US_ASCII.decode(ByteBuffer.wrap(raw)); 
    String[] lines = Pattern.compile("\\R").split(pem); 
    String[] body = Arrays.copyOfRange(lines, 1, lines.length - 1); 
    return Base64.getDecoder().decode(String.join("", body)); 
} 
+0

プログラムで作成したい –

+1

@MedBesbes Fine – erickson

+0

入力として.crtと.keyファイルがあるので、私の編集をご覧ください。 –

関連する問題