OpenSSL 配置方法

FreeGuideOnline 最新 2026-07-16

bash openssl version -d


输出类似 `OPENSSLDIR: "/usr/lib/ssl"`,在该目录下一般就能找到 `openssl.cnf`。

常见路径:
- Linux(系统安装):`/etc/ssl/openssl.cnf` 或 `/etc/pki/tls/openssl.cnf`
- macOS(Homebrew):`/usr/local/etc/openssl@3/openssl.cnf`
- Windows(预编译包):`C:\Program Files\OpenSSL-Win64\bin\openssl.cfg` 或自定义路径

如果想临时使用另一个配置文件,可以设置环境变量:

```bash
export OPENSSL_CONF=/path/to/your/openssl.cnf

建议新手把系统的原始配置文件复制一份到自己的工作目录,再进行修改,避免影响系统环境。


三、配置文件的结构速览

配置文件采用类似 INI 风格的段落结构,以 [ 段名 ] 开头。下面是一个简化示例,后面会逐段解释。

# 默认段
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
x509_extensions    = v3_ca

# 身份信息预定义
[ req_distinguished_name ]
countryName               = Country Name (2 letter code)
countryName_default       = CN
stateOrProvinceName       = State or Province Name
stateOrProvinceName_default = Shanghai
localityName              = Locality Name
localityName_default      = Shanghai
organizationalUnitName    = Organizational Unit Name
commonName                = Common Name (e.g. server FQDN)
commonName_max            = 64

# CA 证书扩展
[ v3_ca ]
basicConstraints       = critical, CA:TRUE
keyUsage               = critical, keyCertSign, cRLSign
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer

四、核心配置段详解

1. [ req ] — 请求与自签名控制

该段用于 req 子命令的默认设置。关键字段:

  • default_bits:生成的密钥长度,建议至少 2048。
  • default_md:签名算法,如 sha256。
  • distinguished_name:指向预定义身份信息段的名称。
  • x509_extensions:生成自签名证书时使用的扩展段(如 v3_ca)。
  • req_extensions:生成证书签名请求(CSR)时添加的扩展段。
  • prompt:设为 no 将直接使用默认值而无需交互,适用于自动化脚本。

2. [ req_distinguished_name ] — 证书主题

这里可以预设证书中的主体信息(DN)。每个字段都可以用 _default 指定默认值,还能用 _min / _max 限制输入长度。常用属性:

  • countryNamecountryName_default
  • stateOrProvinceName 及默认值
  • localityName 及默认值
  • organizationName 及默认值
  • organizationalUnitName 及默认值
  • commonName 及默认值(对于服务器证书,填域名非常重要)

3. 证书扩展段([ v3_ca ][ v3_req ] 等)

扩展段定义了证书的功能限制和增强信息。你可以在配置文件中定义多个扩展段,生成命令时用 -extensions 指定。

常用的扩展指令:

  • basicConstraintsCA:TRUE 表示这是一个 CA 证书;CA:FALSE 则表示终端实体证书。
  • keyUsage:定义公钥的用途,如 digitalSignature, keyEncipherment
  • extendedKeyUsage:进一步定义用途,如 serverAuth, clientAuth
  • subjectAltName:使用者备用名称,即多域名或 IP 证书的核心。

一个典型的服务器证书扩展段例子:

[ server_cert ]
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage       = serverAuth, clientAuth
subjectAltName         = DNS:example.com, DNS:www.example.com, IP:192.168.1.1

五、实战一:生成自定义信息的自签名证书

直接使用默认配置生成自签名证书时,信息需要手动输入。通过配置文件可以将常用信息固定。

  1. 创建专用配置文件 myserver.cnf
[ req ]
default_bits       = 2048
prompt             = no
default_md         = sha256
distinguished_name = my_dn
x509_extensions    = my_ext

[ my_dn ]
CN = myserver.local
O  = MyCompany
OU = IT
C  = CN
ST = Shanghai
L  = Shanghai

[ my_ext ]
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, keyEncipherment
extendedKeyUsage       = serverAuth
subjectAltName         = DNS:myserver.local, DNS:localhost, IP:127.0.0.1
  1. 生成密钥并签发证书
openssl req -x509 -newkey rsa:2048 -keyout myserver.key -out myserver.crt -days 365 -config myserver.cnf -nodes
  • -nodes 表示不加密私钥(测试环境适用)。
  • 由于 prompt = no,整个过程无交互,所有信息都来自配置文件。

六、实战二:搭建自己的私有 CA 并签发服务器证书

任何规模的内部网络都建议使用私有 CA,以保证内网服务间的双向 TLS 认证。

1. 准备 CA 配置文件 ca.cnf

[ req ]
default_bits       = 2048
prompt             = no
default_md         = sha256
distinguished_name = ca_dn
x509_extensions    = ca_ext

[ ca_dn ]
CN = My Private Root CA
O  = MyCompany
C  = CN

[ ca_ext ]
basicConstraints       = critical, CA:TRUE
keyUsage               = critical, keyCertSign, cRLSign
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer

2. 生成 CA 私钥和根证书

openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3650 -config ca.cnf -nodes

得到 ca.key(私钥,保密!)和 ca.crt(证书,可以分发给客户端)。

3. 准备服务器证书请求的配置文件 server.cnf

[ req ]
default_bits       = 2048
prompt             = no
default_md         = sha256
distinguished_name = server_dn
req_extensions     = server_ext

[ server_dn ]
CN = myserver.internal
O  = MyCompany

[ server_ext ]
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, keyEncipherment
extendedKeyUsage       = serverAuth
subjectAltName         = DNS:myserver.internal, DNS:www.myserver.internal

4. 生成服务器私钥和 CSR(证书签名请求)

openssl req -newkey rsa:2048 -keyout server.key -out server.csr -config server.cnf -nodes

5. 使用 CA 签发证书

需要创建一个简单的扩展文件或直接在命令行指定扩展。更推荐新建一个扩展文件 sign_ext.cnf

[ server_ext ]
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, keyEncipherment
extendedKeyUsage       = serverAuth
subjectAltName         = DNS:myserver.internal, DNS:www.myserver.internal

签发命令:

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extfile sign_ext.cnf -extensions server_ext

现在你得到了由私有 CA 签发的 server.crt


七、Subject Alternative Name (SAN) 和多域名支持

现代浏览器要求证书必须包含 SAN,即使是自签名证书。在配置文件中添加 subjectAltName 即可。

使用环境变量方式动态添加 SAN(无需改配置文件): OpenSSL 1.1.1 及以上版本支持 -addext 参数:

openssl req -x509 -newkey rsa:2048 -keyout test.key -out test.crt -days 365 -nodes \
  -subj "/CN=example.com" \
  -addext "subjectAltName=DNS:example.com,DNS:www.example.com,IP:10.0.0.1"

这样就不需要单独的扩展文件,适合快速测试。


八、常见配置错误及排错

  1. “Unable to load config info from …”
    原因:找不到配置文件。用 export OPENSSL_CONF 指定正确路径,或检查命令中的 -config 参数。

  2. 生成的证书没有 SAN 扩展
    许多教程使用 openssl req -x509 -subj "/CN=mysite" 方式,这种方式不会生成 SAN。请务必在配置或 -addext 中添加 subjectAltName

  3. CA 证书标记为 CA:FALSE
    根证书必须在扩展中明确设置 basicConstraints = CA:TRUE 且标记为 critical。如果忘记,会导致通过该 CA 签发的中间或末端证书无法被验证。

  4. Windows 下路径分隔符问题
    Windows 的 OpenSSL 配置文件可以使用 /\\,但推荐使用 /,并注意不要包含中文路径。


九、进阶:分节配置与变量复用

配置文件支持变量 $var${var},支持用 .include 导入其他文件,可以将 CA 基础设置、扩展定义分别存放在不同文件中。

例如创建一个 ca_base.cnf

dir = ./ca
certs = $dir/certs
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial

然后在主配置文件里引用:

[ CA_default ]
dir = ./ca
.include ca_base.cnf