Как создать сертификат подписи и использовать его в IdentityServer4 на производстве? - PullRequest
1 голос
/ 27 сентября 2019

Большинство (все?) Примеров кода на сайте документов IdentityServer4 использует AddDeveloperSigningCredential (), но рекомендует вместо этого использовать AddSigningCredential () в производстве.Я потратил больше времени, чем хотел бы, чтобы попытаться выяснить, как это сделать, поэтому я решил опубликовать здесь свое решение, если кто-то посчитает его полезным и / или сможет предложить лучшее решение.

1 Ответ

2 голосов
/ 27 сентября 2019

Создание сертификата и добавление в хранилище сертификатов машины

Я решил создать сертификат и добавить его в хранилище сертификатов машины.У Брока Аллена есть запись в блоге 2015 года здесь , описывающая, как создать сертификат с помощью MakeCert.Однако согласно документации Microsoft MakeCert она устарела.Поэтому я решил вместо этого использовать апплет PowerShell New-SelfSignedCertificate ( MS docs ).Я перевел команду MakeCert Брока, чтобы использовать параметры New-SelfSignedCertificate, и завершил эту команду PowerShell:

    New-SelfsignedCertificate -KeyExportPolicy Exportable -Subject "CN=MyIdsvCertificate" -KeySpec Signature -KeyAlgorithm RSA -KeyLength 2048 -HashAlgorithm SHA256 -CertStoreLocation "cert:\LocalMachine\My"

Если вы хотите проверить правильность установки сертификата, из командной строки Run запустите «mmc»,перейдите в «Файл», «Добавить / удалить оснастку», выберите «Сертификаты», нажмите «Добавить», выберите «Учетная запись компьютера», «Далее», «Локальные вычисления», «Готово», «ОК».Затем перейдите в раздел Сертификаты \ Личные \ Сертификаты, для MyIdsvCertificate должен быть выдан один.

Предоставление разрешений для сертификата

После создания сертификата необходимо предоставитьразрешение на чтение для любого удостоверения Windows, на котором работает IIS (или для всего, что обслуживает ваше приложение IdentityServer), в противном случае вы получаете сообщение об ошибке «Keyset not существует», когда IdentityServer пытается использовать ключ.Для этого найдите папку% ALLUSERSPROFILE% \ Microsoft \ Crypto \ RSA \ MachineKeys, найдите файл с отметкой времени, совпадающей с временем создания сертификата, затем предоставьте чтение доступ (больше ничего не нужно) кИдентификация Windows под управлением IIS.Эта проблема обсуждается на форуме IdentityServer4 GitHub Issues и объясняется Броком Алленом и Домиником Байером.Если вы такой гений, как Брок или Доминик, тогда этого объяснения могло бы быть достаточно, но манекены, подобные мне, могли бы найти более понятное объяснение и решение для очень похожей проблемы на сайте поддержки Microsoft 1025 * более полезным.

Скажите IdentityServer использовать сертификат

Тяжелая работа завершена.Осталось только сказать IdentityServer использовать сертификат, когда он не находится в разработке:

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
        // Configure some awesome services
        // ...

        var identityServer = services.AddIdentityServer(...options...)...AddStuff()...;

        if (_env.IsDevelopment())
        {
            identityServer.AddDeveloperSigningCredential();
        }
        else
        {
            identityServer.AddSigningCredential("CN=MyIdsvCertificate");
        }

        // ...
        // Configure more awesome services
        // ...
    }

Обратите внимание, что бит "CN =" требуется при вызове AddSigningCredential (), что также стоит мне некоторое время.Я на самом деле получаю имя из файла конфигурации во время выполнения, но нам не нужно вдаваться в подробности здесь.

...