當前環境
OpenSSL 3.5.1 1 Jul 2025 (Library: OpenSSL 3.5.1 1 Jul 2025)
GmSSL 3.1.2 Dev
本地gmssl命令
#生成證書公私鑰對
gmssl sm2keygen -pass 1234 -out sm2.key -pubout sm2pub.pem
#使用certgen命令生成自簽名證書cert.crt
gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN Alice -days 365 -key sm2.pem -pass 1234 -key_usage "digitalSignature" -key_usage "keyCertSign" -key_usage cRLSign -out cert.crt#計算HMAC-SM3
echo -n abc | gmssl sm3hmac -key 11223344556677881122334455667788#解析數字證書
gmssl certparse -in cert.crt
證書鏈
一、根CA自簽發證書
#首先生成CA根證書私鑰rootcakey.pem,然后進行自簽名,生成根證書rootcacert.pem
gmssl sm2keygen -pass 1234 -out rootcakey.pem
gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN ROOTCA -days 3650 -key rootcakey.pem -pass 1234 -out rootcacert.pem -key_usage keyCertSign -key_usage cRLSign
#查看生成的自簽名證書rootcacert.pem
gmssl certparse -in rootcacert.pem或者=======================================================================#首先生成CA根證書私鑰rootcakey.key,然后進行自簽名,生成根證書rootcacert.crt
gmssl sm2keygen -pass 1234 -out rootcakey.key
gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN ROOTCA -days 3650 -key rootcakey.key -pass 1234 -out rootcacert.crt -key_usage keyCertSign -key_usage cRLSign
#查看生成的自簽名證書rootcacert.crt
gmssl certparse -in rootcacert.crt
二、根CA簽發二級CA證書
#首先生成二級CA的證書私鑰,然后生成證書請求careq.pem,然后由根CA進行簽名,生成二級CA的證書cacert.pem
gmssl sm2keygen -pass 1234 -out cakey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN "Sub CA" -key cakey.pem -pass 1234 -out careq.pem
#注意 上面哪行會出現reqgen: illegal option '-days'報錯 這里我會去掉這個參數
gmssl reqsign -in careq.pem -days 365 -key_usage keyCertSign -path_len_constraint 0 -cacert rootcacert.pem -key rootcakey.pem -pass 1234 -out cacert.pem或者=======================================================================#首先生成二級CA的證書私鑰,然后生成證書請求careq.csr,然后由根CA進行簽名,生成二級CA的證書cacert.pem
gmssl sm2keygen -pass 1234 -out cakey.key
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN "Sub CA" -key cakey.key -pass 1234 -out careq.csr
#注意 上面哪行會出現reqgen: illegal option '-days'報錯 這里我會去掉這個參數
gmssl reqsign -in careq.csr -days 365 -key_usage keyCertSign -path_len_constraint 0 -cacert rootcacert.crt -key rootcakey.key -pass 1234 -out cacert.crt
三、二級CA簽發用戶證書
#首先生成用戶私鑰,并通過用戶私鑰生成證書請求encreq.pem,然后由二級CA進行簽發,生成用戶證書enccert.pem
gmssl sm2keygen -pass 1234 -out enckey.pem
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -key enckey.pem -pass 1234 -out encreq.pem
gmssl reqsign -in encreq.pem -days 365 -key_usage keyEncipherment -cacert cacert.pem -key cakey.pem -pass 1234 -out enccert.pem
#查看生成的用戶證書enccert.pem
gmssl certparse -in enccert.pem
#將二級CA的證書和用戶證書放在一個文件中,形成完整的用戶證書文件certs.pem
cat enccert.pem > certs.pem
cat cacert.pem >> certs.pem或者====================================================#首先生成用戶私鑰,并通過用戶私鑰生成證書請求encreq.csr,然后由二級CA進行簽發,生成用戶證書enccert.pem
gmssl sm2keygen -pass 1234 -out enckey.key
gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -key enckey.key -pass 1234 -out encreq.csr
gmssl reqsign -in encreq.csr -days 365 -key_usage keyEncipherment -cacert cacert.crt -key cakey.csr -pass 1234 -out enccert.crt
#查看生成的用戶證書enccert.pem
gmssl certparse -in enccert.pem
#將二級CA的證書和用戶證書放在一個文件中,形成完整的用戶證書文件certs.pem
cat enccert.pem > certs.pem
cat cacert.pem >> certs.pem
openssl生成證書
1、使用 genpkey方式
#生成RSA密鑰對文件(其中包含公鑰和私鑰)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.pem
#查看生成密鑰文件
openssl pkey -in private.pem -text -noout -check
openssl rsa -in private.pem -text -noout
#從密鑰中提取出公鑰信息 (注意:不需要特意來提取公鑰文件,一般在生成csr文件或執行其它需要公鑰命令時openssl會自動提取公鑰信息)
openssl pkey -in private.pem -pubout -out public.pem
#查看公鑰內容
openssl rsa -pubin -in public.pem -text -noout
2、使用genrsa方式
#生成密鑰對 .key
openssl genrsa -out ca.key 2048#提取公鑰信息
openssl rsa -in ca.key -pubout -out public.key#生成請求文件 ca.csr
openssl req -new -key ca.key -out ca.csr
或
#通過配置文件cert.conf(下面有文件內容)來創建.csr文件
openssl req -new -key ca.key -out ca.csr -config cert.conf#查看請求.csr文件 noout后加-verify 代表驗證csr文件
openssl req -in cert.csr -text -noout#生成證書ca.crt
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
===========================================================================================================
#一下生成密鑰key和對應的請求文件csr
openssl req -new -newkey rsa:2048 -keyout cert-key.pem -nodes -out cert.csr -subj "/C=CN/ST=Zhe Jiang/L=Hang Zhou/O=GUAN Technologies Inc./OU=IT/CN=guan-example.com/emailAddress=guan@email.com"#生成crt證書文件
openssl x509 -req -days 365 -in cert.csr -sha256 -signkey cert-key.pem -extfile <(printf "subjectAltName=DNS:guan-example.com,DNS:*.guan-example.com") -out cert.crt
注意這里在windows下可能不支持-extfile <(printf "subjectAltName=DNS:guan-example.com,DNS:*.guan-example.com")方式添加
可以把下面這段內容添加到ext.conf文件中
subjectAltName=DNS:guan-example.com,DNS:*.guan-example.com
然后執行
openssl x509 -req -days 365 -in cert.csr -sha256 -signkey cert-key.pem -extfile ext.conf -out cert.crt #查看證書.crt文件
openssl x509 -in cert.crt -text -noout
生成證書鏈
1、生成根證書
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout rootCA-key.pem -subj "/C=CN/ST=Zhe Jiang/L=Hang Zhou/O=GUAN Technologies Inc./OU=IT/CN=guan-example.com/emailAddress=guan@email.com" -out rootCA.crt
2、根據根證書生成子證書
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert-key.pem -CA rootCA.crt -CAkey rootCA-key.pem -subj "/C=CN/ST=Zhe Jiang/L=Hang Zhou/O=GUAN Technologies Inc./OU=IT/CN=guan-example.com/emailAddress=guan@email.com" -addext "subjectAltName=DNS:guan-example.com,DNS:*.guan-example.com" -out cert.crt
cert.conf的內容如下
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[ req_distinguished_name ]
C = CN
ST = ZheJiang
L = HangZhou
O = GUAN Technologies Inc.
OU = IT Department
CN = www.guan_example.com
emailAddress = guan@email.com[ req_ext ]
subjectAltName = @alt_names[ alt_names ]
DNS.1 = tls-example.com
DNS.2 = *.tls-example.com
想要學習可以查看這兩個視頻
帶你詳細了解TLS、HTTPS以及證書的底層原理-上
帶你詳細了解TLS、HTTPS以及證書的底層原理-下
超級詳細,可以深入學習學習