2017-05-17 8 views
1

私は証明書ストアを作成しましたが、このクラスの別の関数の別の証明書を追加します。 caCertintermediateCertと、クラス1でCertStoreをX509Certificate []配列に変換します。JAVA

メイクチェーン:

List<X509Certificate> certList = new ArrayList<X509Certificate>(); 
certList.add(0, interCert); 
certList.add(1, caCert); 
Store<X509Certificate> certs = new JcaCertStore(certList); 
certStore = new JcaCertStoreBuilder().addCertificates(certs).build(); 

私はクラス2で、新しいビルドのユーザー証明書を追加したい:

certStore = new JcaCertStoreBuilder().addCertificate(certHolder).build(); 

KeyStoreに新しいキーを保存するにはI証明書の配列(X509Certificate[])が必要です。 privatekeyentryを動作させるために、certStoreファイルを配列に変換するにはどうすればよいですか?

PrivateKeyEntry privKeyEntry = new PrivateKeyEntry(pair.getPrivate(), chain); 
store.setEntry(alias, privKeyEntry, new KeyStore.PasswordProtection(storePassword)); 
+0

bouncycastleを使用していますか? –

+0

はい、私はbouncycastleを使用します。 – nolags

答えて

1

私ははBouncyCastle 1.56JDK 1.7を使用しています。

最も簡単な方法は、証明書ストアからすべての証明書を取得し、(証明書ストアを別に作成して変換する代わりに)それらをアレイに追加することです。いくつかの実装はnull引数を受け入れない

// get all certificates in certStore 
Collection<? extends Certificate> allCerts = certStore.getCertificates(null); 

:あなたがすることができる証明書ストアのすべての証明書を取得するには

。この場合、あなたは(java.security.cert.X509CertSelectorクラスを使用して)このようなセレクタを作成する必要があります。その後

Collection<? extends Certificate> allCerts = certStore.getCertificates(new X509CertSelector() { 
    @Override 
    public boolean match(Certificate cert) { 
     // match all certificates (so it'll return all of them) 
     return true; 
    } 
}); 

を、allCertscertStoreにある2つの証明書を持っています。

今、あなたはあなたの配列を作成し、必要なすべての証明書を追加します。

// create array 
X509Certificate[] certificatesArray = new X509Certificate[3]; 

// add certificates in allCerts (the 2 that were in certStore) 
int i = 0; 
for (Certificate c : allCerts) { 
    certificatesArray[i] = (X509Certificate) c; 
    i++; 
} 

// add the new certificate (newCert being a X509Certificate) 
certificatesArray[2] = newCert; 

注: 新しい証明書の種類がorg.bouncycastle.cert.X509CertificateHolderある場合は、使用してjava.security.cert.X509Certificateに変換することができますorg.bouncycastle.cert.jcajce.JcaX509CertificateConverterクラス:

X509CertificateHolder certHolder = ...; 
X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder); 

または手動で行うこともできますjava.security.cert.CertificateFactory

X509CertificateHolder certHolder = ...; 
CertificateFactory f = CertificateFactory.getInstance("X509"); 
X509Certificate cert = (X509Certificate) f.generateCertificate(new ByteArrayInputStream(certHolder.getEncoded())); 
関連する問題