65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Let's Encrypt 的内部 SSL 证书

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2022年4月21日

CPOL

6分钟阅读

viewsIcon

19377

我最近读了一篇关于子域枚举服务的优秀文章,这让我想到了 Let's Encrypt 和内部域。

我最近读了一篇关于子域枚举服务的优秀文章,这让我想到了 Let's Encrypt 和内部域。通常会采用一种分割域设置,即为 Internet 可访问服务和 Active Directory 使用同一个域,由您自己或其他人提供外部 DNS 解析,您的域控制器提供内部 DNS 解析。自从我开始使用 Active Directory (AD) 以来,我一直采用分割域设置;这让用户和管理员都更方便。

注意:在整篇文章中,当我提到“内部 DNS”时,我指的是配置在您的 Active Directory 域控制器上、仅从 LAN 可访问且 Internet 不可访问的 DNS 区域。在本篇文章中,我假设您使用的是分割 DNS 配置,您的 DNS 区域有一个副本可供 Internet 访问,而第二个独立的区域仅供 LAN 用户访问。在我看来,这种设置比使用不存在的顶级域更可取。

在 Active Directory 的早期,没有免费的外部签名证书来源。一些商业证书颁发机构(CA)——Network Associates、Comodo 等——每年收取 100 美元以上为一个证书收费,并在颁发前需要对业务所有权进行物理确认。有些会颁发通配符证书(有时需要额外的验证),并且通常会为此额外收费。因此,内部网站要么保持仅 HTTP,要么在其购买的通配符证书中获取一份副本。在较小的环境(例如我们大多数单独管理员居住的环境)中,这个问题的影响范围有限,但在较大的环境中则不然。我在几个大型组织中遇到的关于通配符证书的一个实际问题是,IT 的每个团队似乎都拥有证书和私钥的副本。它用于保护 Internet 上的站点、外部网、内部网、开发服务器、开发人员工作站、测试应用程序、电子邮件服务,等等。每年(或每 2-3 年)当该证书过期时,新的证书(包括私钥!)会在公司内部流传的次数比圣诞派对的指示还多。如果出现吊销或重新颁发证书的理由,这个过程就会重复。证书(最重要的是私钥)绝对没有任何安全保障。由于它部署在许多不安全的系统上,攻击面变得非常广阔,容易被攻击。

在早期,通配符证书的另一面是来自运行 Active Directory 证书服务 (AD CS) 的 Active Directory 证书颁发机构 (CA) 颁发的私有签名(但有效)证书。它相对容易设置,并且在企业 LAN 上,根证书信任易于管理。AD CS 还通过 AD 提供身份管理、生命周期管理、客户端身份验证以及通过组策略进行集中管理。唯一的缺点?如果您的机器不是 Windows、不是域成员、或者无法与 AD 通信,您就又回到了原点。

对于单独的管理员来说,AD CS 基础设施是过度配置的;我们大多数人真正需要的是适用于内部和外部域的有效 SSL 证书。通配符证书选项并不是一个糟糕的解决方案,但由于上述原因,我对颁发通配符证书持谨慎态度,特别是用于保护内部和外部——以及开发和生产——系统。每年花费 500 或 600 美元购买证书并不会破产,但如果您真的预算有限,保护开发站点的优先级就不会很高。Let's Encrypt 登场。

对于不熟悉的人来说,Let's Encrypt 是一个非营利性证书颁发机构,由Internet Security Research Group 于 2013 年创立,其创始赞助商包括 Mozilla、EFF、Cisco 和 Akamai 等。借助 Let's Encrypt,我们现在可以免费获得有效且受信任的 SSL 证书,有了这个能力,现在是时候为内部和外部站点全部启用 SSL 了。虽然有其他获取证书的方法,但我偏爱的方法是在 Linux 上使用 letsencrypt 命令,并在需要时将证书导出为 PKCS12 格式(适用于 Windows)。您需要准备以下内容:

  1. 注册您要为其生成证书的任何 DNS 名称,并且这些条目需要指向可访问 TCP/443 的公共 IP 地址。但是,该端口仅在您请求证书时需要可用;否则可以关闭。
  2. 您需要一台 443 端口上没有运行任何服务的 Linux 系统(或者可以临时停止使用该端口的服务)。
  3. 最后,您需要 letsencrypt 命令;在 Debian/Ubuntu 上,安装它就像 apt-get install letsencrypt 一样简单。

