如何将 LetsEncrypt ID 作为文件写入 .net 8.0 中的“.well-known/acme-challenge”文件夹中?

问题描述 投票:0回答:1

解释

我有一个主网站:https://example.com,使用 .Net 8.0 Razor Pages 构建。

我想在启动时创建(如果不存在)acme-challenge 文件夹

当 ID 被发送到 acme-challenge url 时,

它会在 acme-challenge 文件夹中创建一个具有该 ID 的文件。

通过遵循许多网站教程,我已经成功完成了这一点。

当我向挑战传递随机 ID 时,我收到如下所示的错误(文件不存在)。

如果文件存在,它就会读取该文件,就可以了。

我不明白这个功能缺少什么。

问题

如何正确完成此操作,使其发挥作用?

我尝试过的代码: 在Program.cs中:

    app.UseStaticFiles();

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @".well-known")),
    RequestPath = new PathString("/.well-known"),
    ServeUnknownFileTypes = true // serve extensionless file
});

// 处理让加密路由(在 MVC 处理之前!)

app.UseRouter(r =>
{
    r.MapGet(".well-known/acme-challenge/{id}", async (request, response, routeData) =>
    {
        var id = routeData.Values["id"] as string;
        var file = Path.Combine(Directory.GetCurrentDirectory(), ".well-known", "acme-challenge", id);
        await response.SendFileAsync(file);
    });
});

app.UseRouting();

在WEBNET8.proj上:

诗。由于不知道哪一种有效,我尝试了多种组合。如下。

  <ItemGroup>
      <Content Include="wwwroot\.well-known\**">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
      <Folder Include="wwwroot\.well-known\acme-challenge\" />
      <Content Include=".well-known\acme-challenge\**">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
  </ItemGroup>

我得到的错误:

fail: Microsoft.AspNetCore.Server.Kestrel[13]
  Connection id "0HN8GK882NCBE", Request id "0HN8GK882NCBE:00000021": An unhandled exception was thrown by the application.
  System.IO.FileNotFoundException: Could not find file 'D:\source\repos\WEBNET8\WEBNET8\WEBNET8\.well-known\acme-challenge\ftf75rf7t7rfvovr8oiv8o'.
  File name: 'D:\source\repos\WEBNET8\WEBNET8\WEBNET8\.well-known\acme-challenge\ftf75rf7t7rfvovr8oiv8o'
     at System.IO.FileInfo.get_Length()
c# asp.net asp.net-mvc asp.net-core
1个回答
0
投票

实际上你的代码片段按照设计工作:你从不检查

.well-known/acme-challenge
中的文件是否存在,你盲目地尝试发送文件内容,记录的错误是逻辑结果。

您在

app.UseRouter
中所做的事情是一个非常糟糕的想法:潜在的攻击者通过在
../../else-notaccessible.conf
参数中提交诸如
id
之类的内容来读取您服务器上的任意文件(至少在wwwroot下)。

© www.soinside.com 2019 - 2024. All rights reserved.