openssl 生成自签名证书

使用openssl命令,基于cert.cnf配置文件生成自签名SSL证书

生成自签证书顺序:0.证书配置文件 1.生成 RSA 私钥 2.创建证书签名请求(CSR) 3 .生成自签名证书(有效期 1 年)4. 验证证书

  • 创建cert.cnf证书配置
[req]
default_bits = 2048  # RSA密钥长度(推荐2048或更高)
prompt = no # 禁用交互式提问
default_md = sha256 # 签名使用的哈希算法
distinguished_name = dn # 证书主题信息配置段
req_extensions = req_ext # 证书请求扩展配置段
x509_extensions = v3_req # 证书扩展配置段(自签名证书或中间CA使用)

[dn]
C = CN
ST = Beijing
L = Beijing
O = XX
OU = IT
CN = www.baidu.com  # CN 设置自签域名/IP地址 CN = 192.168.1.101 

[req_ext]
subjectAltName = @alt_names

[v3_req]
subjectAltName = @alt_names
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
basicConstraints = CA:FALSE

[alt_names]
DNS.1 = www.test1.cn  # 第一个选项必须包含 CN 的值,可以域名/IP
DNS.2 = www.test2.cn
IP.1 = 192.168.1.101
IP.2 = 192.168.1.102

1. 生成RSA私钥

# 生成2048位RSA私钥(不加密)
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048

# 生成带密码保护的私钥(推荐生产环境)
openssl genpkey -algorithm RSA -aes256 -out server.key -pkeyopt rsa_keygen_bits:2048
  • 注意:如果使用加密私钥,后续命令需要输入密码

2. 创建证书签名请求(CSR)

# 使用配置文件创建CSR
openssl req -new -key server.key -out server.csr -config cert.cnf
  • 确保cert.cnf中的prompt = no,否则会提示交互式输入
  • 验证CSR内容:openssl req -noout -text -in server.csr

3. 生成自签名证书(有效期1年)

# 基于配置文件中的[v3_req]扩展生成证书
openssl x509 -req -in server.csr -signkey server.key -out server.crt \
  -days 365 -extensions v3_req -extfile cert.cnf
  • 重要参数
    • -days 365:证书有效期(公共证书建议≤398天)
    • -extensions v3_req:使用配置文件中的[v3_req]扩展
    • -extfile cert.cnf:指定扩展配置文件

4. 验证证书

# 查看证书信息
openssl x509 -noout -text -in server.crt

# 检查证书有效期
openssl x509 -noout -dates -in server.crt

5. 导出.pem证书

要将 .crt 证书导出为 PEM 格式,实际上大多数情况下 .crt 文件本身就是 PEM 格式,但可以通过 OpenSSL 命令显式转换以确保格式正确。以下是具体操作步骤:

1. 检查 .crt 文件格式

PEM 格式的证书以文本形式存储,内容类似:

-----BEGIN CERTIFICATE-----
MIIDHzCCAgegAwIBAgIJAKr...(Base64编码数据)...
-----END CERTIFICATE-----

如果你的 .crt 文件是这种格式,它已经是 PEM 格式,可以直接使用。

2. 转换为 PEM 格式(无论原格式如何)

情况1:仅转换证书(不含私钥)

openssl x509 -in server.crt -out certificate.pem -outform PEM
  • -in:输入证书文件
  • -out:输出 PEM 文件
  • -outform PEM:指定输出格式为 PEM

情况2:导出证书链(包含中间证书)
如果 .crt 文件包含多个证书(服务器证书 + 中间证书),使用:

openssl crl2pkcs7 -nocrl -certfile server.crt | \
openssl pkcs7 -print_certs -out certificate-chain.pem

情况3:合并证书和私钥(创建完整的 PEM 配置)
如果需要同时包含证书和私钥(例如用于 Nginx):

# 先转换证书
openssl x509 -in server.crt -out cert.pem -outform PEM

# 再转换私钥(如果私钥不是 PEM 格式)
openssl rsa -in server.key -out key.pem -outform PEM

# 合并证书和私钥(顺序:证书在前,私钥在后)
cat cert.pem key.pem > certificate.pem
  1. 验证 PEM 文件
# 查看证书信息
openssl x509 -noout -text -in certificate.pem

# 确认格式为 PEM(应显示 "BEGIN CERTIFICATE")
head -n 5 certificate.pem

总结

  • .crt 通常已是 PEM 格式,直接重命名为 .pem 即可使用
  • 使用 OpenSSL 转换可确保格式兼容,尤其在跨平台时
  • 证书链处理:确保中间证书按正确顺序包含在 PEM 文件中

如果你的 .crt 文件是 DER 二进制格式(非文本),则需要添加 -inform DER 参数进行转换:

openssl x509 -inform DER -in certificate.crt -out certificate.pem -outform PEM

