在DN of a X509 certificate的公共名称字段中,如OID" 2.5.4.3"的ASN.1表示法中所定义,限制最多为64个字符。如果我们想要一个超过64个字符的通用名称,是否有任何转变?
答案 0 :(得分:2)
即使您可以哄骗证书生成代码以获得更长的CN,也需要更改客户端,其中大多数是您无法控制的。客户很可能拒绝使用CN过长的证书,然后根本就没有证书。
如评论中所述,您可以(并且应该)将该域名和其他域名放入“主题备用名称”扩展名中,并将CN保留为空。不是整个“主题”,而只是CN的一部分。
答案 1 :(得分:1)
如果您想“哄骗”像@Chris Cogdon提到的证书生成代码,这并不难。我需要这样做,这是逆向工程挑战的一部分,因此,违反标准的事实无关紧要。我完全同意您不应该执行此操作的消息,但是由于要花一些时间才能弄清楚,所以我仍然会解释我的操作方法。
以下是(粗略的)步骤:
/crypto/asn1/a_mbstr.c
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上构建时,我不需要安装任何库,但可以使用YMMV。我使用了cmake
,它将新的openssl二进制文件放入了/build/apps/openssl
使用命令行标志生成CSR(请阅读:NOT THE INTERACTIVE TOOL-它具有此修改未修补的特殊检查!)。
例如:
/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截断了Disector中的CN显示等)。但是,此证书确实可以满足我的需要,因此我至少可以确认这些证书在某些特定情况下可以正常工作。
答案 2 :(得分:0)
我在野外发现的一个窍门是使用通配符证书。
例如,具有CN ='* .example.com'的证书可以保护'非常真实-[...]-长主机名.example.com'。