从子域名重写 iis 中的 URL,以便 letsencrypt 能够找到质询密钥

从子域名重写 iis 中的 URL,以便 letsencrypt 能够找到质询密钥

我对上述内容有疑问。基本上,我有一个 webmail.domain.com,我使用 IIS 重定向到它。

但是,当需要更新证书时,我必须手动禁用 Webmail 规则,然后运行客户端。否则,它不会更新 webmail.example.com 的证书,因为它正在 example.com/.well-known/acme-challenge 下查找,但它被重定向到不存在的 webmail.example.com/.well-known/acme-challenge。

因此,我编写了一条规则来重写 URL,以便任何查找 /.well-known 的内容都将被重写为https://example.com/.well-known/acme-challenge/whateverthekeyis

它似乎正确地重写了 URL,但是文件没有被提供。这让我有点困惑。如果我禁用重写规则(除了 Webmail 规则),它就可以很好地完成挑战,所以我不太确定问题是什么。acme-challenge 中有一个用于提供无扩展名文件的 Webconfig,我也在 iis 中设置了它。URL 和物理路径似乎都是正确的。但是,它显然没有提供文件。

当我尝试使用重写规则访问 URL 并将 webmail.example.com 重写为 example.com 时,出现 404.4 未找到错误。

您正在寻找的资源没有与之关联的处理程序。

最可能的原因:

The file extension for the requested URL does not have a handler configured to process the request on the Web server.

请求的 URL https://example.com:443/.well-known/acme-challenge/X2cp9qv-ymePYfNERRjh5n8pmxvlvWxMqZUhyaSL

物理路径 C:\inetpub\wwwroot\.well-known\acme-challenge\X2cp9qv-ymePYfNERRjh5n8pmxvlvWxMqZUhyaSL

但是,如果没有重写规则,我就可以从浏览器访问该 URL。

有任何想法吗?

答案1

请不要对包含 acme-challenges 的文件夹使用重定向。

如果您尝试按照预期的方式重定向请求,则有多种原因会阻止通过 HTTP 进行 Let's Encrypt 域验证:

  1. 您想要验证特定域。重定向至另一个域将阻止验证。
  2. 重定向到/强制使用 HTTPS 将阻止验证。验证机器人将仅通过 HTTP 进行检查。
  3. 每次重定向都会阻止验证。机器人不会遵循重定向。

如果您安装了重写模块,我建议为 acme-challenge 文件夹使用以下 IIS web.config。它会禁用此文件夹的重写/重定向,为无扩展名文件添加 mimetype,并确保使用静态文件处理程序:

<?xml version="1.0" encoding="UTF-8"?>
  <configuration>
   <system.webServer>
     <staticContent>
         <mimeMap fileExtension="." mimeType="text/plain" />
     </staticContent>
     <handlers>
         <clear />
         <add name="StaticFile" path="*" verb="*" type=""
                 modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule"
                 scriptProcessor="" resourceType="Either" requireAccess="Read"
                 allowPathInfo="false" preCondition="" responseBufferLimit="4194304" />
     </handlers>
    <rewrite>
        <rules>
            <clear />
        </rules>
    </rewrite>
  </system.webServer>
</configuration>

对于没有重写模块的服务器,您可以跳过该<rewrite>部分。

希望这有帮助,祝你好运!

相关内容