在我的情况下,我有一个pem文件,其中包含两个证书和一个用于相互SSL身份验证的加密私钥。所以我的pem文件看起来像这样:

-----BEGIN CERTIFICATE-----

...

-----END CERTIFICATE-----

-----BEGIN RSA PRIVATE KEY-----

Proc-Type: 4,ENCRYPTED

DEK-Info: DES-EDE3-CBC,C8BF220FC76AA5F9

...

-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

...

-----END CERTIFICATE-----

这是我所做的

将文件分为三个单独的文件,以便每个文件仅包含一个条目,---BEGIN..以---END..行开头和结尾。让我们假设我们现在有三个文件:cert1.pem,cert2.pem,和pkey.pem。

pkey.pem使用openssl和以下语法转换为DER格式:

openssl pkcs8 -topk8 -nocrypt-输入pkey.pem-通知PEM-输出pkey.der-输出DER

请注意,如果私钥是加密的,则需要提供密码(从原始pem文件的供应商处获取)以转换为DER格式, openssl将要求您提供如下密码:“输入密码pkey.pem:”。

如果转换成功,您将获得一个名为的新文件pkey.der。

创建一个新的Java密钥库并导入私钥和证书:

String keypass = "password";  // this is a new password, you need to come up with to protect your java key store file

String defaultalias = "importkey";

KeyStore ks = KeyStore.getInstance("JKS", "SUN");

// this section does not make much sense to me,

// but I will leave it intact as this is how it was in the original example I found on internet:

ks.load( null, keypass.toCharArray());

ks.store( new FileOutputStream ( "mykeystore"  ), keypass.toCharArray());

ks.load( new FileInputStream ( "mykeystore" ),    keypass.toCharArray());

// end of section..

// read the key file from disk and create a PrivateKey

FileInputStream fis = new FileInputStream("pkey.der");

DataInputStream dis = new DataInputStream(fis);

byte[] bytes = new byte[dis.available()];

dis.readFully(bytes);

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

byte[] key = new byte[bais.available()];

KeyFactory kf = KeyFactory.getInstance("RSA");

bais.read(key, 0, bais.available());

bais.close();

PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key );

PrivateKey ff = kf.generatePrivate (keysp);

// read the certificates from the files and load them into the key store:

Collection  col_crt1 = CertificateFactory.getInstance("X509").generateCertificates(new FileInputStream("cert1.pem"));

Collection  col_crt2 = CertificateFactory.getInstance("X509").generateCertificates(new FileInputStream("cert2.pem"));

Certificate crt1 = (Certificate) col_crt1.iterator().next();

Certificate crt2 = (Certificate) col_crt2.iterator().next();

Certificate[] chain = new Certificate[] { crt1, crt2 };

String alias1 = ((X509Certificate) crt1).getSubjectX500Principal().getName();

String alias2 = ((X509Certificate) crt2).getSubjectX500Principal().getName();

ks.setCertificateEntry(alias1, crt1);

ks.setCertificateEntry(alias2, crt2);

// store the private key

ks.setKeyEntry(defaultalias, ff, keypass.toCharArray(), chain );

// save the key store to a file

ks.store(new FileOutputStream ( "mykeystore" ),keypass.toCharArray());

(可选)验证新密钥库的内容:

$ keytool -list -keystore mykeystore -storepass password

密钥库类型:JKS密钥库提供者:SUN

您的密钥库包含3个条目:

cn = ...,ou = ...,o = ..,2014年9月2日,trustCertEntry,证书指纹(SHA1):2C:B8:...

importkey,2014年9月2日,PrivateKeyEntry,证书指纹(SHA1):9C:B0:...

cn = ...,o = ....,2014年9月2日,trustCertEntry,证书指纹(SHA1):83:63:...

(可选)针对SSL服务器测试新密钥存储中的证书和私钥:(您可能希望将调试作为VM选项启用:-Djavax.net.debug = all)

char[] passw = "password".toCharArray();

KeyStore ks = KeyStore.getInstance("JKS", "SUN");

ks.load(new FileInputStream ( "mykeystore" ), passw );

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

kmf.init(ks, passw);

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

tmf.init(ks);

TrustManager[] tm = tmf.getTrustManagers();

SSLContext sclx = SSLContext.getInstance("TLS");

sclx.init( kmf.getKeyManagers(), tm, null);

SSLSocketFactory factory = sclx.getSocketFactory();

SSLSocket socket = (SSLSocket) factory.createSocket( "192.168.1.111", 443 );

socket.startHandshake();

//if no exceptions are thrown in the startHandshake method, then everything is fine..

如果打算使用它,最后向HttpsURLConnection注册您的证书:

char[] passw = "password".toCharArray();

KeyStore ks = KeyStore.getInstance("JKS", "SUN");

