如何生成无主题名称但含主题备用名称的X509证书?
我了解到,若机器证书包含主题备用名称(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

