【经验篇】自签名TLS证书生成
目录
- 生成自签名证书
- 使用OpenSSL生成自签名证书
- 生成RSA密钥和自签名证书
- 一步生成自签名证书
- 生成带SAN(Subject Alternative Name)的证书
- 使用keytool生成自签名证书
- 生成Java密钥库(JKS)格式的自签名证书
- 生成PKCS12格式的自签名证书
- 使用mkcert生成受信任的自签名证书
- 安装mkcert
- 生成受信任的自签名证书
- 使用Cloudflare CFSSL生成自签名证书
- 安装CFSSL
- 生成自签名证书
- 生成特定格式的证书
- 生成PFX/P12格式证书(Windows友好格式)
- 生成DER格式证书(二进制格式)
- 验证生成的证书
- 最佳实践
生成自签名证书
自签名证书是一种由组织或个人自行颁发的数字证书,无需通过第三方证书颁发机构(CA)。虽然自签名证书在生产环境中通常不被浏览器信任,但在开发、测试、内部系统或特定场景下非常有用。下面介绍几种常见的生成自签名证书的方法。
使用OpenSSL生成自签名证书
生成RSA密钥和自签名证书
# 生成私钥
openssl genrsa -out private.key 2048# 生成证书签名请求(CSR)交互方式的
openssl req -new -key private.key -out certificate.csr# 自签名证书(有效期1年)
openssl x509 -req -days 365 -in certificate.csr -signkey private.key -out certificate.crt# 合并证书和私钥(可选,某些应用需要)
cat certificate.crt private.key > certificate.pem
一步生成自签名证书
# 一步生成私钥和自签名证书
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes# 跳过交互式问答(使用-subj参数)
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes \-subj "/C=CN/ST=Beijing/L=Beijing/O=Your Organization/OU=IT Department/CN=yourdomain.com"
生成带SAN(Subject Alternative Name)的证书
# 创建SAN配置文件(san.cnf)
cat > san.cnf << EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no[req_distinguished_name]
C = CN
ST = Beijing
L = Beijing
O = Your Organization
OU = IT Department
CN = yourdomain.com[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names[alt_names]
DNS.1 = yourdomain.com
DNS.2 = www.yourdomain.com
IP.1 = 192.168.1.1
EOF# 使用配置文件生成证书
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -config san.cnf
使用keytool生成自签名证书
生成Java密钥库(JKS)格式的自签名证书
# 生成自签名证书并存储在JKS密钥库中
keytool -genkeypair -alias mydomain -keyalg RSA -keysize 2048 -storetype JKS \-keystore keystore.jks -validity 365 \-dname "CN=yourdomain.com, OU=IT, O=Your Organization, L=Beijing, ST=Beijing, C=CN"# 导出证书(可选)
keytool -exportcert -alias mydomain -keystore keystore.jks -file certificate.crt
生成PKCS12格式的自签名证书
# 生成PKCS12格式的密钥库
keytool -genkeypair -alias mydomain -keyalg RSA -keysize 2048 -storetype PKCS12 \-keystore keystore.p12 -validity 365 \-dname "CN=yourdomain.com, OU=IT, O=Your Organization, L=Beijing, ST=Beijing, C=CN"
使用mkcert生成受信任的自签名证书
安装mkcert
# macOS
brew install mkcert
brew install nss # 如果使用Firefox# Linux
sudo apt install libnss3-tools
curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
chmod +x mkcert-v*-linux-amd64
sudo cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert# Windows
choco install mkcert
生成受信任的自签名证书
# 安装本地CA(只需执行一次)
mkcert -install# 生成证书(支持多域名和IP)
mkcert yourdomain.com *.yourdomain.com 127.0.0.1 ::1# 输出:
# Created a new certificate valid for the following names
# - "yourdomain.com"
# - "*.yourdomain.com"
# - "127.0.0.1"
# - "::1"# 证书文件:
# "yourdomain.com+3.pem"
# "yourdomain.com+3-key.pem"
使用Cloudflare CFSSL生成自签名证书
安装CFSSL
# macOS
brew install cfssl# Linux
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64 -o cfssl
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64 -o cfssljson
chmod +x cfssl cfssljson
sudo mv cfssl cfssljson /usr/local/bin/
生成自签名证书
# 创建证书配置文件(csr.json)
cat > csr.json << EOF
{"CN": "yourdomain.com","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "Beijing","L": "Beijing","O": "Your Organization","OU": "IT Department"}],"hosts": ["yourdomain.com","www.yourdomain.com","192.168.1.1"]
}
EOF# 生成证书
cfssl genkey -initca csr.json | cfssljson -bare ca# 自签名证书
cfssl sign -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server csr.json | cfssljson -bare server
生成特定格式的证书
生成PFX/P12格式证书(Windows友好格式)
# 从现有证书和私钥转换
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt# 直接生成PFX格式
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
openssl pkcs12 -export -out certificate.pfx -inkey key.pem -in cert.pem
生成DER格式证书(二进制格式)
# 将PEM转换为DER
openssl x509 -outform der -in certificate.crt -out certificate.der
验证生成的证书
# 查看证书信息
openssl x509 -noout -text -in certificate.crt# 验证证书有效性
openssl verify certificate.crt# 验证私钥与证书匹配
openssl rsa -noout -modulus -in private.key | openssl md5
openssl x509 -noout -modulus -in certificate.crt | openssl md5
# 两个MD5值应相同
最佳实践
- 使用足够的密钥长度:建议使用2048位或更高的RSA密钥
- 设置合理的有效期:通常不超过1年,避免过长有效期
- 包含必要的SAN:确保证书包含所有需要访问的域名和IP
- 妥善保管私钥:私钥文件应设置严格的访问权限(如600)
- 考虑使用受信任的本地CA:如mkcert生成的证书可被浏览器信任
- 在生产环境谨慎使用:自签名证书不适合面向公众的生产环境
自签名证书在开发、测试和内部系统中非常有用,但在生产环境中应优先考虑使用受信任的CA颁发的证书。