目前市场环境下,可获得域名SSL证书的方式有很多,一般有付费和免费划分。对于想免费使用域名SSL证书的朋友,这里收集整理了几个常用的SSL证书申请方式。
对于SSL证书的用处,简单的来说,就是加密数据传输,使得数据更加安全不被篡改。而且如果不给自己的网站配置SSL证书,在浏览器的地址栏上会显示不安全的标志。在做微信公众号开发的时候,想用获取定位,也必须使用HTTPS的方式,才可以使用。可以说SSL证书已经广泛的得到了应用。
一、SSL与TLS简介
-
SSL(Secrue Socket Layer 安全套接层):
SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering Task Force - 互联网工程任务组)标准化后写入(RFCRequest For Comments 请求注释),RFC里包含了很多互联网技术的规范!
起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
-
TLS(Transport Layer Security安全传输层协议)
由于HTTPS的推出受到了很多人的欢迎,在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(Transport Layer Security 安全传输层协议),可以说TLS就是SSL的新版本3.1,并同时发布“RFC2246-TLS加密协议详解”
二、HTTP请求SSL证书认证流程
1、客户端发起一个 HTTPS 请求。
2、服务端把配置好的证书返回给客户端。
3、客户端验证证书:比如是否在有效期内,证书的用途是不是匹配 Client 请求的站点,是不是在 CRL 吊销列表里面,它的上一级证书是否有效等
4、客户端使用伪随机数生成对称密钥,并通过证书里服务器的公钥进行加密。后续使用该对称密钥进行传输信息。
5、服务端使用自己的私钥解密这个消息,得到对称密钥。至此,客户端和服务端都持有了相同的对称密钥。
6、服务端使用对称密钥加密“明文内容 A”,发送给客户端。
7、客户端使用对称密钥解密响应的密文,得到“明文内容 A”。
8、客户端再次发起 HTTPS 的请求,使用对称密钥加密请求的“明文内容 B”,然后服务器使用对称密钥解密密文,得到“明文内容 B”。
以此保持加密通信。
三、SSL证书
1、证书类型
证书类型 | 适用网站类型 | 公信等级 | 认证强度 | 安全性 | 支持的证书品牌 |
---|---|---|---|---|---|
DV域名型 | 个人网站 | 一般 | CA机构审核个人网站真实性、不验证企业真实性 | 一般 | DigiCert、GeoTrust、GlobalSign、 vTrus(国产)、WoSign(国产) |
OV企业型 | 政府组织、企业、教育机构等 | 高 | CA机构审核组织及企业真实性 | 高 | DigiCert)、GeoTrust、 GlobalSign、CFCA(国产)、vTurs |
EV企业增强型 | 大型企业、金融机构等 | 最高 | 严格认证 | 最高 | DigiCert、GeoTrust、CFCA(国产) |
2、主流Web服务软件支持的证书
常见的Web服务软件,通常都基于OpenSSL和Java两种基础密码库。
- Tomcat、Weblogic、JBoss等Web服务软件,一般使用Java提供的密码库。通过Java Development Kit(JDK)工具包中的Keytool工具,生成Java Keystore(JKS)格式的证书文件。
- Apache、Nginx等Web服务软件,一般使用OpenSSL工具提供的密码库,生成PEM、KEY、CRT等格式的证书文件。
- IBM的Web服务产品,如Websphere、IBM Http Server(IHS)等,一般使用IBM产品自带的iKeyman工具,生成KDB格式的证书文件。
- 微软Windows Server中的Internet Information Services(IIS)服务,使用Windows自带的证书库生成PFX格式的证书文件。
3、证书文件格式
文件后缀 | 文件类型 | 说明 |
---|---|---|
.DER或.CER | 二进制格式 | 只含有证书信息,不包含私钥。 |
*.CRT | 二进制格式或文本格式 | 只含有证书信息,不包含私钥。 |
*.PEM | 文本格式 | 一般存放证书或私钥,或同时包含证书和私钥。.PEM文件如果只包含私钥,一般用.KEY文件代替。 |
.PFX或.P12 | 二进制格式 | 同时包含证书和私钥,且一般有密码保护。 |
您也可以使用记事本直接打开证书文件。如果显示的是规则的数字字母,例如:
—–BEGIN CERTIFICATE—–
MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh......
—–END CERTIFICATE—–
那么,该证书文件是文本格式的。
- 如果存在
——BEGIN CERTIFICATE——
,则说明这是一个证书文件。 - 如果存在
—–BEGIN RSA PRIVATE KEY—–
,则说明这是一个私钥文件。
四、数字证书
1、数字证书的标准
- **X.509版本号:**指出该证书使用了哪种版本的X.509标准,版本号会影响证书中的一些特定信息
序列号:由CA给予每一个证书分配的唯一的数字型编号,当证书被取消时,实际上是将此证书序列号放入由CA签发的CRL(Certificate Revocation List证书作废表,或证书黑名单表)中。这也是序列号唯一的原因 - **签名算法标识符:**用来指定CA签署证书时所使用的签名算法,常见算法如RSA
- **签发者信息:**颁发证书的实体的 X.500 名称信息。它通常为一个 CA
- **证书的有效期:**证书起始日期和时间以及终止日期和时间;指明证书在这两个时间内有效。
- **主题信息:**证书持有人唯一的标识,在 Internet上应该是唯一的
- **发布者的数字签名:**这是使用发布者私钥生成的签名,以确保这个证书在发放之后没有被撰改过。
- **证书的公钥:**包括证书的公钥、算法(指明密钥属于哪种密码系统)的标识符和其他相关的密钥参数
2、数字证书的常见格式
-
.CSR(certificate signing request)文件:证书请求文件,这个并不是证书,而是向证书颁发机构获得签名证书的申请文件。含有公钥信息。生成该文件时需要用到自己的私钥。
-
CER:存放证书文件可以是二进制编码或者BASE64编码
-
CRT:证书可以是DER编码,也可以是PEM编码,在linux系统中比较常见
-
pem:该编码格式在RFC1421中定义,但他也同样广泛运用于密钥管理,实质上是 Base64 编码的二进制内容
PEM 是明文格式的, 以 “
-----BEGIN CERTIFICATE-----
开头,已-----END CERTIFICATE-----
结尾”, 中间是经过 base64 编码的内容, Apache 和 NGINX 服务器偏向于使用这种编码格式,也是 openssl 默认采用的信息存放方式。PEM 其实就是把 DER 的内容进行了一次 base64 编码。 -
DER:用于二进制DER编码的证书。这些证书也可以用CER或者CRT作为扩展名
-
JKS:java的密钥存储文件,二进制格式,是一种 Java 特定的密钥文件格式, JKS的密钥库和私钥可以用不同的密码进行保护
-
p12/PFX:包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件,在windows中可以直接导入到密钥区,密钥库和私钥用相同密码进行保护
3、证数参数含义
- C:国家(Country Name)
- ST: 省份(State or Province Name)
- L: 城市(Locality Name)
- O: 公司(Organization Name)
- OU: 部门(Organizational Unit Name)
- CN: 产品名(Common Name)
- emailAddress: 邮箱(Email Address)
- **req_distinguished_name :**根据情况进行修改
- alt_names: 127.0.0.1修改为服务器实际的IP或DNS地址,例如:IP.1=127.0.0.1或DNS.1 =broker.xxx.com
五、OpenSSL
-
OpenSSL是TLS/SSL协议的开源实现,提供开发库和命令行程序;
-
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
1、对称加密
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
选项 | 说明 |
---|---|
-in filename | 输入文件 |
-out filename | 输出文件 |
-salt | 自动插入一个随机数作为文件内容加密,默认选项 |
-e | 可以指明一种加密算法,若不指的话将使用默认加密算法 |
-d | 解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致 |
-a/-base64 | 使用-base64位编码格式 |
应用示例
# 原始文本
echo "1234567890abc" > plain.txt
# 加密文本
openssl enc -aes-128-cbc -pbkdf2 -in plain.txt -out encrypt.txt
# 解密文本
openssl aes-128-cbc -d -pbkdf2 -in encrypt.txt -out encrypt_decrypt.txt
2、常规操作
1、生成私钥
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [numbits]
选项 | 说明 |
---|---|
-out filename | 将生成的私钥保存至filename文件,若未指定输出文件,则为标准输出 |
-numbits | 指定要生成的私钥的长度,默认为1024。该项必须为命令行的最后一项参数 |
-des/-des3/-idea | 指定加密私钥文件用的算法,这样每次使用私钥文件都将输入密码,太麻烦所以很少使用 |
-passout args | 加密私钥文件时,传递密码的格式,如果要加密私钥文件时单未指定该项,则提示输入密码。传递密码的args的格式见一下格式 |
pass:password | password表示传递的明文密码 |
env:var | 从环境变量var获取密码值 |
file:filename | filename文件中的第一行为要传递的密码。若filename同时传递给"-passin"和"-passout"选项,则filename的第一行为"-passin"的值,第二行为"-passout"的值 |
stdin | 从标准输入中获取要传递的密码 |
应用示例
openssl genrsa -out private.key 2048
2、私钥生成公钥
公钥提取自私钥
openssl rsa -pubout -in private.key -out public.key
3、公钥加密
openssl rsautl -encrypt -inkey public.key -pubin -in msg.txt -out rsa_msg.txt
4、私钥解密
openssl rsautl -decrypt -inkey private.key -in rsa_msg.txt -out dersa_msg.txt
5、数字签名: 私钥加密公钥解密
如果是用私钥进行加密,公钥解密叫做数字签名,因为私钥只有一份,用公钥解密出来验证确认是你用这个私钥做的签名,这就是签名和验证。
openssl dgst -sign private.key -sha256 -out sign.msg.txt msg.txt
公钥验证签名,需要对比源文件验证:
openssl dgst -verify public.key -sha256 -signature sign.msg.txt msg.txt
6、查看证书内容
# 查看证书内容
openssl x509 -noout -text -in server.crt
# 查看证书的过期时间
openssl x509 -in ca.crt -noout -dates
# 查看证书的subject和颁发者
openssl x509 -in server.crt -subject -issuer -noout
7、去除key文件密码
openssl rsa -in server.key -out server.key
3、自建CA签名证书
自签名证书分为
- 自签名私有证书(无法被吊销)
- 自签名CA证书(可以被吊销)
1、生成CA根证书
生成CA私钥(.key)--> 生成CA证书请求(.csr)--> 自签名得到根证书(.crt)
-
生成CA认证机构的证书密钥key:
openssl genrsa -des3 -out ca.key 4096
-
用私钥ca.key生成CA认证机构的证书ca.crt
openssl req -x509 -new -nodes -sha256 \ -key ca.key \ -days 36500 \ -subj "/C=CN/ST=Shanghai/L=Shanghai/O=Curiouser/OU=devops/CN=test.curiouser.com/CN=localhost/CN=127.0.0.1" \ -out ca.crt
-
查看证书内容:
openssl x509 -in ca.crt -noout -text
2、用自签根证书给用户证书签名
生成私钥(.key)--> 生成证书请求(.csr)--> 用CA根证书签名得到证书(.crt)
# 生成网站的密钥server.key
openssl genrsa -des3 -out server.key 4096
# 生成网站证书的请求文件server.csr
openssl req -new \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=Curiouser/OU=devops/CN=test.curiouser.com/CN=localhost/CN=127.0.0.1" \
-key server.key \
-out server.csr
cert.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
IP.2 = 127.0.0.1
DNS.3 = test.curiouser.com
# 使用虚拟的CA认证机构的证书ca.crt,来对自己网站的证书请求文件server.csr进行处理,生成签名后的证书server.crt
openssl x509 -req \
-CAcreateserial \
-CA ca.crt \
-CAkey ca.key \
-CAserial serial \
-extfile cert.ext \
-in server.csr \
-out server.crt \
-days 3650
使用CA验证一下证书是否通过
openssl verify -CAfile ca.crt server.crt
# server.crt: OK
六、Let’s Encrypt
Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。
Let's Encrypt由互联网安全研究小组(缩写ISRG)提供服务。主要赞助商包括电子前哨基金会、Mozilla基金会、Akamai以及思科。2015年4月9日,ISRG与Linux基金会宣布合作。
用以实现新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。GitHub上有这一规范的草案,且提案的一个版本已作为一个Internet草案发布。
Let's Encrypt宣称这一过程将十分简单、自动化并且免费
七、使用 acme.sh 部署通配符证书申请与分发服务
简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。
acme.sh 有以下特点:
- 一个纯粹用Shell(Unix shell)语言编写的ACME协议客户端。
- 完整的ACME协议实施。 支持ACME v1和ACME v2 支持ACME v2通配符证书
- 简单,功能强大且易于使用。你只需要3分钟就可以学习它。
- Let's Encrypt免费证书客户端最简单的shell脚本。
- 纯粹用Shell编写,不依赖于python或官方的Let's Encrypt客户端。
- 只需一个脚本即可自动颁发,续订和安装证书。 不需要root/sudoer访问权限。
- 支持在Docker内使用,支持IPv6
Github:https://github.com/acmesh-official/acme.sh
1、安装基础环境
yum -y install openssl crontabs socat curl
yum -y update ca-certificates
systemctl enable crond
systemctl start crond
2、创建工作目录
mkdir -p /data/acme
3、安装 acme.sh 脚本
curl https://get.acme.sh | sh -s email=my@example.com
1、申请阿里云key和Secret
2、定义临时变量
vim ~/.bashrc
export Ali_Key="阿里云key"
export Ali_Secret="阿里云Secret"
# example.com 修改成你的域名
export DOMAIN="example.com"
# 保存退出,并使环境变量生效
source ~/.bashrc
4、申请与移动证书
对比项目 | ECC 加密算法 | RSA 加密算法 |
---|---|---|
密钥长度 | 256位 | 2048位 |
CPU占用 | 较少 | 较高 |
内存占用 | 较少 | 较高 |
网络消耗 | 较低 | 较高 |
加密效率 | 较高 | 一般 |
破解难度 | 具有数学特性,破解难度大 | 难破解,但相对ECC理论上容易一些 |
抗攻击性 | 强 | 一般 |
可扩展性 | 强(密钥长度较短,具有更好的扩展空间) | 一般 |
兼容范围 | 新版浏览器和操作系统均支持,但存在少数不支持的平台,例如cPanel | 广泛支持 |
1、RSA 证书
1、签发证书
mkdir -p /data/acme/${DOMAIN}
acme.sh --issue --dns dns_ali -d ${DOMAIN} -d *.${DOMAIN}
2、移动证书
acme.sh --install-cert -d ${DOMAIN} \
--cert-file /data/acme/${DOMAIN}/cert.pem \
--key-file /data/acme/${DOMAIN}/key.pem \
--fullchain-file /data/acme/${DOMAIN}/fullchain.pem \
--reloadcmd "echo \$(date -d \"\$current\" +%s) > /data/acme/${DOMAIN}/time.log"
2、ECC 证书
有效值为:
- ec-256(prime256v1,“ECDSA P-256”)
- ec-384(secp384r1,“ECDSA P-384”)
- ec-521(secp521r1,“ECDSA P-521”,Let's Encrypt 尚不支持。)
1、签发证书
mkdir -p /data/acme/${DOMAIN}_ecc
acme.sh --issue --dns dns_ali -d ${DOMAIN} -d *.${DOMAIN} --keylength ec-256
2、移动证书
acme.sh --install-cert --ecc -d ${DOMAIN} \
--cert-file /data/acme/${DOMAIN}_ecc/cert.pem \
--key-file /data/acme/${DOMAIN}_ecc/key.pem \
--fullchain-file /data/acme/${DOMAIN}_ecc/fullchain.pem \
--reloadcmd "echo \$(date -d \"\$current\" +%s) > /data/acme/${DOMAIN}_ecc/time.log"
5、部署证书分发服务端
1、下载 acmeDeliver
curl -sLo /data/acme/acmeDeliver https://mirror.ghproxy.com/https://github.com/julydate/acmeDeliver/releases/download/v1.1/acmeDeliver_1.1_Linux_x86_64
chmod +x /data/acme/acmeDeliver
2、运行 acmeDeliver
-p
指定服务端口,-d
指定了前文提到的工作目录-k
指定的密码需要自己生成,一般推荐26到34位,大小写字母+数字格式
nohup /data/acme/acmeDeliver -p 5000 -d "/data/acme/" -k 密码 > /data/acme/acmeDeliver.log 2>&1 &
3、添加系统服务
cat > /etc/systemd/system/acmeDeliver.service << EOF
[Unit]
Description=acmeDeliver
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
DynamicUser=true
ExecStart=/data/acme/acmeDeliver -p 5000 -d "/data/acme/" -k 密码 > /data/acme/acmeDeliver.log 2>&1 &
[Install]
WantedBy=multi-user.target
EOF
systemctl enable --now acmeDeliver
6、使用证书分发客户端
1、下载客户端
curl -sLo /root/acmeDeliverClient.sh https://mirror.ghproxy.com/https://raw.githubusercontent.com/julydate/acmeDeliver/client/client.sh
chmod +x /root/acmeDeliverClient.sh
2、使用客户端部署证书
更改客户端的工作目录,其实也就是你的证书需要存放的目录,默认是放在 tmp 目录的,将 \/home\/acme/
改为你要存放的目录即可
sed -i 's|\/tmp\/acme|\/data\/acme/|g' /root/acmeDeliverClient.sh
/root/acmeDeliverClient.sh -d "example.com" -p "密码" -s "http://IP:5000" -c "0"
3、设置客户端定时同步
0 0 * * * /root/acmeDeliverClient.sh -d "example.com" -p "密码" -s "http://IP:5000" -c "0" > /dev/null 2>&1 &
八、Certbot
1、部署基础环境
yum install epel-release -y
yum -y install snapd
systemctl enable --now snapd.socket
systemctl start snapd.socket
ln -s /var/lib/snapd/snap /snap
snap install core; sudo snap refresh core
ln -s /var/lib/snapd/snap /snap
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
2、申请证书
这里我们使用Nginx为例
certbot --nginx(自动配置)
certbot certonly --nginx(手动配置)
certbot certonly --nginx --nginx-server-root=/usr/local/nginx/conf # 指定配置文件
鉴于部分运维同学是自编译安装的Nginx,安装路径通常和官方路径不同,会导致自动配置申请证书时无法找到Nginx配置文件,这里我建议添加Nginx的软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
ln -s /usr/local/nginx/conf/ /etc/nginx
重启Nginx
nginx -s quit
nginx -c /usr/local/nginx/conf/nginx.conf
设置自动续期
SLEEPTIME=$(awk 'BEGIN{srand(); print int(rand()*(3600+1))}'); echo "0 0,12 * * * root sleep $SLEEPTIME && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
九、CFSSL
CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
CFSSL包括:
- 一组用于生成自定义 TLS PKI 的工具
cfssl
程序,是CFSSL的命令行工具multirootca
程序是可以使用多个签名密钥的证书颁发机构服务器mkbundle
程序用于构建证书池cfssljson
程序,从cfssl
和multirootca
程序获取JSON输出,并将证书,密钥,CSR和bundle写入磁盘
PKI借助数字证书和公钥加密技术提供可信任的网络身份。通常,证书就是一个包含如下身份信息的文件:
- 证书所有组织的信息
- 公钥
- 证书颁发组织的信息
- 证书颁发组织授予的权限,如证书有效期、适用的主机名、用途等
- 使用证书颁发组织私钥创建的数字签名
需要安裝CFSSL
工具,这将会用來建立 TLS Certificates
Github: https://github.com/cloudflare/cfssl
下载地址: https://pkg.cfssl.org/
export CFSSL_URL="https://pkg.cfssl.org/R1.2"
wget "${CFSSL_URL}/cfssl_linux-amd64" -O /usr/local/bin/cfssl
wget "${CFSSL_URL}/cfssljson_linux-amd64" -O /usr/local/bin/cfssljson
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson
十、easy-rsa
1、安装
yum install easy-rsa
docker run -it --rm cmd.cat/easyrsa easyrsa --help
2、命令
- 初始化pki:
easyrsa init-pki
- 创建CA:
easyrsa build-ca
- 生成服务器证书请求:
easyrsa gen-req server nopass
十一、证书格式转换
以下证书格式之间是可以互相转换的。
1、将JKS格式证书转换成PFX格式
使用JDK中自带的Keytool工具,将JKS格式证书文件转换成PFX格式。例如将 server.jks证书文件转换成 server.pfx证书文件:
keytool -importkeystore -srckeystore D:\server.jks -destkeystore D:\server.pfx
-srcstoretype JKS -deststoretype PKCS12
2、将PFX格式证书转换为JKS格式
使用JDK中自带的Keytool工具,将PFX格式证书文件转换成JKS格式。例如将 server.pfx证书文件转换成 server.jks证书文件:
keytool -importkeystore -srckeystore D:\server.pfx -destkeystore D:\server.jks
-srcstoretype PKCS12 -deststoretype JKS
3、将PEM/KEY/CRT格式证书转换为PFX格式
使用 OpenSSL工具,将KEY格式密钥文件和CRT格式公钥文件转换成PFX格式证书文件。例如,将您的KEY格式密钥文件(server.key)和CRT格式公钥文件(server.crt)拷贝至OpenSSL工具安装目录,使用OpenSSL工具执行以下命令将证书转换成 server.pfx证书文件:
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
4、将PFX转换为PEM/KEY/CRT
使用 OpenSSL工具,将PFX格式证书文件转化为KEY格式密钥文件和CRT格式公钥文件。例如,将您的PFX格式证书文件拷贝至OpenSSL安装目录,使用OpenSSL工具执行以下命令将证书转换成server.pem证书文件KEY格式密钥文件(server.key)和CRT格式公钥文件(server.crt):
openssl pkcs12 -in server.pfx -nodes -out server.pem
openssl rsa -in server.pem -out server.key
openssl x509 -in server.pem -out server.crt
说明 此转换步骤是专用于通过Keytool工具生成私钥和CSR申请证书文件的,并且通过此方法您可以在获取到PEM格式证书公钥的情况下分离私钥。在您实际部署数字证书时,请使用通过此转换步骤分离出来的私钥和您申请得到的公钥证书匹配进行部署。
5、其他转换
-
PEM 转为 DER:
openssl x509 -in cacert.crt -outform der -out cacert.der
-
DER 转为 PEM:
openssl x509 -in cert.crt -inform der -outform pem -out cacert.pem
-
CER 转化为 PEM:
openssl x509 -in <cert_name>.cer -out <cert_name>.pem -outform PEM
-
将x509转换为PEM:
openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem
-
PKCS7转换为PEM:
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
-
PEM转换为P7B:
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
-
pfx转换为PEM:
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
-
PFX to PKCS#8:
- PFX to PEM:
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem
- PEM to PKCS8:
openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
- PFX to PEM:
-
P7B to PFX:
PKCS#7或P7B格式以Base64 ASCII格式存储,文件扩展名为.p7b或.p7c。一个P7B文件只包含证书和连锁证书(中间CA),不包含私钥。支持P7B文件的最常见的平台是Microsoft Windows和Java Tomcat。
- P7B to CER :
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer
- CER and Private Key to PFX:
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer
- P7B to CER :
十、其他操作
1、openssl命令行获取服务器SSL证书
openssl s_client -showcerts -connect {HOSTNAME}:{PORT} </dev/null 2>/dev/null|openssl x509 -outform PEM > www.test.com.ssl.pem
openssl s_client -connect {HOSTNAME}:{PORT} -showcerts
评论区