Как заставить ASP.Net Core Razor Pages соответствовать тому, что требует letsencrypt.com для «рукопожатия»? Я пытался использовать решение, которое работает с MVC, но способ выполнения маршрута не работал в Razor Pages.
Как заставить LetsEncrypt работать в ASP.Net Core Razor Pages?
Ответы (1)
Я начал с отличного руководства от Royal Jay. сайт. Добавление маршрута в веб-приложение — вот где мое решение отличается от обычного приложения MVC. Поскольку вам нужно получать новый SSL-сертификат каждые 3 месяца, я сделал это решение настраиваемым, чтобы смена ключа была довольно простой.
В моем файле appsettings.json я добавил следующую запись для LetsEncrypt:
"LetsEncrypt": {
"Key": "the entire key from your letsencrypt initial session goes here"
}
Запись здесь представляет собой полный ключ, который вы получаете обратно из исполняемого файла letsencrypt-auto (это второй подчеркнутый красным раздел в руководстве по Royal Jay).
Чтобы передать свойство конфигурации на страницу, которая будет обрабатывать рукопожатие от 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;
}
}
}