今天遇到一个问题,让我这边提供ssl证书的 pem和key。但是查看了tomcat的配置发现只有一个文件
配置如下
<Connector port="443" protocol=".http11.Http11Protocal"
maxThreads="150" SSLEnabled="true" shceme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
ciphers="XXXXXXXXXX,XXXXXXXXXXX,XXXXXXXXXXX"
keystorePass="123456" minSpareThreads="25" connectionTimeout="300"
keystoreFile="/usr/local/"/>
由此我就需要将 keystore转换成pem。
keystore 不能直接转化为 pem ,要先转成 pfx 再转 pem。
转 pfx
这里用java代码转的,转之前要先创建好接收用的 .pfx文件(新建记事本就可以,把后缀改为.pfx)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Enumeration;
public class test011 {
public static final String PKCS12 = "PKCS12";
public static final String JKS = "JKS";
public static final String PFX_KEYSTORE_FILE = "C:\\new_server.pfx";
public static final String KEYSTORE_PASSWORD = "123456";
public static final String JKS_KEYSTORE_FILE = "C:\\";
/**
* 将keystore转为pfx
*/
public static void coverToPfx() {
try {
KeyStore inputKeyStore = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream(JKS_KEYSTORE_FILE);
char[] nPassword = null;
if ((KEYSTORE_PASSWORD == null)
|| KEYSTORE_PASSWORD.trim().equals("")) {
nPassword = null;
} else {
nPassword = KEYSTORE_PASSWORD.toCharArray();
}
inputKeyStore.load(fis, nPassword);
fis.close();
KeyStore outputKeyStore = KeyStore.getInstance("PKCS12");
outputKeyStore.load(null, KEYSTORE_PASSWORD.toCharArray());
Enumeration enums = inputKeyStore.aliases();
while (enums.hasMoreElements()) { // we are readin just one
// certificate.
String keyAlias = (String) enums.nextElement();
System.out.println("alias=[" + keyAlias + "]");
if (inputKeyStore.isKeyEntry(keyAlias)) {
Key key = inputKeyStore.getKey(keyAlias, nPassword);
Certificate[] certChain = inputKeyStore
.getCertificateChain(keyAlias);
outputKeyStore.setKeyEntry(keyAlias, key,
KEYSTORE_PASSWORD.toCharArray(), certChain);
}
}
FileOutputStream out = new FileOutputStream(PFX_KEYSTORE_FILE);
outputKeyStore.store(out, nPassword);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
coverToPfx();
}
}
2. 从pfx中导出所需要的 pem证书 和 pem[私钥]
转换证书
# -in 后为pfx文件路径 -out后是要导出的pem文件路径,pem文件需要提前创建好
openssl pkcs12 -in C:\ -nokeys -out C:\
转换秘钥
# -in 后为pfx文件路径 -out 后是要导出的pem文件路径,pem文件需要体检创建好
openssl pkcs12 -in C:\ -nocerts -out C:\ -nodes
补充
常见的OpenSSL证书操作
证书操作有四种基本类型。查看,转换,组合和提取。
1. 查看证书
即使PEM编码的证书是ASCII,它们是不可读的。这里有一些命令可以让你以可读的形式输出证书的内容;
1.1 查看pem证书
openssl x509 -in -text -noout openssl x509 -in -text -noout openssl x509 -in -text -noout
1.2 查看DER编码证书
openssl x509 -in -inform der -text -noout
2. 转换证书格式
转换可以将一种类型的编码证书存入另一种。(即PEM到DER转换)
# PEM到DER openssl x509 -in -outform der-out # DER到PEM openssl x509 -in -inform der -outform pem -out
3. 组合证书
在某些情况下,将多个X.509基础设施组合到单个文件中是有利的。一个常见的例子是将私钥和公钥两者结合到相同的证书中。
组合密钥和链的最简单的方法是将每个文件转换为PEM编码的证书,然后将每个文件的内容简单地复制到一个新文件中。这适用于组合文件以在Apache中使用的应用程序。
4. 证书提取
一些证书将以组合形式出现。 一个文件可以包含以下任何一个:证书,私钥,公钥,签名证书,证书颁发机构(CA)和/或权限链。