自签名通配符证书


18

我已经在家里设置了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,边缘给我一个类似的错误(DLG_FLAGS_SEC_CERT_CN_INVALID

为什么是这样?难道CN = *只是不允许?我怎样才能实现自己想要的?


附带说明:对于主要网站,您的浏览器可能不会接受您设法生成的任何证书。这些站点使用证书固定,并提交其TLS证书的指纹以包含在这些浏览器中。您的证书与存储的指纹不匹配,将被阻止。下面是详细信息:noncombatant.org/2015/05/01/about-http-public-key-pinning
马亭Heemels

如您所知,自签名证书可能会出现问题。相反,您可以考虑从letsencrypt.org获得“适当的”认证-它们是免费的,并且支持通配符。根据您实际想要覆盖的主机数量*您实际需要的数量,letsencrypt提供的一个(或多个)证书可以覆盖您
Dave Smylie

2
@DaveSmylie是针对广告拦截者的,我不拥有域名。
丹尼尔·范登贝尔赫

1
@Stewart,请阅读我之前的评论。
丹尼尔·范登贝尔赫

1
还要注意:如果将它用作广告拦截器,则最好静默删除与相关服务器的连接,而不是显示备用页面。90%的现代广告最初都是通过JavaScript加载的,因此您的备用页面不太可能在该页面上具有任何可见性。实际上,尝试将非JavaScript资源加载为Javascript可能会破坏东西。
Nzall

Answers:


42

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

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

您可以检查如何在ChromiumMozilla中实现公共后缀列表

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

如果“证书控制的”标签或“公共后缀”左侧的第一个标签位置出现通配符,则CA将撤销所有证书。


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

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

另请注意,如果同时存在SAN,则SAN会完全覆盖 Subject-CN。这使得包括CN在内大部分都是多余的(除非您的客户端软件如此之旧,它缺乏SAN支持),而对于公共CA,Web浏览器甚至不再接受它。


在前面的项目中,我已经凭经验找到了有关TLD + 1限制的信息。感谢您进行布局。+1
Rui F Ribeiro

感谢您的详尽回答,我想这可以解释它。您是否偶然知道我可以使用的其他方法?
丹尼尔·范登贝尔赫

25
为“和其他恶意软件”的战略定位而投票。
Džuris

@DaniëlvandenBerg:我碰巧在帖子中建议了一个。我刚刚添加了指向Nginx和Squid示例的链接。
user1686 '18

5

证书中只能有一个通配符(即no *.*.example.com),它只能与单个标签(即only www,not www.example.com)匹配,只能位于最左边的位置(即*.www.example.comnot www.*.example.com),并且不能在公共后缀内(即否*.com)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.