如何用Java代码来把SSL的证书自动导入到Java的秘钥存储文件(keystore)

我们在开发或者使用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插件

的界面设计。

时间: 2024-10-11 20:01:54

如何用Java代码来把SSL的证书自动导入到Java的秘钥存储文件(keystore)的相关文章

Android平台Java代码的条件编译问题

在代码的开发过程中,不管是C/C++也好,Java也罢,都要面对在平台移植的问题, 所以不可避免的要考虑条件编译的问题. 在C/C++代码的开发中,条件编译的实现很容易实现,可以分成二种:一种是在单个代码文件中通过 #ifdef ... #endif 或者 #if ... #endif 的方式选择性编译文件中的代码,另一种是在Makefile中通过宏判断来选择性编译某个文件.在Java代码的开发中,实现条件编译则没有直接对应的方法,但是仍然可以采用变通的方法来实现条件编译. 对于单个文件内的的代

java代码块的理解

最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合,以{}的形式出现,共有4中形式: 1.类的方法体 这是我们最常见的一种java代码块,形式如下: 1 public class Boke { 2 public void say(){ 3 System.out.println("我就是代码块的内容啦"); 4 } 5 } say的方法体{

python调用Java代码,完毕JBPM工作流application

1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用java的开源框架JBPM.为了使Pythonproject整合Java框架,尝试过jbpm-console提供的 REST, 以失败告终,终于选用Python 直接调用Java代码.操作JBPM. 1.1pythonprojectREST与JBPM Workbench交互 失败 REST URL格式 h

【教程】模拟登陆百度之Java代码版

[背景] 之前已经写了教程,分析模拟登陆百度的逻辑: [教程]手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程 然后又去用不同的语言: Python的: [教程]模拟登陆网站 之 Python版(内含两种版本的完整的可运行的代码) C#的: [教程]模拟登陆网站 之 C#版(内含两种版本的完整的可运行的代码) 去实现对应逻辑. 此处,继续尝试,用Java代码,实现这套,模拟登陆百度,的逻辑. [折腾过程] 1.之前已经整理了一些Java代码: http://c

Sping实战之通过JAVA代码装配Bean

尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配置Spring.比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了. 在这种情况下,你必须要采用显式装配的方式.在进行显式配置的时候,有两种可选方案:Java和XML.在这节中,我们将会学习如何使用Java配置,接下来的一节中将会继续学习Spring

你编写的Java代码是咋跑起来的?

如果你是一名 Java 开发人员,你肯定指定 Java 代码有很多种不同的运行方式.比如说可以在开发工具(IDEA.Eclipse等)中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至可以在网页(比如各种 OJ)中运行.当然,这些执行方式都离不开 JRE(Java 运行时环境). JRE 包含运行 Java 程序的必需组件,包括 JVM(Java 虚拟机)以及 Java 核心类库等.Java 程序员经常接触到的 JDK(Java 开发工具包)同样包含了 JRE,并且还附带了一系列

docker项目ssl 安全证书的种种

一,使用nginx代理,将证书挂着宿主的nginx上 这个很简单,只需要修改宿主nginx的配置文件即可 server { listen 443 ssl default; server_name www.abc.com; #项目域名 ssl_certificate "cert/ssl_certificate.pem"; #证书文件 ssl_certificate_key "cert/ssl_certificate.key"; #秘钥文件 ssl_session_ca

关于java keytool生成秘钥库随笔

1.设置java环境变量(忽略) 2.使用keytool生成秘钥库(我也不知道该如何称呼,有人称呼他为证书库,反正知道他是个库就行了)(以下         操作都是在dos下运行的,加-help来查看该命令的参数,比如说生成秘钥库的命令是keytool -genkey,可       以使用keytool -genkey -help来查看genkey的一些参数)  keytool  -genkey -alias test1 -keyalg RSA -keystore  e:/keystoreT

如何通过抓包查看客户端https连接中ssl/tls加密所采用的秘钥位数

在https传输的过程中,我们底层的加密传输协议是ssl/tls.这里所使用的加密算法的秘钥位数(也就是服务器所使用的https证书的位数)可能是1024/2048或者更高,目前1024位的证书已经被证实是不安全的,需要逐步替换掉. 那么如何通过抓包来查看当前连接所采用的实际加密位数呢(注意,这里是抓包查看,如果是网页我们用浏览器直接访问,点击那个小锁然后进行一系列的操作就可以查看到连接信息了,如果有兴趣查看以下链接内容:http://www.wosign.com/FAQ/how_to_chec