Как заставить LetsEncrypt работать в ASP.Net Core Razor Pages?

Как заставить ASP.Net Core Razor Pages соответствовать тому, что требует letsencrypt.com для «рукопожатия»? Я пытался использовать решение, которое работает с MVC, но способ выполнения маршрута не работал в Razor Pages.


person Rob    schedule 16.01.2018    source источник


Ответы (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;
        }
    }
}
person Rob    schedule 16.01.2018
comment
Как я могу установить его как для www, так и без www - person Naresh Bisht; 22.04.2020