You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成无主题名称但含主题备用名称的X509证书?

生成无CN且包含SAN的机器证书问题

我了解到,若机器证书包含主题备用名称(Subject Alternative Name,SAN),则可以不设置主题名称。我的需求是生成此类证书,用于与CA进行证书链验证。

我通过以下命令生成了CA:

openssl req -new -x509 -days 3650 -key private/ca.key -out certs/ca.crt -subj "/CN=CA-cert"

随后我使用以下配置文件生成机器证书:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
CN =
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = lokemachine

并执行了这条命令:

openssl req -new -key private/lokemachine.key -out lokemachine.csr -config lokemachine.cnf

此时遇到如下问题:

problems making Certificate Request
3070695208:error:0D07A098:asn1 encoding routines:ASN1_mbstring_ncopy:string too short:a_mbstr.c:151:minsize=1

该错误对应配置中的CN =行,因为其为空字符串,被提示“string too short”。于是我删除了该行,使用以下配置重试:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]

[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = lokemachine

现在又遇到新问题:

error, no objects specified in config file
problems making Certificate Request

请问是否可以生成无CN的证书?若可以,具体该如何操作?


解决方案

可以生成无CN且包含SAN的证书,关键是调整OpenSSL的配置逻辑,跳过主题字段的强制校验,同时确保SAN扩展正确嵌入证书。具体操作步骤如下:

1. 编写CSR生成配置文件

创建名为no_cn_san.cnf的配置文件,内容如下:

[req]
prompt = no
default_bits = 2048
distinguished_name = dn
req_extensions = req_ext

[dn]
# 空段,不定义任何主题字段(包括CN)

[req_ext]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = lokemachine

核心要点:用req_extensions指定CSR要携带的扩展(而非直接生成自签名证书的x509_extensions),同时distinguished_name指向空的dn段,避免强制要求填写主题字段。

2. 生成无CN的CSR

执行以下命令生成证书签名请求:

openssl req -new -key private/lokemachine.key -out lokemachine.csr -config no_cn_san.cnf

执行后不会再出现“string too short”或“no objects specified”的错误。

3. 配置CA签署规则

创建CA签署用的配置文件ca_sign.cnf,确保允许签署无主题字段的证书:

[ca]
default_ca = CA_default

[CA_default]
dir = ./
certificate = certs/ca.crt
private_key = private/ca.key
new_certs_dir = certs
database = index.txt
serial = serial.txt
default_days = 365
default_md = sha256
policy = policy_match
x509_extensions = usr_cert

[policy_match]
# 所有字段设为optional,允许无主题字段的证书通过校验
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optional

[usr_cert]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = lokemachine

4. 用CA签署CSR生成证书

先初始化CA所需的基础文件(如果之前没创建):

touch index.txt
echo 01 > serial.txt

然后执行签署命令:

openssl ca -in lokemachine.csr -out certs/lokemachine.crt -config ca_sign.cnf -batch

验证证书

可以用以下命令检查生成的证书是否符合要求:

openssl x509 -in certs/lokemachine.crt -text -noout

查看输出会发现Subject字段为空,同时X509v3 Subject Alternative Name下包含设置的DNS条目。


内容的提问来源于stack exchange,提问作者Karthick Balaji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:20:08