如何让ASP.Net Core Razor Pages符合letsencrypt.com对“握手”的要求?我曾尝试使用适用于MVC的解决方案,但路由完成的方式在Razor Pages中不起作用。
答案 0 :(得分:4)
我从Royal Jay网站的this excellent tutorial开始。 向Web应用程序添加路径是我的解决方案与普通MVC应用程序不同的地方。由于您必须每3个月获得一份新的SSL证书,因此我将此解决方案配置为可更改密钥最终变得非常简单。
在我的 appsettings.json 文件中,我为LetsEncrypt添加了以下条目:
"LetsEncrypt": {
"Key": "the entire key from your letsencrypt initial session goes here"
}
此处的条目是您从 letsencrypt-auto 可执行文件中收到的完整键(它是Royal Jay教程中的第二个带红色下划线的部分)。< / p>
为了将配置属性传递给将处理来自LetsEncrypt的握手的页面,我创建了一个新的接口和一个将保存密钥的小类:
<强>接口强>
using System;
using System.Collections.Generic;
using System.Text;
namespace Main.Interfaces
{
public interface ILetsEncryptKey
{
string GetKey();
}
}
<强>类别:强>
using Main.Interfaces;
namespace Main.Models
{
public class LetsEncryptKey : ILetsEncryptKey
{
private readonly string _key;
public LetsEncryptKey(string key) => _key = key;
public string GetKey() => _key;
}
}
然后在 startup.cs 文件中,我将这些行添加到 ConfigureServices 部分:
var letsEncryptInitialKey = Configuration["LetsEncrypt:Key"];
services.AddMvc().AddRazorPagesOptions(options =>
{
options.Conventions.AddPageRoute("/LetsEncrypt", $".well-known/acme-challenge/{letsEncryptInitialKey.Split('.')[0]}");
});
services.AddSingleton<ILetsEncryptKey>(l => new LetsEncryptKey(letsEncryptInitialKey));
现在我们唯一要做的就是创建将处理握手请求并返回响应的页面。
<强> LetsEncrypt.cshtml.cs:强>
using Main.Interfaces;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace RazorPages.Pages
{
public class LetsEncryptModel : PageModel
{
private readonly ILetsEncryptKey _letsEncryptKey;
public LetsEncryptModel(ILetsEncryptKey letsEncryptKey)
{
_letsEncryptKey = letsEncryptKey;
}
public ContentResult OnGet()
{
var result = new ContentResult
{
ContentType = "text/plain",
Content = _letsEncryptKey.GetKey()
};
return result;
}
}
}