利用 OpenSSL 生成根证书(RootCA),并通过根证书签发新证书(版本3)。
环境准备
- OS: CentOS7
数字证书中主题(Subject)字段
公用名称 (Common Name) 简称:CN 字段,SSL证书一般为网站域名或IP地址;代码签名证书则为申请单位名称;客户端证书则为证书申请者的姓名;
单位名称 (Organization Name)简称:O 字段,SSL证书一般为网站域名;代码签名证书则为申请单位名称;客户端证书则为证书申请者所在单位名称;
证书申请单位所在地:
所在城市 (Locality) 简称:L 字段
所在省份 (State/Provice) 简称:S 字段
所在国家 (Country) 简称:C 字段,只能是国家字母缩写,如中国:CN
其他一些字段:
电子邮件 (Email) 简称:E 字段
多个姓名字段 简称:G 字段
介绍:Description 字段
电话号码:Phone 字段,格式要求 + 国家区号 城市区号 电话号码,如: +86 732 88888888
地址:STREET 字段
邮政编码:PostalCode 字段
显示其他内容 简称:OU 字段
生成简单证书
# 网站生成CSR
https://www.chinassl.net/ssltools/generator-csr.html
# csr和key下载之后生成证书
openssl x509 -trustout -req -days 365 -in halaz.cn.csr -signkey halaz.cn.key -out halaz.cn.crt
生成 RootCA
创建 root.cnf 文件,用于保存根证书的相关信息。
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[ req_distinguished_name ]
O = K.ORG
OU = https://your-domain.com/
CN = Personal Root Certification Authority
[ v3_req ]
# Extensions to add to a certificate request
keyUsage = critical, keyCertSign, cRLSign
subjectKeyIdentifier = hash
basicConstraints = critical, CA:TRUE
执行以下命令,通过 root.cnf 文件生成根证书。
# 生成私钥(RSA/ECC)
openssl genrsa -out root.key 2048
openssl ecparam -out root.key -name secp384r1 -genkey
# 生成证书请求文件
openssl req -new -key root.key -out root.csr -config root.cnf
# 生成证书
openssl x509 -req -extfile root.cnf -extensions v3_req -in root.csr -signkey root.key -out root.crt -days 3653
# 查看证书详情(过期时间、域名、颁发者等)
openssl x509 -in /etc/letsencrypt/live/your-domain.com/fullchain.pem -text -noout
# 快速查看域名和过期时间
openssl x509 -in /etc/letsencrypt/live/your-domain.com/fullchain.pem -noout -dates -subject
# 远程检查(不需要本地证书)
openssl s_client -connect your-domain.com:443 </dev/null 2>/dev/null | openssl x509 -noout -dates -subject
# 查看证书链
openssl s_client -connect your-domain.com:443 -showcerts </dev/null 2>/dev/null
签发新证书
创建 cert.cnf 文件,用于保存待签发的证书信息。
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[ req_distinguished_name ]
# 签发通用域名证书
CN = *.halaz.cn
[ v3_req ]
# Extensions to add to a certificate request
authorityKeyIdentifier = keyid
subjectKeyIdentifier = hash
subjectAltName = @alternate_names
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
basicConstraints = CA:FALSE
[ alternate_names ]
# 非域名可以不设置subjectAltName
# 通用域名证书需要设置两个 DNS 信息
# 如果签发单个域名的话,就只需要一个具体的域名信息
DNS.1 = *.halaz.cn
DNS.2 = halaz.cn
执行以下命令,通过 cert.cnf 文件生成根证书。
# 生成私钥(ECC/RSA)
openssl genrsa -out cert.key 2048
openssl ecparam -out cert.key -name secp384r1 -genkey
# 生成请求文件(私钥)
openssl req -new -key cert.key -out cert.csr -config cert.cnf
# 私钥生成公钥
openssl rsa -in cert.key -pubout -outform PEM -out cert.pem
# 使用根证书为域名证书签名
openssl x509 -req -extfile cert.cnf -extensions v3_req -in cert.csr -CA root.crt -CAkey root.key -CAcreateserial -out cert.crt -days 730
证书格式转换
#pem转crt格式
openssl x509 -in cert.pem -out cert.crt
#pem转key格式
openssl rsa -in privkey.pem -out privkey.key
#pkcs12证书
openssl pkcs12 -export -clcerts -in cert.crt -inkey cert.key -out cert.p12
#校验密码
openssl pkcs12 -info -in cert.p12 -nodes
#导出证书
openssl pkcs12 -in cert.p12 -out cert.pem -nokeys
#导出秘钥
openssl pkcs12 -in cert.p12 -out cert.pem -nodes -nocerts
服务器安装信任证书
Centos7安装根证书
# 将证书复制到/etc/pki/ca-trust/source/anchors/文件夹
cp /root/.mitmproxy/mitmproxy-ca-cert.cer /etc/pki/ca-trust/source/anchors/
# 将证书软链接至/etc/ssl/certs/文件夹
ln -s /etc/pki/ca-trust/source/anchors/mitmproxy-ca-cert.cer /etc/ssl/certs/mitmproxy-ca-cert.cer
# 更新系统的证书
update-ca-trust
Ubuntu安装根证书
# 复制证书到/usr/local/share/ca-certificates/
sudo cp ca.crt /usr/local/share/ca-certificates/mitmproxy-ca-cert.cer
# 然后执行 update-ca-certificates
sudo update-ca-certificates