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

的界面设计。

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

  1. 编辑距离及其动态规划算法(Java代码)

    编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.一般情况下编辑操作包括: 将一个字符替换成另一个字符: 插入一个字符: 删除一个字 ...

  2. java代码块的理解

    最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合 ...

  3. 使用非java代码编程

    使用非JAVA代码     JAVA语言及其标准API(应用程序编程接口)应付应用程序的编写已绰绰有余.但在某些情况下,还是必须使用非JAVA编码.例如,我们有时要访问操作系统的专用特性,与特殊的硬件 ...

  4. 算法笔记1 - 编辑距离及其动态规划算法(Java代码)

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/3808035.html 编辑距离概念描述 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个 ...

  5. JSP中的Java代码和内置对象

    一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...

  6. 从Java代码到字节码(1)

    理解Java代码是如何被编译为字节码并在Java虚拟机(JVM)上执行是非常重要的,这将帮助理解你的程序是如何执行的.这样的理解不仅仅能够让你在逻辑上更好的掌握语言特性,而且能够有机会理解在做出重要决 ...

  7. Java代码输出到txt文件(申请专利贴源码的必备利器)

    最近公司在申请专利,编写不少文档,项目的代码量实在是过于庞大.如果一个一个的复制粘贴虽然能够完成,但是对于程序员而言实在没有这个必要.shell或者python就能解决这个问题.由于我个人对于shel ...

  8. WEB应用中普通java代码如何读取资源文件

    首先: 资源文件分两种:后缀.xml文件和.properties文件 .xml文件:当数据之间有联系时用.xml .properties文件:当数据之间没有联系时用.properties 正题:   ...

  9. 将MySQL一张表的数据迁移到MongoDB数据库的Java代码示例

    Java代码: package com.zifeiy.snowflake.handle.etl.mongodb; import java.sql.Connection; import java.sql ...

随机推荐

  1. IntelliJ IDEA + Maven + Tomcat 本地开发、部署、调试。

    1.maven 下载 解压 配置下 远程仓库( 用阿里云的 比较快).本地仓库 (可以本地C盘建立个文件夹当仓库).环境变量(方便使用maven命令)就可以了. 2.tomcat 下载 解压 配置下 ...

  2. C压缩字符串中的空格

    使用纯C语言,去除一个字符串开头和结尾的空格,内部若有连续空格只保留一个.  C Code  12345678910111213141516171819202122232425262728293031 ...

  3. 在VirtualBox虚拟机中安装Centos操作系统怎么与本地XShell远程连接

    问题: 在VirtualBox安装好了CentOS操作系统后,我们怎么才可以用XSell连接虚拟机中的CentOS呢? 答案: (1)在windows下用cmd--ipconfig查看VirtualB ...

  4. 查找sqlserver数据库中,查询某值所表名和字段名

    有时候我们想通过一个值知道这个值来自数据库的哪个表以及哪个字段,通过一个存储过程实现的.只需要传入一个想要查找的值,即可查询出这个值所在的表和字段名. 前提是要将这个存储过程放在所查询的数据库. CR ...

  5. NopCommerce 执行计划任务不同Services协调操作导致更新数据失败的问题!

    问题描述: 在Nop的计划任务里需要两个任务协调操作 _shipmentService.InsertShipment(shipment); _orderProcessingService.Ship(s ...

  6. Sample ASP.NET IHttpHandler

    LoggerHandler.cs using System; using System.Collections.Generic; using System.Diagnostics; using Sys ...

  7. LoadRunner中的IP欺骗的设置以及误区

    LoadRunner中的IP欺骗的设置以及误区 最近在忙着部署web性能测试的环境后,对IP欺骗进行设置,特地做个笔记,给自己的学习历程留下点足迹. 一. 什么是IP欺骗? 做什么事首先要问个为什么, ...

  8. Spring Boot 教程demo

    https://github.com/ityouknow/spring-boot-examples

  9. Ionic 自动创建应用的图标与启动画面

    你只需要一个目录和两张图片就可以搞定.图片可以是 .png 的,Photoshop的 .psd,或者Illustrator的 .ai,(例如)命名为icon.png和splash.png.把这些图片放 ...

  10. CentOS 打包压缩文件 zip 命令详解

    我们再linux中常见的压缩文件有.tar.gz,.zip,.gz,在linux中,你要习惯没有.rar的日子. 一下为tar,zip命令详解 tar -zcvf /home/files.tar.gz ...