如何从jks文件中将已有的密钥读取出来

如何从jks文件中将已有的密钥读取出来,第1张

下面是两个java读取JKS文件密钥的方法

当然在看懂下面两个方法之前要对JKS文件的结构有所了解:

JKS文件就好像一个仓库,里面可以放很多的东西,这里只存放一类东西态羡就是密钥,仓库当然会有一把锁,防范别人随便乱拿,这个就是JKS文件的密码。里面存放的密钥也各有不同,每个密钥都有一个名字(在下面叫别名),一类就密钥对,一类叫公钥,一类叫私钥,密钥对就是包含公钥和私钥的。这里的公帆局拍钥只要你能进入仓库你就可以随便查看拿走,私钥则是有密码的,只允许有权限的人查看拿走。所以在下面读取密钥时也就有点细微的不同之处,对于读取公钥只需要知道JKS文件(仓库)的密码就可以了,但是在读取私钥时则必须有私钥的密码也就是你必须要有权限,在下面你会发现,在读取私钥时多了一个参数,对应的就是私钥的密码。

import java.io.FileInputStream

import java.io.FileNotFoundException

import java.io.IOException

import java.security.KeyStore

import java.security.KeyStoreException

import java.security.NoSuchAlgorithmException

import java.security.PrivateKey

import java.security.PublicKey

import java.security.UnrecoverableKeyException

import java.security.cert.CertificateException

import javax.security.cert.Certificate

public class JKSTesting {

public static PublicKey getPublicKey(String keyStoreFile,

String storeFilePass, String keyAlias) {

// 读取密钥是所要用到的工具类

KeyStore ks

// 公钥类所对应的腊返类

PublicKey pubkey = null

try {

// 得到实例对象

ks = KeyStore.getInstance("JKS")

FileInputStream fin

try {

// 读取JKS文件

fin = new FileInputStream(keyStoreFile)

try {

// 读取公钥

ks.load(fin, storeFilePass.toCharArray())

java.security.cert.Certificate cert = ks

.getCertificate(keyAlias)

pubkey = cert.getPublicKey()

} catch (NoSuchAlgorithmException e) {

e.printStackTrace()

} catch (CertificateException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

}

} catch (FileNotFoundException e) {

e.printStackTrace()

}

} catch (KeyStoreException e) {

e.printStackTrace()

}

return pubkey

}

/**

* 得到私钥

*

* @param keyStoreFile

*私钥文件

* @param storeFilePass

*私钥文件的密码

* @param keyAlias

*别名

* @param keyAliasPass

*密码

* @return

*/

public static PrivateKey getPrivateKey(String keyStoreFile,

String storeFilePass, String keyAlias, String keyAliasPass) {

KeyStore ks

PrivateKey prikey = null

try {

ks = KeyStore.getInstance("JKS")

FileInputStream fin

try {

fin = new FileInputStream(keyStoreFile)

try {

try {

ks.load(fin, storeFilePass.toCharArray())

// 先打开文件

prikey = (PrivateKey) ks.getKey(keyAlias, keyAliasPass

.toCharArray())

// 通过别名和密码得到私钥

} catch (UnrecoverableKeyException e) {

e.printStackTrace()

} catch (CertificateException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

}

} catch (NoSuchAlgorithmException e) {

e.printStackTrace()

}

} catch (FileNotFoundException e) {

e.printStackTrace()

}

} catch (KeyStoreException e) {

e.printStackTrace()

}

return prikey

}

public static void main(String[] args) {

PublicKey publicKey

PrivateKey privateKey

publicKey=getPublicKey("C:\\aaa.jks","AAAAAAAA", "ibmwebspheremq")

privateKey=getPrivateKey("C:\\aaa.jks","AAAAAAAA", "ibmwebspheremq","AAAAAAAA")

System.out.println(publicKey.toString())

System.out.println(privateKey.toString())

}

}

网上度娘一堆 都是摘抄……重点姿者是每个都有错的。。。也是醉了

那就整理一下,废话不多说,开撸

这个没得说 快捷键win+r cmd 打开命令行界面,输入 java -version查询是否按照jdk 没有安装自己去 度娘 这个不解释了

进入到需圆姿要生成jks的文件夹 本文在 E:\cert 目录下生成

①、命名 shift+鼠标右键 在此处打开命令行窗口

②、 执行命令 keytool -genkeypair -alias demo -keyalg RSA -keypass 123789 -storepass 123789 -keyalg RSA -keysize 2048 -validity 3650 -keystore demo.jks

参数说明:

storepass keystore 文件存储密码

keypass 私钥加解密密码

PS:迹腔薯 上面两个密码要一致

keyalt 采用公钥算法,默认是DSA

validity 有效期 单位是天

keysize 密钥长度(DSA算法对应的默认算法是sha1withDSA,不支持2048长度,此时需指定RSA)

keystore 指定keystore文件 如上面命令中demo.jks

③、如上图 按提示输入你的信息 最后输入y 确认即可

④、转换为行业标准格式 输入 keytool -importkeystore -srckeystore demo.jks -destkeystore demo.jks -deststoretype pkcs12

keytool -list -keystore demo.jks -v

根据提示输入命令

执行命令 keytool -alias demo -exportcert -keystore demo.jks -file demo.cer

输入密码即可

双击证书 查看

基本上到这一步已经完成本文的内容,以下是补充以及踩坑

jks文件中的私钥不能直接得到,需要通过openssl将jks文件转换成pkcs12格式后再进行提取

执行命令 keytool -v -importkeystore -srckeystore demo.jks -srcstoretype jks -srcstorepass 123789 -destkeystore demo.pfx -deststoretype pkcs12 -deststorepass 876543210 -destkeypass 12345678

执行如下命令便可以将demo.pfx的私钥导出:

openssl pkcs12 -in demo.pfx -nocerts -nodes -out demo.key

输入密码打开即可

执行命令 keytool -list -rfc -keystore demo.jks -storepass 123789

查询了很多资料 人笨没有找到合适办法。。。。 哪位大佬知道了告知下 感激不尽

贴上链接

https://www.jb51.net/softjc/575021.html

https://blog.csdn.net/bgfuufb/article/details/83927001

https://blog.csdn.net/qq_39081974/article/details/81059022


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12211926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存