• 怎样用Java代码来把SSL的证书自己主动导入到Java的秘钥存储文件(keystore)


    我们在开发或者使用SSL的过程中,非常多的软件须要我们提供java的keystore。特别是一些基于Java的中间件产品。

    我们常规的做法是JDK自带的工具命令(keytool)去做。比方,以下的样例
    keytool -import -v -alias EnTrust2048 -file D:certsEnTrust2048.cer -keystore D:certs est.jks
    keytool -import -v -alias EntrustCertificationAuthorityL1C -file D:certsEntrustCertificationAuthorityL1C.cer -keystore D:certs est.jks
    keytool -import -v -alias test.com -file D:certsService-now.com.cer -keystore D:certs est.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插件

    的界面设计。





  • 相关阅读:
    crt中文乱码
    idea使用git版本控制忽略部分文件
    Springboot配置redis连接池参数
    redis通过lua脚本实现分布式锁
    jodaTime的使用
    jmap的使用
    代理服务器没有响应解决方案
    C/C/C++中暂停调试的三种方法C++中暂停调试的三种方法
    C/C/C++中暂停调试的三种方法C++中暂停调试的三种方法
    四种常见的post请求中的参数形式
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5386981.html
Copyright © 2020-2023  润新知