Azure LetsEncrypt无法访问我的函数的.well-known / acme-challenge

时间:2019-05-28 01:15:02

标签: azure ssl-certificate azure-functions lets-encrypt

我正在尝试使用letsencrypt网站扩展名(如here中所述)来为我的azure功能启用SSL。我正在该Wiki和此website上按照说明进行操作。

但是,当它尝试验证网站时出现错误。

该错误表明无法访问acme-challenge页面(404)。

这是我在web.config下的.well-known/

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <clear />
      <add name="ACMEStaticFile" path="*" verb="*" modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
    </handlers>
    <staticContent>
      <remove fileExtension="." />
      <mimeMap fileExtension="." mimeType="text/plain" />
    </staticContent>
  </system.webServer>
  <system.web>
    <authorization>
      <allow users="*"/>
    </authorization>
  </system.web>
</configuration>

有人对可能出什么问题有任何想法吗?

2 个答案:

答案 0 :(得分:3)

这是您可以做到的方式。

在函数应用中,为挑战目录创建新的代理(这是必需的,因为挑战将是http到达/.well-known/acme-challenge /,并且默认情况下,函数应用中的函数只会在{ {1}}。

您可以通过以下方式设置代理。 enter image description here

proxies.json

/api/

这里的重要设置是路由模板:{ "$schema": "http://json.schemastore.org/proxies", "proxies": { "LetsEncryptProxy": { "matchCondition": { "route": "/.well-known/acme-challenge/{code}" }, "backendUri": "http://%WEBSITE_HOSTNAME%/api/letsencrypt/.well-known/acme-challenge/{code}" } } } ,它将匹配所有发送到质询目录的请求。

请注意,代理是预览功能,必须启用它才能使其正常工作。

参考: https://github.com/sjkp/letsencrypt-siteextension/wiki/Azure-Functions-Support https://blog.bitscry.com/2018/07/06/using-lets-encrypt-ssl-certificates-with-azure-functions/

答案 1 :(得分:0)

我知道了:

类似于KetanChawda-MSFT的答案,除了代理需要点击您创建的api端点函数。

所以这是函数:

// https://YOURWEBSITE.azurewebsites.net/api/letsencrypt/{code}

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, string code, TraceWriter log)
{    
    log.Info($"C# HTTP trigger function processed a request. {code}");

    var content = File.ReadAllText(@"D:\home\site\wwwroot\.well-known\acme-challenge\"+code);
    var resp = new HttpResponseMessage(HttpStatusCode.OK);
    resp.Content =  new StringContent(content, System.Text.Encoding.UTF8, "text/plain");
    return resp;
}

这是当letEncrypt尝试验证acme挑战时触发该功能的代理:

{
  "$schema": "http://json.schemastore.org/proxies",
  "proxies": {
    "LetsEncryptProxy": {
      "matchCondition": {
        "route": "/.well-known/acme-challenge/{code}"
      },
      "backendUri": "http://%WEBSITE_HOSTNAME%/api/letsencrypt/{code}"
    }
  }
}