Letsencrypt acme-challenge on wordpress 或 asp.net mvc
Letsencrypt acme-challenge on wordpress or asp.net mvc
我一直在尝试使用 Let's Encrypt 为我的公司生成安全证书,但没有成功。我公司的主要网站使用 WordPress 3.9.7,我不允许升级到更新的版本,因为这是由第三方公司处理的。
该网站 运行 基于 Windows Server 2008 R2 上的 Internet Information Services 7.5。
我的问题是:如何使 wordpress 句柄 http://www.company.com/.well-known/acme-challenge/mftvrU2brecAXB76BsLEqW_SL_srdG3oqTQTzR5KHeA
?
我已经创建了一个新的空页面和一个新模板,returns 正是 let's encrypt 所期待的,但 wordpress 一直为该页面返回 404。我的猜测是问题出现在路由开头的点 (.) (".well-known") 但我不知道如何在 wordpress 上解决这个问题。
我还可以使用 asp.net mvc 网站并使 IIS 指向该网站一段时间。虽然这不是一个好主意,因为客户可能在几分钟内无法访问我们的网站,但仍然是一种选择。那么问题是:如何创建名称开头带有点(“。”)的控制器或路由?
非常感谢您的帮助。
对于 ASP.Net MVC 或 Web 窗体,使用某些路由配置,您最终会将此 URL 视为路由引擎传递给 MVC/Forms 处理程序的东西,不是静态文件 return。结果将是 404 或 503。解决方案非常简单:
如果您还没有,请放置挑战文件:
- 创建必要的目录 -
.well-known
很棘手 mostly because Microsoft is lazy, but you can either do it from cmdline or create the folder as .well-known.
and Windows Explorer will notice the workaround and remove the trailing period for you。
- 在
\.well-known\acme-challenge
中放置具有正确名称和内容的挑战文件。您可以随心所欲地进行这一部分;我碰巧用 Git Bash 就像 echo "oo0acontents" > abcdefilename
然后在 acme-challenge 目录中创建一个 Web.Config 文件,内容如下:
<?xml version = "1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<staticContent>
<clear />
<mimeMap fileExtension = ".*" mimeType="text/json" />
</staticContent>
<handlers>
<clear />
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule"
resourceType="Either" requireAccess="Read" />
</handlers>
</system.webServer>
</configuration>
来源:https://github.com/Lone-Coder/letsencrypt-win-simple/issues/37
完成。该文件将开始 returning 而不是 404/503 允许挑战完成 - 您现在可以提交并验证您的域。
旁白:上面的代码片段将内容类型设置为 json,这是一个与 letsencrypt 不再相关的历史要求。目前的要求是没有要求 - 你可以发送 pantsless/elephants 的内容类型,它仍然有效。
更多 Asp.Net
我喜欢将所有 HTTP 请求重定向回 HTTPS,以确保用户最终获得安全连接,即使他们不知道要问。在您使用 LetsEncrypt 之前,有很多简单的方法可以做到这一点——因为您将中断对 .well-known 的请求。您可以在 class 中设置静态方法,如下所示:
public static class HttpsHelper
{
public static bool AppLevelUseHttps =
#if DEBUG
false;
#else
true;
#endif
public static bool Application_BeginRequest(HttpRequest Request, HttpResponse Response)
{
if (!AppLevelUseHttps)
return false;
switch (Request.Url.Scheme)
{
case "https":
return false;
#if !DEBUG
case "http":
var reqUrl = Request.Url;
var pathAndQuery = reqUrl.PathAndQuery;
// Let's Encrypt exception
if (pathAndQuery.StartsWith("/.well-known"))
return false;
//
var url = "https://" + reqUrl.Host + pathAndQuery;
Response.Redirect(url, true);
return true;
#endif
}
return false;
}
}
现在可以很好地重定向到 HTTPS,除非 LetsEncrypt 来敲门。把它绑起来,在 Global.asax.cs:
protected void Application_BeginRequest(object sender, EventArgs ev)
{
HttpsHelper.Application_BeginRequest(Request, Response);
}
注意布尔 returned 在这里被丢弃了。如果你想决定是否立即结束request/response,你可以使用它,真正的意思,结束它。
最后,如果您愿意,可以根据需要使用 AppLevelUseHttps 变量关闭此行为,例如测试在没有 HTTPS 的情况下是否正常工作。例如,您可以将其设置为 Web.Config 变量的值。
我一直在尝试使用 Let's Encrypt 为我的公司生成安全证书,但没有成功。我公司的主要网站使用 WordPress 3.9.7,我不允许升级到更新的版本,因为这是由第三方公司处理的。 该网站 运行 基于 Windows Server 2008 R2 上的 Internet Information Services 7.5。 我的问题是:如何使 wordpress 句柄 http://www.company.com/.well-known/acme-challenge/mftvrU2brecAXB76BsLEqW_SL_srdG3oqTQTzR5KHeA ? 我已经创建了一个新的空页面和一个新模板,returns 正是 let's encrypt 所期待的,但 wordpress 一直为该页面返回 404。我的猜测是问题出现在路由开头的点 (.) (".well-known") 但我不知道如何在 wordpress 上解决这个问题。
我还可以使用 asp.net mvc 网站并使 IIS 指向该网站一段时间。虽然这不是一个好主意,因为客户可能在几分钟内无法访问我们的网站,但仍然是一种选择。那么问题是:如何创建名称开头带有点(“。”)的控制器或路由? 非常感谢您的帮助。
对于 ASP.Net MVC 或 Web 窗体,使用某些路由配置,您最终会将此 URL 视为路由引擎传递给 MVC/Forms 处理程序的东西,不是静态文件 return。结果将是 404 或 503。解决方案非常简单:
如果您还没有,请放置挑战文件:
- 创建必要的目录 -
.well-known
很棘手 mostly because Microsoft is lazy, but you can either do it from cmdline or create the folder as.well-known.
and Windows Explorer will notice the workaround and remove the trailing period for you。 - 在
\.well-known\acme-challenge
中放置具有正确名称和内容的挑战文件。您可以随心所欲地进行这一部分;我碰巧用 Git Bash 就像echo "oo0acontents" > abcdefilename
然后在 acme-challenge 目录中创建一个 Web.Config 文件,内容如下:
<?xml version = "1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<staticContent>
<clear />
<mimeMap fileExtension = ".*" mimeType="text/json" />
</staticContent>
<handlers>
<clear />
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule"
resourceType="Either" requireAccess="Read" />
</handlers>
</system.webServer>
</configuration>
来源:https://github.com/Lone-Coder/letsencrypt-win-simple/issues/37
完成。该文件将开始 returning 而不是 404/503 允许挑战完成 - 您现在可以提交并验证您的域。
旁白:上面的代码片段将内容类型设置为 json,这是一个与 letsencrypt 不再相关的历史要求。目前的要求是没有要求 - 你可以发送 pantsless/elephants 的内容类型,它仍然有效。
更多 Asp.Net
我喜欢将所有 HTTP 请求重定向回 HTTPS,以确保用户最终获得安全连接,即使他们不知道要问。在您使用 LetsEncrypt 之前,有很多简单的方法可以做到这一点——因为您将中断对 .well-known 的请求。您可以在 class 中设置静态方法,如下所示:
public static class HttpsHelper
{
public static bool AppLevelUseHttps =
#if DEBUG
false;
#else
true;
#endif
public static bool Application_BeginRequest(HttpRequest Request, HttpResponse Response)
{
if (!AppLevelUseHttps)
return false;
switch (Request.Url.Scheme)
{
case "https":
return false;
#if !DEBUG
case "http":
var reqUrl = Request.Url;
var pathAndQuery = reqUrl.PathAndQuery;
// Let's Encrypt exception
if (pathAndQuery.StartsWith("/.well-known"))
return false;
//
var url = "https://" + reqUrl.Host + pathAndQuery;
Response.Redirect(url, true);
return true;
#endif
}
return false;
}
}
现在可以很好地重定向到 HTTPS,除非 LetsEncrypt 来敲门。把它绑起来,在 Global.asax.cs:
protected void Application_BeginRequest(object sender, EventArgs ev)
{
HttpsHelper.Application_BeginRequest(Request, Response);
}
注意布尔 returned 在这里被丢弃了。如果你想决定是否立即结束request/response,你可以使用它,真正的意思,结束它。
最后,如果您愿意,可以根据需要使用 AppLevelUseHttps 变量关闭此行为,例如测试在没有 HTTPS 的情况下是否正常工作。例如,您可以将其设置为 Web.Config 变量的值。