X.509证书中的专有名称长度约束

时间:2016-08-19 09:27:28

标签: openssl x509 asn.1

DN of a X509 certificate的公共名称字段中,如OID" 2.5.4.3"的ASN.1表示法中所定义,限制最多为64个字符。如果我们想要一个超过64个字符的通用名称,是否有任何转变?

3 个答案:

答案 0 :(得分:2)

即使您可以哄骗证书生成代码以获得更长的CN,也需要更改客户端,其中大多数是您无法控制的。客户很可能拒绝使用CN过长的证书,然后根本就没有证书。

如评论中所述,您可以(并且应该)将该域名和其他域名放入“主题备用名称”扩展名中,并将CN保留为空。不是整个“主题”,而只是CN的一部分。

答案 1 :(得分:1)

如果您想“哄骗”像@Chris Cogdon提到的证书生成代码,这并不难。我需要这样做,这是逆向工程挑战的一部分,因此,违反标准的事实无关紧要。我完全同意您不应该执行此操作的消息,但是由于要花一些时间才能弄清楚,所以我仍然会解释我的操作方法。

以下是(粗略的)步骤:

  1. https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/下载libressl的最新资源(我使用2.6.0,因为它是macOS Mojave附带的版本)
  2. 解压缩/ tar / gz,然后在您喜欢的编辑器中打开/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长度检查。

  1. 按照README文件中的说明构建二进制文件。当我在macOS上构建时,我不需要安装任何库,但可以使用YMMV。我使用了cmake,它将新的openssl二进制文件放入了/build/apps/openssl

  2. 使用命令行标志生成CSR(请阅读:NOT THE INTERACTIVE TOOL-它具有此修改未修补的特殊检查!)。

例如:

/build/apps/openssl/openssl req -new -newkey rsa:2048 -nodes -out a.csr -keyout a.key -subj "/CN=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

  1. 使用股票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'。