日期 版本 作者 说明
2022-11-15 V-1.0 孔留锋 文档创建。

Keystore和P12证书转crt和key

背景

​ Java前后端分离应用项目部署客户现场,前端采用Nginx做的代理。客户现场提供了东方通内置的ssl文件server.keystore。现需要配置到Nginx里面。

解决

1
2
3
4
5
6
#1.找一台linux 安装openssl (版本OpenSSL 1.1.1d 以上即可)
#上传server.keystore文件到服务器上
#keystore转换为p12文件
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -deststoretype PKCS12
openssl pkcs12 -in server.p12 -nokeys -out server.crt
openssl pkcs12 -in server.p12 -nocerts -nodes -out server.key

Nginx 配置生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
upstream audit_vue {
server 127.0.0.1:8081;
keepalive 2000;
}
server {
listen 80;
server_name localhost;
root /opt/vue/dist;
ssl_certificate cert/server.crt;
ssl_certificate_key cert/server.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

location ~ ^/api/ {
poxy_pass http://audit_vue;
poxy_set_header Host $host:$server_port;
}
location / {
try_files $uri $uri/ @router;
index index.html index.htm;
}
location @router{
rewrite ^.*$/index.html last;
}
}

Openssl

简介

​ Openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。

官网地址

https://www.openssl.org/source/

构成部分

  • 密码算法库
  • 密钥和证书封装管理功能
  • SSL通信API接口

用途

  • 建立 RSA、DH、DSA key 参数
  • 建立 X.509 证书、证书签名请求(CSR)和CRLs(证书回收列表)
  • 计算消息摘要
  • 使用各种 Cipher加密/解密
  • SSL/TLS 客户端以及服务器的测试
  • 处理S/MIME 或者加密邮件

证书生成

RSA密钥命令

1
2
3
4
5
6
7
8
9
#生成RSA私钥(无加密)
openssl genrsa -out rsa_private.key 2048
#根据私钥生成RSA公钥
openssl rsa -in rsa_private.key -pubout -out rsa_public.key

#生成RSA私钥(使用aes256加密)
openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048
#根据私钥生成RSA公钥
openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_public.key

密钥转换命令

1
2
3
4
5
6
7
8
9
10
11
#私钥转非加密
openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private.key
#私钥转加密
openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key
#私钥PEM转DER
openssl rsa -in rsa_private.key -outform der-out rsa_aes_private.der

#查看私钥明细
openssl rsa -in rsa_private.key -noout -text
#私钥PKCS#1转PKCS#8
openssl pkcs8 -topk8 -in rsa_private.key -passout pass:111111 -out pkcs8_private.key

生成自签名证书

1
2
3
4
5
6
7
8
9
10
#生成 RSA 私钥和自签名证书
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt
#注:req是证书请求的子命令,-newkey rsa:2048 -keyout private_key.pem 表示生成私钥(PKCS8格式),-nodes 表示私钥不加密,若不带参数将提示输入密码; -x509表示输出证书,-days365 为有效期,此后根据提示输入证书拥有者信息; 若执行自动输入,可使用-subj选项:
#penssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/emailAddress=imalt.com"

#使用 已有RSA 私钥生成自签名证书
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt
#注: -new 指生成证书请求,加上-x509 表示直接输出证书,-key 指定私钥文件,其余选项与上述命令相同


生成签名请求及CA 签名

1
2
3
4
5
6
7
8
9
10
11
#使用 RSA私钥生成 CSR 签名请求
openssl genrsa -aes256 -passout pass:111111 -out server.key 2048
openssl req -new -key server.key -out server.csr
#注:此后输入密码、server证书信息完成,也可以命令行指定各类参数
#openssl req -new -key server.key -passin pass:111111 -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/emailAddress=imalt.com"

#查看CSR 的细节
cat server.csr

#使用 CA 证书及CA密钥 对请求签发证书进行签发,生成 x509证书
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -passin pass:111111 -CAcreateserial -out server.crt

证书查看及转换

查看证书细节

1
openssl x509 -in cert.crt -noout -text

转换证书编码格式

1
openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem

*合成 pkcs#12 证书(含私钥)

1
2
3
4
5
6
# 将 pem 证书和私钥转 pkcs#12 证书
openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 -out server.p12
#注意 其中-export指导出pkcs#12 证书,-inkey 指定了私钥文件,-passin 为私钥(文件)密码(nodes为无加密),-password 指定 p12文件的密码(导入导出)
# 将 pem 证书和私钥/CA 证书 合成pkcs#12 证书
openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -chain -CAfile ca.crt -password pass:111111 -out server-all.p12
#注:其中-chain指示同时添加证书链,-CAfile 指定了CA证书,导出的p12文件将包含多个证书。(其他选项:-name可用于指定server证书别名;-caname用于指定ca证书别名)

pkcs#12提前

1
2
3
4
5
6
7
8
9
10
11
#pcks#12 提取PEM文件(含私钥)
openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -out out/server.pem
#仅提取私钥
openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -nocerts -out out/key.pem
#仅提取证书(所有证书)
openssl pkcs12 -in server.p12 -password pass:111111 -nokeys -out out/key.pem
#仅提取ca证书
openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -cacerts -out out/cacert.pem
#仅提取server证书
openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -clcerts -out out/cert.pem