OpenSSL 配置方法
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 限制输入长度。常用属性:
countryName及countryName_defaultstateOrProvinceName及默认值localityName及默认值organizationName及默认值organizationalUnitName及默认值commonName及默认值(对于服务器证书,填域名非常重要)
3. 证书扩展段([ v3_ca ]、[ v3_req ] 等)
扩展段定义了证书的功能限制和增强信息。你可以在配置文件中定义多个扩展段,生成命令时用 -extensions 指定。
常用的扩展指令:
basicConstraints:CA: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
五、实战一:生成自定义信息的自签名证书
直接使用默认配置生成自签名证书时,信息需要手动输入。通过配置文件可以将常用信息固定。
- 创建专用配置文件
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
- 生成密钥并签发证书:
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"
这样就不需要单独的扩展文件,适合快速测试。
八、常见配置错误及排错
-
“Unable to load config info from …”
原因:找不到配置文件。用export OPENSSL_CONF指定正确路径,或检查命令中的-config参数。 -
生成的证书没有 SAN 扩展
许多教程使用openssl req -x509 -subj "/CN=mysite"方式,这种方式不会生成 SAN。请务必在配置或-addext中添加subjectAltName。 -
CA 证书标记为 CA:FALSE
根证书必须在扩展中明确设置basicConstraints = CA:TRUE且标记为 critical。如果忘记,会导致通过该 CA 签发的中间或末端证书无法被验证。 -
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