该过程的工作原理是,Let's Encrypt 服务器会查找您正在请求证书的域名的 DNS,并将请求发送到 443 端口的 IP 地址。使用 Linux 上的 letsencrypt 应用程序,会在 TCP/443 上启动一个监听器来响应请求。如果一切顺利,请求将被批准,证书、私钥和中间链将被保存到您的系统中并准备使用。我将以 this site - thesoloadmin.com - 为例来介绍这个过程。

  1. 假设 letsencrypt 已经安装好,我将暂时停止 Web 服务器以请求证书:systemctl stop nginx
  2. 要续订 /etc/letsencrypt/live 下的所有证书,您将使用 renew 标志。但是,由于我只想续订单个证书,我将使用 certonly 标志(您也可以为新的证书请求使用 certonly 标志)。您需要使用 /etc/letsencrypt/live/ 下的目录名作为续订的域名;例如,我的域名是 thesoloadmin.com,尽管该证书包含 thesoloadmin.blog、thesoloadmin.org、thesoloadmin.info 和 thesoloadmin.net 的备用名称。续订单个证书的命令很简单:letsencrypt certonly -d thesoloadmin.com。系统会提示您启动一个临时 Web 服务器或将文件放置在 webroot 目录中;我总是选择临时 Web 服务器选项,因为它最简单。命令的输出将与以下内容类似:
root@server [~]# letsencrypt certonly -d thesoloadmin.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for thesoloadmin.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/thesoloadmin.com-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/thesoloadmin.com-0001/privkey.pem
   Your cert will expire on 2021-06-14. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.openssl.ac.cn/donate
   Donating to EFF:                    https://eff.org/donate-le

命令完成后,您可以再次启动 Web 服务器。您可以使用 openssl 命令查看新证书

