首页域名资讯 正文

从keystore(jks)文件中提取私钥

2025-01-28 1 0条评论

JKS文件是使用keytool生成的keystore文件,存放私钥和证书。但是我们用keytool的时候,私钥并没有单独生成出来。这个不利于我们后期的一些扩展工作。所以,我们需要把私钥从keytool中提取出来。

这里可以使用在线转化工具,可以直接获得KEY。

另外在网上发现了这篇文章,经验证通过下面的方法获得 私钥 和 通过在线生成工具生成的结果是一样的。有兴趣的朋友可以研究下。

经过研究,确认如下两种方法是可靠的。

方案1:

使用Open ssl 工具来完成

1、从JKS转换到PKCS12

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

D:\ssl>keytool -importkeystore -srckeystore keystore_old.jks -destkeystore keystore_old.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass changeit -deststorepass changeit -srcalias tom_server -destalias xxx -srckeypass changeit -destkeypass changeit -noprompt

2、从PKCS12转换成PEM格式

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

openssl pkcs12 -in keystore_old.p12 -out keystore_old.pem -passin pass:changeit -passout pass:changeit

3、用记事本打开PEM格式文件,从PEM格式的certificate chain中取出私钥,保存为privateKey.key(这个只是一个过渡文件,下面才是最终的KEY)

4、生成私钥

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

openssl rsa -in privateKey.key -check

私钥将被显示在命令行界面上(最终的KEY)

 

方案2:

Keystore是一个密码保护的文件,存放私钥和证书。可以通过JDK自带的keytool工具生成。

但是keytool工具,并没有提供方便的方法,从keystore文件中到处私钥和证书。

所以可以通过JDK提供的java.security.KeyStore 类来编码完成相关工作。

[java] view plain copy 在CODE上查看代码片派生到我的代码片

import java.io.File;

import java.io.FileInputStream;

import java.io.FileWriter;

import java.security.Key;

import java.security.KeyPair;

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.Certificate;

import sun.misc.*;

public class ExportPrivateKey {

private File keystoreFile;

private String keyStoreType;

private char[] password;

private String alias;

private File exportedFile;

public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) {

try {

Key key=keystore.getKey(alias,password);

if(key instanceof PrivateKey) {

Certificate cert=keystore.getCertificate(alias);

PublicKey publicKey=cert.getPublicKey();

return new KeyPair(publicKey,(PrivateKey)key);

}

} catch (UnrecoverableKeyException e) {

} catch (NoSuchAlgorithmException e) {

} catch (KeyStoreException e) {

}

return null;

}

public void export() throws Exception{

KeyStore keystore=KeyStore.getInstance(keyStoreType);

BASE64Encoder encoder=new BASE64Encoder();

keystore.load(new FileInputStream(keystoreFile),password);

KeyPair keyPair=getPrivateKey(keystore,alias,password);

PrivateKey privateKey=keyPair.getPrivate();

String encoded=encoder.encode(privateKey.getEncoded());

FileWriter fw=new FileWriter(exportedFile);

fw.write(“—–BEGIN PRIVATE KEY—–\n”);

fw.write(encoded);

fw.write(“\n”);

fw.write(“—–END PRIVATE KEY—–”);

fw.close();

}

public static void main(String args[]) throws Exception{

ExportPrivateKey export=new ExportPrivateKey();

export.keystoreFile=new File(“/Users/Luke/Workspace/StringTest/src/com/lukejin/stringtest/keystore.jks”);

export.keyStoreType=”JKS”;

export.password=”changeit”.toCharArray();

export.alias=”tom_server”;

export.exportedFile=new File(“luke”);

export.export();

}

 

}

 

文章转载互联网

文章版权及转载声明

本文作者:亿网 网址:https://edns.com/ask/post/150373.html 发布于 2025-01-28
文章转载或复制请以超链接形式并注明出处。