当前位置: 首页 > backend >正文

【经验篇】自签名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值应相同

最佳实践

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

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

http://www.xdnf.cn/news/13952.html

相关文章:

  • 博客园突发大规模DDoS攻击 - 深度解析云安全防御新范式
  • P10987 [蓝桥杯 2023 国 Python A] 火车运输
  • 第一章 数字电路概述
  • 记一次错误 深拷贝 key值全部小写
  • 三次握手建立连接,四次挥手释放连接——TCP协议的核心机制
  • 上海市计算机学会竞赛平台2022年6月月赛丙组模糊匹配
  • 蚂蚁国际计划在香港和新加坡推出稳定币
  • 关于UEFI:UEFI/BIOS 固件分析
  • 【51单片机】6. 定时器、按键切换流水灯时钟Demo
  • MFC对话框程序使用线程方式更新窗体文本框内容(vs2019)
  • 多平台联动营销:品融电商助食品品牌打造电商“多栖”增长引擎
  • GetX例子:在一个组件里更新状态,在另一个组件里获取更新的数据
  • [Linux] -- 大文件拆分、合并与校验全解析:处理 GB/TB 级文件
  • 2024 一带一路暨金砖国家职业技能大赛(金砖国家未来技能和技术挑战赛)
  • openEuler虚拟机中容器化部署
  • c++虚表的调用
  • CSS 基础选择器、文字控制属性
  • 蓝牙协议GAP(Generic Access Profile)
  • 报表工具顶尖对决系列 — Echarts 展现与导出
  • CC工具箱使用指南:【断线连接】
  • Oracle OCP认证考试考点详解083系列18
  • 如何在SOLIDWORKS工程图中添加材料明细表?
  • 关于联咏(Novatek )自动曝光中Lv值的计算方式实现猜想
  • win11系统安装jdk11教程
  • day22
  • Python 实现一个带进度条的 URL 批量下载工具(含 GUI 界面)
  • 第三节 类型系统进阶-接口(interface)与类型别名(type)的区别
  • 算法导论第三章:数据结构艺术与高效实现
  • 【Mysql及各种关系型数据库全面对比与深度解析(2025版)】
  • 第六章网络互联设备