在ASN.1表示法中OID为“2.5.4.3”的X509证书的DN的通用名称字段中,限制为最多64个字符。如果我们想要一个超过64个字符的通用名称,是否有任何解决方法?
/crypto/asn1/a_mbstr.c
3. 查找类似下面这样的内容: if ((maxsize > 0) && (nchar > maxsize)) {
ASN1error(ASN1_R_STRING_TOO_LONG);
ERR_asprintf_error_data("maxsize=%ld", maxsize);
return -1;
}
并将其注释掉。对于版本2.6.0,在第155-159行上。删除这些行将删除最大CN长度检查。
按照README
文件中的说明构建二进制文件。在macOS上进行构建时,我不需要安装任何库,但您的情况可能会有所不同。我使用了cmake
,将新的openssl二进制文件放置在/build/apps/openssl
中。
使用命令行标志生成CSR(注意:不是交互式工具--它具有特殊检查,此修改不能修补!)。
例如:
/build/apps/openssl/openssl req -new -newkey rsa:2048 -nodes -out a.csr -keyout a.key -subj "/CN=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
openssl
二进制文件(或者如果您愿意,可以使用修改后的文件)签署CSR:openssl x509 -req -in a.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out a.crt -days 500 -sha256
之后,您应该准备好使用非符合证书。正如评论中许多人和Chris Cogdon所指出的那样,使用CN长于64个字符的证书存在许多问题(macOS curl
无法与使用这些证书的服务器通信,Wireshark在展示中截断CN等)。然而,至少可以确认这些证书在某些特定情况下是可用的,因为该证书正好适用于我所需要的工作。
我在实际应用中看到的一个技巧是使用通配符证书。
例如,使用CN='*.example.com'的证书来保护'very-truly-tremendously-[...]-long-hostname.example.com'。
CN=www.example.com
*** 可能是错误的。主机名总是放在 SAN 中。如果它出现在 CN 中,则必须在 SAN 中也出现(在这种情况下必须列出两次)。有关更多规则和原因,请参见如何使用您的认证机构签署证书签名请求和如何使用openssl创建自签名证书? - jwwub-common-name-length
中看到了64个字符的限制,它在CommonName ::= PrintableString(SIZE (1..ub-common-name-length))
中。但是***CN
**是向用户显示的友好名称,例如Example, LLC Widgets*,所以在实践中可能不是问题。如前所述,DNS名称放在SAN中,因此在实践中不应该有问题。您能否缩短友好名称以适应64个字符的限制? - jww