我們在開發或者使用SSL的過程中,很多的軟體需要我們提供java的keystore,特別是一些基於Java的中介軟體產品。 我們常規的做法是JDK內建的工具命令(keytool)去做,比如,下面的例子
keytool -import -v -alias EnTrust2048 -file D:\certs\EnTrust2048.cer -keystore D:\certs\test.jks
keytool -import -v -alias EntrustCertificationAuthorityL1C -file D:\certs\EntrustCertificationAuthorityL1C.cer -keystore D:\certs\test.jks
keytool -import -v -alias test.com -file D:\certs\Service-now.com.cer -keystore D:\certs\test.jks
但是這種方式比較繁瑣,假設我們一個檔案夾下面有100個SSL的認證,那麼我們就要輸入100個類似於上面的命令。如果是檔案夾裡面套檔案夾
裡面還有認證,就更麻煩。那麼有沒有好的辦法呢。 筆者就跟大家分享一下如何用java的程式碼去實現。
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.security.KeyStore;import java.security.cert.CertificateFactory;import java.security.cert.X509Certificate;import java.util.List;import javax.naming.ldap.LdapName;import javax.naming.ldap.Rdn;import javax.security.auth.x500.X500Principal;public class KeyStoreHelper {public static void createTrustJKSKeyStore(final String originalTrustFolder,final String jksTrustStoreLocation, final String password) {File keyStoreFile = new File(jksTrustStoreLocation);if (!keyStoreFile.exists()) {try {KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());keystore.load(null, password.toCharArray());File trustedFolder = new File(originalTrustFolder);File[] certs = trustedFolder.listFiles();if (certs != null) {for (File cert : certs) {CertificateFactory factory = CertificateFactory.getInstance("X.509");try {X509Certificate certificate = (X509Certificate) factory.generateCertificate(new FileInputStream(cert));X500Principal principal = certificate.getSubjectX500Principal();LdapName ldapDN = new LdapName(principal.getName());List<Rdn> rdns = ldapDN.getRdns(); for (Rdn rdn : rdns) {String type = rdn.getType();if (type.equals("CN")) { keystore.setCertificateEntry((String) rdn.getValue(),certificate); break;} }} catch (Exception ex) {continue; }} }FileOutputStream fos = new FileOutputStream(jksTrustStoreLocation);keystore.store(fos, password.toCharArray());fos.close();} catch (Exception exp) {}}}/** * @param args */public static void main(String[] args) {KeyStoreHelper.createTrustJKSKeyStore("D:\\cacerts", "D:\\cacerts\\test.jks", "test123");}}
上面這個Java類可以協助我們做這個事情。同時我們還可以把這個協助方法開發一個可視化的程式,這樣就更加方便,下圖就是筆者自己開發的一個Eclipse Plugin外掛程式
的介面設計。