自签名通配符证书

自签名通配符证书

我在家里安装了 pihole,所以我希望能够使用自己的服务器处理任何网站的请求,以显示“该网站已被阻止”的页面。

我尝试通过为任何 URL 创建自签名证书并将其安装在我的设备上来实现这一点。我用来生成证书的命令如下:

openssl genrsa 2048 > pihole.key
openssl req -new -x509 -nodes -days 36500\
    -key pihole.key \
    -subj "/C=NL/ST=Utrecht, Inc./CN=*" \
    -reqexts SAN \
    -config <(cat /etc/ssl/openssl.cnf \
        <(printf "\n[SAN]\nsubjectAltName=DNS:*,DNS:*")) \
    -out pihole.cert
openssl x509 -noout -fingerprint -text < pihole.cert > pihole.info
cat pihole.cert pihole.info > pihole.pem
service apache2 reload

我已经在我的 Windows 设备上安装了此证书,并且 Windows 显示它是一个有效证书。

但是,chrome 给出了一个错误NET::ERR_CERT_COMMON_NAME_INVALID,而 edge 也给出了类似的错误(DLG_FLAGS_SEC_CERT_CN_INVALID

这是为什么?CN = *难道不允许吗?我该如何实现我的愿望?

答案1

这是不允许的。作为对标准 TLS 主机名验证的协议特定补充,所有主流 Web 浏览器(HTTPS 客户端)基本上都同意将通配符证书限制为“eTLD+1”——也就是说,必须有一个“有效 TLD”加上一个非通配符组件。

通常,这意味着需要至少两个组件(*.example.net可以但*.net不是,也不是裸露的*)。“有效 TLD”规则将其扩展到多级后缀,因为co.uk人们在实践中将其用作不可分割的“TLD”。(因此*.example.ac.uk可以但*.ac.uk不是。)

您可以检查如何公共后缀列表已实施在 Chromium 中在 Mozilla 中

Security.SE 中的相关讨论其中引用了 CA-Browser Forum 基本要求(仅适用于公共 WebPKI CA,但仍然反映了一般的实现):

CA 应撤销任何在“注册表控制”标签或“公共后缀”左侧第一个标签位置出现通配符的证书。


为了避免这个限制,构建一个证书颁发机构它会为您尝试访问的任何网站“按需”颁发证书。我不知道如何在任何常规 Web 服务器中实现这一点,但这是商业 TLS 拦截系统、防病毒程序和其他恶意软件以及 Burp Proxy 套件等开发工具使用的常见方法。

例如,OpenResty Web 服务器(基本上是 Nginx-with-Lua)有一个ssl_certificate_by_lua选择实现动态证书生成。Squid 代理支持证书模仿在其 ssl-bump 功能中。

还要注意的是,SAN 完全覆盖如果两者都存在,则包含主题 CN。这使得包括 CN 大部分是多余的(除非您的客户端软件太旧以至于缺乏 SAN 支持),并且对于公共 CA,Web 浏览器甚至不再接受它。

答案2

证书中只能有一个通配符(即没有*.*.example.com),它只能匹配一个标签(即仅www,不是www.example.com),它只能位于最左边的位置(即*.www.example.com但不是www.*.example.com)并且它不能位于公共后缀内(即没有*.com)。

相关内容