OpenSSL 系列2 --- 应用
一、概要
1. 承上启下
2. 环境
(1) CentOS 7.9 2009
(2) OpenSSL 3.0.7
二、CA (Certificate Authority)
它可以生成私钥和CSR,签发、吊销数字证书等。
1. 搭建
(1) 创建工作目录
cd /etc/pki/CA
sudo mkdir -p certs newcerts private public crl
sudo chmod -R 755 /etc/pki/CA
(2) 创建index.txt
sudo touch index.txt
(3) 创建serial
su echo 01 > serial
(4) 生成CA私钥
CA私钥用于签发CA证书。
sudo openssl genrsa -out /etc/pki/CA/cakey.pem 4096
(5) 生成CA证书
CA证书可用于签发应用(比如网站、LDAP)的证书,有效期365天。
sudo openssl req -new -x509 -days 365 -key /etc/pki/CA/cakey.pem -out /etc/pki/CA/cacert.pem
运行之后目录内容如下:
a. cakey.pem为CA的密钥;
b. cacert.pem为CA证书;
c. certs目录用于存放CA签发的证书;
d. newcerts目录用于存放CA更新签发的证书;
e. private目录用于存放私钥。
2. 密钥对
不同于数字证书,密钥并没有强制过期的限制
(1) 生成
sudo openssl genrsa -out key.pem 4096
这里,key.pem文件其实同时包含私钥和公钥。
(2) 导出公钥
sudo openssl rsa -in key.pem -pubout -out public.key
3. 同时生成密钥和自签名证书
sudo openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem
默认情况下,证书有效期为30天。如果想指定有效期则:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem
三、证书
1. CSR (Certificate Signing request)
(1) 概念
CSR即证书签名申请(Certificate Signing Request),获取 SSL 证书,需要先生成 CSR 文件并提交给证书颁发机构(CA)。
CSR包含用于签发证书的公钥,用户辨识的名称信息,用于保护信息真实性和完整性的数字签名等。
(2) 在创建CSR过程中,需要提供以下信息:
a. 国家或地区代码,以国际标准化组织(ISO)的两字母格式表示,中国为CN;
b. 洲、省、自治区或市,比如Beijing;
c. 城市或地区,比如Haidian;
d. 组织机构,比如公司名称或者机构名称;
e. 申请部门,比如IT Support;
f. 通用名称(Common Name),需要填写申请该CSR的完全限定名(FQDN),比如mail.example.com, www.example.com等。
作为一种实践,我推荐针对每一个域名设置一个独立的CSR,并定期更新。
(3) 生成CSR
openssl req -new -key private/key.pem -out private/[domain].csr
2. 使用CSR生成证书
openssl ca -keyfile private/cakey.pem -cert cacert.pem -in private/[domain].csr -out certs/[domain].crt.pem -keyform PEM -days 365
-keyfile: 为CA的密钥,缺省则读取配置文件中的值;
-cert: 为CA的证书,缺省则读取配置文件中的值;
-keyform: 证书格式,默认为PEM。
3. 校验证书
openssl verify -CAfile cacert.pem certs/[domain].crt.pem
这里如果没问题,则会输出:
certs/[domain].crt.pem: OK
4. 撤销证书
当证书生成之后,会在CA目录下的index.txt中保存相应的档案,并在newcerts目录下保存新生成的证书的副本。
如果希望撤销证书,首先需要读取index.txt获取相关证书的index number。
(1) 读取index.txt
cat /etc/pki/CA/index.txt
图中,01和02就是证书的index number
(2) 撤销证书
openssl ca -revoke /etc/pki/CA/newcerts/<index number>.pem
5. dhparam
openssl dhparam -out dhparam.pem 2048
6. 证书转换
pem格式的证书是一种文本格式,其包含了加密证书和私钥等信息。而crt格式的证书则是一种二进制格式,其包含了用户公共密钥、证书有效期、用途等信息。
(1) pem转crt
sudo openssl x509 -outform der -in cert.pem -out cert.crt
(2) pem转私钥
sudo openssl rsa -in cert.pem -out private.key
注意:这里的"cert.pem"是生成CSR时-key参数,这是一个pem类型的密钥。
(3) 校验
sudo openssl rsa -noout -modulus -in private.key | openssl md5 sudo openssl x509 -noout -modulus -in cert.crt | openssl md5
比较两个命令输出的MD5值是否一致,如果一致则为有效证书和私钥,否则无效。
7. Keystore
(1) 创建pkcs12格式的keystore
sudo openssl pkcs12 -export -in [证书] -inkey [私钥] -name [名称] -out server.p12
例:
sudo openssl pkcs12 -export -in fullchain.pem -inkey private.pem -name 'tomcat' -out server.p12
需要输入导出密码,请记住该密码。
命令成功后会在当前目录下生成server.p12文件。
(2) PKCS12 转 JKS
keytool -importkeystore -srcstoretype PKCS12 -srcstorepass <PKCS12证书密码> -srckeystore <PKCS12证书> -deststoretype JKS -deststorepass <Keystore密码> -destkeypass <Keystore密码> -destkeystore keystore.jks -alias <域名>
成功执行后会在当前目录下生成keystore.jks。
同时,执行成功后会有如下提示,建议转成工业标准格式PKCS12:
(3) 将JKS格式转成PKCS12格式:
sudo keytool -importkeystore -srckeystore keystore.jks -deststoretype pkcs12 -destkeystore keystore.p12
成功后会将原JKS格式的keystore备份成keystore.old,然后替换keystore为PKCS12格式的内容:
四、参考
1. 官方
(1) openssl req
https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html
(2) openssl genrsa
https://www.openssl.org/docs/man1.0.2/man1/genrsa.html
(3) openssl ca
https://www.openssl.org/docs/man1.1.1/man1/openssl-ca.html
(4) openssl verify
https://www.openssl.org/docs/man1.1.1/man1/openssl-verify.html
(5) openssl dhparam
https://www.openssl.org/docs/man1.1.1/man1/openssl-dhparam.html
(6) openssl PKCS12
https://www.openssl.org/docs/man1.1.1/man1/openssl-pkcs12.html
2. 其他
https://blog.51cto.com/u_11555417/5927850
https://www.python100.com/html/120611.html
https://www.golinuxcloud.com/configure-openldap-with-tls-certificates/
https://www.digicert.com/kb/ssl-support/openssl-quick-reference-guide.htm
https://www.sslshopper.com/article-most-common-openssl-commands.html
https://www.ibm.com/docs/en/zvse/6.2?topic=SSB27H_6.2.0/fa2ti_openssl_generate_dh_parms.htm
(2) Keystore