我在家里安装了 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
)。