如何获取内部主机名的 SNI 证书?

如何获取内部主机名的 SNI 证书?

我家里有一台 Synology NAS,它有一个基于 Web 的用户界面,我将其暴露在公共互联网上。在我的 LAN 中,我的 NAS 有主机名nas.domain.local.,在公共互联网上,我有指向我家路由器的域名home.notarealdomainname.com.(然后将端口 7000 转发到我 NAS 的 HTTPS 服务器的端口 443)。

我的 NAS 带有自签名证书,但它并不真正适合用途,我想安装一个支持两个主机名的 SNI 证书-nas.domain.local.但是home.notarealdomainname.com.所有主要的 CA 都执行某种形式的域验证(他们应该这样做!)但他们无法验证我的.local.域名,所以他们不会颁发该证书。

我不想颁发自己的证书,因为为了方便使用,我希望浏览器信任该证书。

答案1

公共 CA 只会为公共域名颁发证书。他们曾经这样做过,但后来放弃了这种行为,因为这会给新引入的顶级域名带来问题。此外,CA 只会为仅由一方拥有和使用的域名颁发证书,而内部名称则不是这种情况。

这意味着:要么你在所有内部设备上接受自签名证书,要么你需要推出自己的私有 PKI 结构并在所有设备上导入相关的根 CA。

答案2

我假设您要解决的一般问题是如何为设备启用强大的 HTTPS,以供内部和外部客户端使用,并且您实际上并不关心它是否有两个不同的名称。如果是这样,您可能还有另一种选择。如果您可以控制内部网络的 DNS 服务器,则可以让它解析home.notarealdomainname.com为内部客户端的内部 IP 地址。然后,您只需要一个公共名称的证书,就可以使用该名称在内部和外部访问它。以下是我在 Ubuntu Server 14.04 上的 BIND 中执行此操作的方法:

/etc/bind/rc.conf.local

...

zone "home.notarealdomainname.com" in {
    type master;
    file "/var/lib/bind/db.home.notarealdomainname.com"
}

...

/var/lib/bind/db.home.notarealdomainname.com

$ORIGIN .
$TTL  86400
home.notarealdomainname.com    IN SOA dnsserver.domain.local. myemail.emaildomain.com. (
                               1       ; serial
                               86400   ; refresh (1 day)
                               3600    ; retry (1 hour)
                               172800  ; expire (2 days)
                               3600    ; minimum (1 hour)
                               )
                      NS       dnsserver.domain.local.
$ORIGIN home.notarealdomainname.com.
@                         A        192.168.1.123

基本上,它会告诉您的本地 DNS 服务器(这里假设为dnsserver.domain.local),它是该区域的权威机构home.notarealdomainname.com(但不是notarealdomainname.com,因此它不会干扰该域中的其他主机),并192.168.1.123为其返回 NAS 的本地 IP(这里假设为)。

答案3

我想安装 SNI 证书

不存在 SNI 证书。这是 TLS 扩展,这意味着服务器名称在 中发送ClientHello


证书同时支持主机名 nas.domain.local 和 home.notarealdomainname.com。

由于以下原因,CA 可能不会颁发该证书nas.domain.local

但它的不是我很清楚,根据CA/浏览器 (CA/B) 基线要求文档(CA 和浏览器按照 CA/B 论坛中达成的协议进行操作;它们不遵循 IETF 或 RFC 中的任何内容)。

由于home.notarealdomainname.com,您将满足第 11.1.1 节“域名注册人授权”的规定。第 11.3 节禁止*.local,但这是由于通配符(而不是本地名称)造成的。

由于我找不到禁止 CA 颁发证书的地方,因此您应该向 CA 询问是否可以颁发包含本地名称(除了您控制的公共名称之外)的证书。


我不想颁发自己的证书,因为为了方便使用,我希望浏览器信任该证书。

您应该执行以下步骤(即使您不太想这样做):

  1. 创建自己的 CA
  2. 创建一个 CSR,其中包含您希望服务器拥有的所有名称
  3. 根据 CSR 颁发证书
  4. 使用你的 CA 签署证书
  5. 在您的设备和机器上安装 CA

浏览器和证书存储区中的预先信任的 CA 列表与您的 CA 之间的唯一区别是您必须手动安装您的 CA。

nas.domain.local如果您需要使用 OpenSSL 创建具有多个主题备用名称(如和)的 CSR home.notarealdomainname.com,请参阅 Stack Overflow 上的以下问题:具有扩展密钥用法的证书仅适用于 Firefox。具体请参见OpenSSL 配置文件


最后,这是物联网的一个已知问题;目前缺乏解决方案。它最近在 Web 应用安全邮件列表中被提出。请参阅提案:将 HTTP 标记为不安全

我想建议考虑第四类:个人
设备(家用路由器、打印机、物联网、教室里的树莓派、
冰箱):
- 本质上不能参与 DNS 和 CA 系统
- 可能在私人网络块上
- 用户是服务的所有者,因此可以信任自己而不是 CA

相关内容