OpenSSL 自签名证书的公用名长度超过 64 字节

OpenSSL 自签名证书的公用名长度超过 64 字节

我可以使用 openSSL 创建自签名证书,如下所示:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX -nodes

该接口以某种方式将我的通用名称限制为 64 字节。如何创建通用名超过 64 字节的证书?

答案1

就我而言,“不要这样做,这违反标准”的所有答案都非常没有帮助,因为我需要将其作为逆向工程挑战的一部分。就我而言,违反标准这一事实并不重要。

以下是(粗略的)步骤:

  1. 从以下位置下载 libressl 的最新源代码https://ftp.openbsd.org/pub/OpenBSD/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 长度检查。

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

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

    例如:

    /build/apps/openssl/openssl req -new -newkey rsa:2048 -nodes -out a.csr -keyout a.key -subj "/CN=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
    
  6. 使用库存openssl二进制文件(或修改后的二进制文件,如果需要),签署 CSR:

    openssl x509 -req -in a.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out a.crt -days 500 -sha256
    

之后,您应该就可以使用精彩的不合规证书了。我注意到使用 CN 长度超过 64 个字符的证书存在很多问题(Wireshark 在解剖器显示中截断 CN 等),但它实际上可以满足我的需要。

答案2

你不能。

指定最大限制是 64:

-- 上限规范必须被视为强制性的

-- 摘自 ITU-T X.411 MTS 参数参考定义的附件 B

-- 上限

-- 上限

ub 名称 INTEGER ::= 32768

ub 通用名称 INTEGER ::= 64

ub-地点名称 INTEGER ::= 128

ub 状态名称 INTEGER ::= 128

ub 组织名称 INTEGER ::= 64

答案3

除了 Allison 的出色回答之外,我发现其他证书生成工具并不总是像 openssl 那样遵循这个 CN 限制。

例如:我使用 Golang 制作了一个简单的自签名证书和密钥生成脚本,您可以在其中将 CN 设置为任意长。

这是我的解决方案,您可以在浏览器中运行或复制代码在本地修改并执行:https://go.dev/play/p/GbdoV0UEmFb

此代码将生成密钥、签署证书,并以 PEM 格式在输出中打印出来(类似于此线程中使用的 openssl 命令)。如果考虑将其用于任何重要的事情,请仔细阅读评论。以下是使用 openssl 从此脚本读取生成的证书时的长 CN 的证明:

$ openssl x509 -text -noout -in playground.crt | head -n 11
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            a8:fd:bf:b8:f3:f9:85:09:36:28:89:fa:65:27:33:ed:19:08
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = MY REALLY LONG COMMON NAME THAT IS DEFINITELY LONGER THAN 64 CHARACTERS
        Validity
            Not Before: Nov 10 23:00:00 2009 GMT
            Not After : Nov 10 23:00:00 2010 GMT
        Subject: CN = MY REALLY LONG COMMON NAME THAT IS DEFINITELY LONGER THAN 64 CHARACTERS

相关内容