X.509 证书中的专有名称长度限制

gin*_*nja 7 openssl asn.1 x509

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

Chr*_*don 7

即使你可以哄骗你的证书生成代码有一个更长的 CN,它也是需要改变的客户端,其中大多数你无法控制。客户很可能会拒绝 CN 太长的证书,然后您将根本没有证书。

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


Sir*_*ens 5

如果您想像 @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;
    }
Run Code Online (Sandbox Code Playgroud)

并将其注释掉。对于 2.6.0 版本,此内容位于第 155-159 行。通过删除这些行,您将删除最大 CN 长度检查。

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

  2. 使用命令行标志生成 CSR(请阅读:不是交互式工具 - 它有一个特殊的检查,不会通过此修改进行修补!)。

例如:

/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 个字符的证书存在相当多的问题(macOScurl无法与使用这些证书的服务器通信,Wireshark 在解析器显示中截断 CN 等)。然而,该证书确实满足了我的需要,因此我至少可以确认这些证书在某些特定情况下是有效的。