【经验篇】自签名TLS证书生成

生成自签名证书

自签名证书是一种由组织或个人自行颁发的数字证书,无需通过第三方证书颁发机构(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值应相同

最佳实践

  1. 使用足够的密钥长度:建议使用2048位或更高的RSA密钥
  2. 设置合理的有效期:通常不超过1年,避免过长有效期
  3. 包含必要的SAN:确保证书包含所有需要访问的域名和IP
  4. 妥善保管私钥:私钥文件应设置严格的访问权限(如600)
  5. 考虑使用受信任的本地CA:如mkcert生成的证书可被浏览器信任
  6. 在生产环境谨慎使用:自签名证书不适合面向公众的生产环境

自签名证书在开发、测试和内部系统中非常有用,但在生产环境中应优先考虑使用受信任的CA颁发的证书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值