root@server [~]# openssl x509 -in /etc/letsencrypt/live/thesoloadmin.com/cert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:3f:ec:10:11:d2:f6:8b:7a:7f:4a:13:1b:91:34:8b:fe:a7
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = R3
        Validity
            Not Before: Dec 29 19:01:03 2020 GMT
            Not After : Mar 29 19:01:03 2021 GMT
        Subject: CN = thesoloadmin.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:af:a3:48:a7:9c:a5:78:4c:81:9c:f4:59:22:82:
                    e2:a6:cd:3b:24:63:7b:70:69:aa:e1:7f:26:d8:8e:
                    99:b7:20:57:29:2c:db:ea:c5:c9:bd:25:11:e7:37:
                    68:3f:7d:6c:d9:5d:d8:55:72:50:cb:d0:ab:87:d7:
                    37:0d:d1:a2:c8:65:db:dc:e7:1f:0d:a0:9f:aa:21:
                    ef:99:9e:6d:6d:0c:57:c6:2a:98:8c:9e:58:34:ea:
                    91:63:ff:86:89:c6:58:1a:f0:8f:88:cb:c1:08:45:
                    e1:da:42:a9:a5:5c:6c:10:64:e9:3d:43:47:0c:cf:
                    e2:03:44:42:1a:3f:aa:7c:0f:84:1d:c7:ec:9c:62:
                    69:e0:3d:3d:a4:7a:e5:fd:70:e4:14:a8:c4:c1:98:
                    17:78:bf:98:22:b3:2a:15:47:5a:98:f2:1d:9f:9a:
                    5c:b6:29:7b:43:b2:aa:4d:d2:09:28:cc:e8:d0:77:
                    10:fa:d5:75:93:00:6f:5b:77:0c:e1:99:37:03:7f:
                    78:27:fb:76:70:09:36:64:4a:fc:c0:b8:39:39:29:
                    70:72:34:5b:53:e4:34:9c:10:63:d2:ea:96:26:94:
                    fc:bc:3b:c2:26:1b:68:26:ff:2a:21:ae:8d:00:b6:
                    71:b4:6f:5b:7a:af:f8:db:7a:1c:e6:5c:8f:55:47:
                    ca:d5
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                5A:FD:71:F6:63:73:34:62:5D:0D:CC:08:5E:67:96:A3:85:92:59:75
            X509v3 Authority Key Identifier:
                keyid:14:2E:B3:17:B7:58:56:CB:AE:50:09:40:E6:1F:AF:9D:8B:14:C2:C6

            Authority Information Access:
                OCSP - URI:http://r3.o.lencr.org
                CA Issuers - URI:http://r3.i.lencr.org/

            X509v3 Subject Alternative Name:
                DNS:soloadmin.org, DNS:thesoloadmin.blog, DNS:thesoloadmin.com, 
                DNS:thesoloadmin.info, DNS:thesoloadmin.net, DNS:thesoloadmin.org, 
                DNS:thesoloadmin.us
            X509v3 Certificate Policies:
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.44947.1.1.1
                  CPS: http://cps.letsencrypt.org

            CT Precertificate SCTs:
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : 44:94:65:2E:B0:EE:CE:AF:C4:40:07:D8:A8:FE:28:C0:
                                DA:E6:82:BE:D8:CB:31:B5:3F:D3:33:96:B5:B6:81:A8
                    Timestamp : Dec 29 20:01:04.006 2020 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:20:1F:B4:34:11:3A:8C:AD:E6:27:E1:8C:7E:
                                95:A9:CE:A5:80:86:B8:F2:93:20:C1:BC:64:EC:DE:46:
                                7E:5F:14:56:02:21:00:B9:39:E1:77:8F:49:E3:85:E2:
                                93:5A:84:24:C6:8F:39:2F:BC:30:04:E7:73:22:73:11:
                                32:E2:44:5E:0D:92:AF
                Signed Certificate Timestamp:
                    Version   : v1 (0x0)
                    Log ID    : F6:5C:94:2F:D1:77:30:22:14:54:18:08:30:94:56:8E:
                                E3:4D:13:19:33:BF:DF:0C:2F:20:0B:CC:4E:F1:64:E3
                    Timestamp : Dec 29 20:01:03.984 2020 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:46:02:21:00:9A:78:46:0B:13:0E:60:6C:B4:B4:0C:
                                C7:2E:D3:BE:DB:39:13:94:8B:5D:A4:76:D4:9E:D4:85:
                                17:4B:EE:24:1A:02:21:00:C0:75:99:19:6D:CA:F5:1F:
                                B7:14:7B:E0:30:2C:D7:0C:6F:60:CD:89:DD:7A:18:0F:
                                CA:C1:51:D7:FE:48:F9:78
    Signature Algorithm: sha256WithRSAEncryption
         0a:27:63:6c:ea:b7:a5:47:76:51:a5:71:02:90:bf:69:80:2d:
         e0:5c:30:96:00:24:8f:94:dc:1e:d7:2f:e2:35:8e:30:10:72:
         e1:b8:01:c0:d6:b7:ab:c6:b6:82:89:d8:96:50:8b:bb:1e:01:
         a7:e8:41:dd:02:a5:dd:8f:c2:31:a4:c4:4e:0d:f6:d7:6a:6b:
         1e:2a:51:0d:15:87:85:ef:7e:38:4b:21:ee:a3:08:49:74:91:
         fe:be:e7:45:4b:7f:33:2b:5d:68:21:d2:d6:44:71:eb:d3:87:
         72:e5:92:9f:93:6a:11:17:eb:30:6d:86:7d:7b:c0:45:31:ac:
         b7:23:98:0f:1b:e1:61:c3:8d:bd:c4:4a:fe:b9:94:33:45:c8:
         71:9d:d2:81:d6:9d:d6:f1:e4:4f:c6:7a:a4:fe:90:5d:f2:33:
         33:20:32:cf:2b:59:fe:90:18:1f:75:9d:40:4e:7a:c8:86:cf:
         37:9c:cb:6e:bf:06:25:de:22:1c:56:d0:83:54:8d:23:60:03:
         15:68:60:10:32:ca:2a:87:f5:6e:7c:27:68:6e:96:05:99:d6:
         04:2e:10:89:65:63:fe:1b:cc:3b:b3:b4:00:7b:6d:03:57:e5:
         51:1a:b2:41:1a:f8:82:ec:0f:b3:9e:c6:a7:49:16:9c:92:76:
         d5:03:4b:9b 

您可以通过添加多个“-d”开关为任何内部域的组合(每个证书最多 10 个)颁发证书。例如,您可以将所有开发站点合并到一个证书中,所有生产站点,所有实用站点等——无论在您的环境中何种组合有意义。我个人喜欢拥有多个子域证书(而不是单个通配符证书),原因如上所述。获得证书后,只需将其移动到内部服务器上需要的地方即可。您也可以将其导出为 PKCS12 格式以在 Windows 上使用,同样使用 openssl 命令:openssl pkcs12 -export -out mydomain.pfx -inkey privkey.pem -in cert.pem -certfile chain.pem。系统会提示您输入一个密码来保护输出文件中包含的私钥,该文件将在导入到 Windows 时使用。

简而言之,这是启用所有内部和外部网站 SSL 最简单(也是最便宜)的方法。尽管 letsencrypt 包支持自动续订,但我个人更喜欢手动续订,并通过 cron 禁用自动续订。在 2021 年,没有任何借口不为所有由您控制的网站启用 SSL,并让用户习惯于看到锁形图标,同时让他们改掉接受证书警告的习惯。

© . All rights reserved.