jdk处理信任证书
JKS文件是使用keytool生成的keystore文件,存放私钥和证书。但是我们用keytool的时候,私钥并没有单独生成出来。这个不利于我们后期的一些扩展工作。所以,我们需要把私钥从keytool中提取出来。
方案1:
使用OpenSSL工具来完成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格式openssl pkcs12 -in keystore_old.p12 -out keystore_old.pem -passin pass:changeit -passout pass:changeit
3、用记事本打开PEM格式文件,从PEM格式的certificate chain中取出私钥,保存为privateKey.key
4、生成私钥openssl rsa -in privateKey.key -check
私钥将被显示在命令行界面上
方案2:
Keystore是一个密码保护的文件,存放私钥和证书。可以通过JDK自带的keytool工具生成。
但是keytool工具,并没有提供方便的方法,从keystore文件中到处私钥和证书。
所以可以通过JDK提供的java.security.KeyStore 类来编码完成相关工作。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();
}
}
如何将证书导入jdk的cacerts中
一、假设你的jdk 安装在C:/ Program Files / Java / jdk1.8.0_65 这个目录。 在上面的dos 界面上敲下面的命令:keytool -import -v -trustcacerts -alias maven -file d:/ MVAEN.cer -storepass changeit -keystore“C:/ProgramFiles/Java/jdk1.8.0_65/jre/lib/security/cacerts”
解释说明:
(1 ),maven 是可以自己修改的名称,d:/ MVAEN.cer 是导出的证书,同样,这里的证书名字也是随便取的,但前提是保证将C:\ ProgramFiles \ Java \ jdk1.8.0_65 \ JRE \ lib \ security中目录的cacerts的文件内之前没有导入同名证书,就是要保证你将要导入的证书名称唯一性。
(2 ),changeit 是密码,java 默认的。
(3 ),keytool 是jdk 中bin 目录的一个exe 文件,是jdk 默认自带的,在我电脑的目录是:C:\ Program Files \ Java \ jdk1.6.0_24 \ jre \ bin \ keytool.exe
(4 ),如果提示:“ 是否信任此证书?[ 否]:” ,那么请输入“y” 。
当出现:“证书已添加到密钥库中[ 正在存储cacerts] ”的时候,那么恭喜你已经添加成功。
二,keytool 常用命令:// 查看的cacerts 中的证书列表:
keytool -list -keystore“C:/ProgramFiles/Java/jdk1.8.0_65/jre/lib/security/cacerts”-storepass changeit// 删除的cacerts 中指定名称的证书:
keytool -delete -alias maven-keystore“C:/ProgramFiles/Java/jdk1.8.0_65/jre/lib/security/cacerts”-storepass changeit
注意 :以上操作证书的操作,最好是进入到cacerts所在的目录再执行响应的命令