以下是添加了详细注释的完整 cert.cnf 配置文件示例:

[req]
default_bits        = 2048          # RSA密钥长度(推荐2048或更高)
default_keyfile     = server.key    # 生成的私钥文件名
distinguished_name  = req_distinguished_name  # 证书主题信息配置段
req_extensions      = req_ext       # 证书请求扩展配置段
x509_extensions     = v3_req        # 证书扩展配置段(自签名证书或中间CA使用)
string_mask         = utf8only      # 强制使用UTF-8编码
prompt              = no            # 禁用交互式提问,使用配置文件中的预设值
encrypt_key         = no            # 是否加密私钥(yes: 生成带密码保护的私钥)
default_md          = sha256        # 签名使用的哈希算法
req_attribute       = req_attributes  # 证书请求属性配置段(可选)
dirstring_type      = nobmp         # 禁止使用BMP字符(避免某些编码问题)

[req_distinguished_name]
# 证书主题信息(Distinguished Name)
countryName                 = CN            # 国家代码(2字母)
stateOrProvinceName         = Beijing       # 省份/州
localityName                = Beijing       # 城市/地区
0.organizationName          = Example Company  # 组织名称(数字前缀确保唯一性)
organizationalUnitName      = IT Department  # 部门名称
commonName                  = example.com    # 通用名(通常为主域名)
emailAddress                = admin@example.com  # 邮箱地址

# 可选字段示例(如需添加)
# 0.localityName            = City        # 附加城市字段
# 1.organizationName        = Company Inc. # 附加组织字段

[req_attributes]
# 证书请求属性(可选)
challengePassword           = 1234        # 证书颁发机构的挑战密码
unstructuredName            = Example Inc. # 非结构化名称

[req_ext]
# 证书请求扩展
subjectAltName       = @alt_names         # 主题备用名称(SAN),支持多个域名/IP
basicConstraints     = CA:FALSE           # 是否为CA证书(FALSE: 服务器/客户端证书)
keyUsage             = digitalSignature, keyEncipherment  # 密钥用途
extendedKeyUsage     = serverAuth, clientAuth  # 扩展密钥用途(同时支持服务器和客户端认证)
certificatePolicies  = 1.3.6.1.4.1.57264.1.1  # 证书策略OID(可选)

[v3_req]
# 证书扩展(继承req_ext并添加额外扩展)
subjectAltName       = @alt_names
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
extendedKeyUsage     = serverAuth, clientAuth
authorityKeyIdentifier = keyid,issuer    # 颁发者密钥标识符
subjectKeyIdentifier = hash              # 主题密钥标识符
nsComment            = "OpenSSL Generated Certificate"  # Netscape注释
crlDistributionPoints = URI:http://crl.example.com/crl.pem  # CRL分发点(可选)
authorityInfoAccess = OCSP;URI:http://ocsp.example.com  # OCSP响应服务器(可选)

[alt_names]
# 主题备用名称列表(SAN)
# 支持域名(DNS.x)和IP地址(IP.x)
DNS.1     = example.com           # 主域名
DNS.2     = www.example.com       # www前缀域名
DNS.3     = api.example.com       # API子域名
IP.1      = 192.168.1.1           # IP地址1
IP.2      = 10.0.0.1              # IP地址2

关键选项详细说明

  1. 密钥与签名选项

    • default_bits: RSA密钥长度,影响安全性(推荐2048+)
    • default_md: 签名哈希算法(如sha256、sha512)
    • encrypt_key: 是否加密私钥(生产环境建议启用)
  2. 主题信息选项

    • commonName: 通常是服务器域名(SAN存在时重要性降低)
    • 数字前缀(如0.organizationName):确保字段唯一性
  3. 扩展选项

    • subjectAltName: 现代浏览器强制要求,包含所有域名/IP
    • keyUsage: 定义证书用途(如签名、加密)
    • extendedKeyUsage: 细化用途(服务器认证、客户端认证)
    • basicConstraints: 标识证书类型(CA/非CA)
    • pathlen: CA证书专用,限制下级CA层级
  4. 合规性选项

    • crlDistributionPoints: 证书撤销列表URL
    • authorityInfoAccess: OCSP在线状态检查URL
    • default_days: 证书有效期(建议不超过398天)

不同场景的配置差异

服务器证书

[req_ext]
extendedKeyUsage = serverAuth  # 仅用于服务器认证

客户端证书

[req_distinguished_name]
commonName = User ID            # 使用用户标识而非域名

[req_ext]
extendedKeyUsage = clientAuth   # 仅用于客户端认证

中间CA证书

[v3_req]
basicConstraints = CA:TRUE,pathlen:1  # 允许签发下级证书,但限制层级
keyUsage = cRLSign, keyCertSign       # CA专用密钥用法

这个配置文件覆盖了大多数常见场景,可以根据实际需求调整选项值和注释内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容