如何让LetsEncrypt在ASP.Net Core Razor页面中工作?

时间:2018-01-16 00:03:22

标签: asp.net-core-2.0 lets-encrypt razor-pages

如何让ASP.Net Core Razor Pages符合letsencrypt.com对“握手”的要求?我曾尝试使用适用于MVC的解决方案,但路由完成的方式在Razor Pages中不起作用。

1 个答案:

答案 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;
        }
    }
}