本篇介绍如何将jks(java key store)证书转换为nginx格式的证书。

因业务需要,现在需要将所有的服务升级为https的方式访问,不管是对外还是内部网络都需要升级,然后负责安全的运维只丢给我一个压缩包,解压开只有以下文件:

1
2
3
4
xxx.jks
xxx.keystore
xxx.p12 # 这个文件不提供也可以
xxx_password.txt

查看jks文件中的entry

1
keytool -list -keystore xxx.jks

输出如下信息:

1
2
3
4
5
6
7
8
输入密钥库口令:
密钥库类型: PKCS12
密钥库提供方: SUN

您的密钥库包含 1 个条目

1, 2022年8月1日, PrivateKeyEntry,
证书指纹 (SHA-256): 21:BC:49:11:72:DD:7C:32:32:37:59:6F:62:38:BB:E8:D5:79:ED:D6:27:DA:D3:06:6F:32:E3:A1:CC:23:2D:AC

其中1, 2022年8月1日, PrivateKeyEntry,这一个就是一个entry的信息,1表示这个entry的别名。

将jks文件导出为Nginx证书所需要的.cert和.key文件

xxx是示例文件名

将jks转换为P12(PKCS12格式的证书库)

1
keytool -importkeystore -srckeystore xxx.jks -srcalias 1 -destkeystore xxx.p12 -deststoretype PKCS12

查看新格式(pkcs12)证书库

1
keytool -deststoretype PKCS12 -keystore xxx.p12 -list

提取证书

1
2
openssl pkcs12 -in xxx.p12 -nokeys -clcerts -out xxx_ssl.crt
openssl pkcs12 -in xxx.p12 -nokeys -cacerts -out xxx_ca.crt

xxx-ssl.crt是SSL证书,xxx_ca.crt是中级证书,俩个合并到一起才是nginx服务器所需要的证书

将这两个证书合并到一起

1
cat xxx-ssl.crt xxx_ca.crt > xxx_ngx.crt

提取私钥

1
openssl pkcs12 -nocerts -nodes -in xxx.p12 -out xxx_ngx.key

配置Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 443 ssl;
server_name www.yourdomain.net;
access_log /your_log_path/access.log;
error_log /your_log_path/error.log;

ssl_certificate /your_ssl_path/ssl/certificate/xxx_ngx.crt;
ssl_certificate_key /your_ssl_path/ssl/key/xxx_ngx.key;


ssl_session_timeout 1m;
ssl_protocols SSLv2 SSLv3 TLSv1.2;

ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256:AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_prefer_server_ciphers on;

***
}