ks.load(new FileInputStream ( "mykeystore" ), passw );

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

kmf.init(ks, passw);

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

tmf.init(ks);

TrustManager[] tm = tmf.getTrustManagers();

SSLContext sclx = SSLContext.getInstance("TLS");

sclx.init( kmf.getKeyManagers(), tm, null);

HostnameVerifier hv = new HostnameVerifier()

{

public boolean verify(String urlHostName, SSLSession session)

{

if (!urlHostName.equalsIgnoreCase(session.getPeerHost()))

{

System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");

}

return true;

}

};

HttpsURLConnection.setDefaultSSLSocketFactory( sclx.getSocketFactory() );

HttpsURLConnection.setDefaultHostnameVerifier(hv);

java pem 私钥_将PEM导入Java密钥库相关推荐

  1. eclipse 导入maven项目_解决Eclipse导入JAVA WEB项目错误的问题

    蓝字关注 远浩老师 一. 本文问题 在开发中不可避免地要涉及导入项目.Eclipse作为常用开发工具,导入JAVA WEB项目文件也很方便,但是我们经常发现导入完的项目有红色的叉来做错误提醒,甚至一些 ...

  2. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  3. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  4. 做Java头发少_这35个Java代码优化细节,你用了吗

    链接:https://www.jianshu.com/p/6e472304b5ac 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有 ...

  5. java session使用_使用Neo4j和Java进行大数据分析 第2部分

    本文的第一部分介绍了Neo4j及其Cypher查询语言.如果您已经阅读了第1部分,那么您已经了解了为什么Neo4j和其他图形数据库特别受社交图形或网络中用户之间关系建模的影响.您还在开发环境中安装了N ...

  6. 支持java虚拟主机_为何缺乏支持Java的虚拟主机

    现在很多站长们,都青睐于香港虚拟主机建站.现在常见的是asp和PHP的程序空间很多,但是Java的少之又少,下面小编我给大家聊一聊! 一.香港Java虚拟主机成本高 使用Java程序建站,就必须要用支 ...

  7. 我的世java途径错误_我的世界JAVA路径错误的解决方法分享

    我的世界JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?第一手游网必须 ...

  8. java编程赋值运算符_跟我学java编程—简单赋值运算符“=”

    赋值运算符是双目运算符,用在赋值表达式中.赋值运算符将值存储在运算符左边操作数指定的变量中.有两种赋值操作,简单赋值和复合赋值,简单赋值把运算符右边的操作数的值存储在运算符左边操作数指定的变量中:复合 ...

  9. java 异常信息_优雅的异常处理 -- Java中的异常

    处理异常自己处理 try-catch抛出让别人处理 throws 获得异常信息 直接打印异常对象 通过异常对象调用getMessage()方法获得 通过异常对象调用printStackTrace()方 ...

最新文章

  1. Linux设备文件简介。
  2. STM32 电机教程 19 - 基于ST MC Workbench 单电阻FOC
  3. java 打包成服务_maven javaProject打包发布成服务
  4. 高速的二舍八入三七作五_京承高速收费“二舍八入 三七作五”
  5. 数据库期末总结笔记( 零基础 )
  6. [职场]白领常见的18个职场困惑
  7. 微信实现双向跨境支付,将向香港用户开放内地支付服务
  8. 对Map集合排序,先对value降序,value相同的情况下,key升序
  9. visio2013安装包及破解工具KMS
  10. 【HarmonyOS HiSpark IPC DIY Camera试用连载2 】一天内极速完成从开箱编译烧写到跑通hello world
  11. FTP服务报错227解决办法
  12. python大作业黑白棋_计算概论大作业——黑白棋AI设计
  13. GCD Expectation ZOJ - 3868 (容斥)
  14. 微信小程序请求头header_微信小程序开发:http请求
  15. vmstat 命令的用法说明
  16. UAP安装使用FindBugs
  17. 鸿蒙os校园行,校园行活动开启,IG战队成主人公!Rookie、TheShy空降高校?
  18. java下载网络文件+Illegal character in path at index 135错误解决方法
  19. 平面的截距式方程推导
  20. CSS3(Cascading Style Sheet) 层叠样式表

热门文章

  1. 计算一个全息图片的两个设想
  2. Reporting service个人使用经验
  3. 15条有用的Linux/Unix 磁带管理指令
  4. 微信硬件平台智能路由行业解决方案
  5. 据lovecherry的一步一步学Remoting序列文章学习.net Remoting日记(2)
  6. .NET Framework/.NET Compact Framework/.NET Micro Framework功能集比较
  7. 基于springboot实现疫情数据统计系统
  8. 基于SSH实现在线课程学习系统
  9. jquery获取select选中的值
  10. 织梦 百度sitemap制作教程