我可以使用 openSSL 创建自签名证书,如下所示:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX -nodes
该接口以某种方式将我的通用名称限制为 64 字节。如何创建通用名超过 64 字节的证书?
答案1
就我而言,“不要这样做,这违反标准”的所有答案都非常没有帮助,因为我需要将其作为逆向工程挑战的一部分。就我而言,违反标准这一事实并不重要。
以下是(粗略的)步骤:
- 从以下位置下载 libressl 的最新源代码https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/(我使用 2.6.0,因为它是 macOS Mojave 上附带的版本)
- 解压缩/tar/gz,然后
/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(请阅读:不是交互式工具 - 它有一个特殊的检查,但此修改不会修补该检查!)。
例如:
/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
之后,您应该就可以使用精彩的不合规证书了。我注意到使用 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