Руководство по Thinktecture IdentityServer v3 - сертификаты

Я работаю над демонстрацией Thinktecture IdentityServer v3. Цель состоит в том, чтобы сервер идентификации работал как собственный сайт под Лазурными сайтами.

Там будут другие (более одного) веб-сайты Azure, которые будут использовать сервер идентификации для аутентификации пользователей.

Основываясь на начатом пошаговом руководстве (см. https://github.com/thinktecture/Thinktecture.IdentityServer.v3/wiki/Getting-started) У меня это в основном работает.

Если у меня возникают проблемы с сертификатами.

Для демонстрации я хотел бы создать свой собственный сертификат, но я не уверен, что мне нужно делать. Любое руководство было бы полезно.

Другие вопросы, которые я имею на это:

  • Можно ли использовать самозаверяющие сертификаты?
  • В сценарии производства можно было бы использовать самозаверяющие сертификаты или действительно ли они должны были быть подписаны доверенным корневым центром?
  • Как эти сертификаты будут установлены на Azure Website (или я могу загрузить с диска).

Ответ 1

Ну, строго говоря, вам нужен два сертификата: один для SSL и один для подписания - технически они могут быть одинаковыми, но не обязательно. У них также есть разные требования.

Для SSL - вам нужен сертификат, который находится в надежном списке ваших клиентов. Обычно это либо сертификат от коммерческого ЦС, либо от внутреннего PKI.

Для подписывающего сертификата вы можете создать свой собственный - например, используя makecert.

IdSrv довольно гибко загружает сертификаты - вы можете извлекать их из произвольных источников - обычно из хранилища сертификатов Windows (когда у вас есть доступ на уровне администратора к серверу) - или файловой системы, или из встроенного ресурса.

Наш примерный хост использует встроенный ресурсный подход, который отлично работает для Azure WebSites. Для сценариев производства вы обычно нуждаетесь в большей гибкости (например, для перевертывания), поэтому я бы посмотрел на ее загрузку, например. хранилище памяти.

Ответ 2

Расширяя ответ на наименьший приоритет, я думаю, что "правильный" способ - установить их в хранилище доверия Azure, но в моем случае я предоставил их из встроенных ресурсов, как в примере idsrv3.

Вот некоторые особенности, которые сработали для меня. Создание самоподписанного сертификата:

        "C:\Program Files (x86)\Windows Kits\8.1\bin\x64\makecert.exe" -r -pe -n "CN=MyAppIdentity" -sky signature MyApp.cer -sv MyApp.pvk
        "C:\Program Files (x86)\Windows Kits\8.1\bin\x64\pvk2pfx.exe" -pvk MyApp.pvk -spc MyApp.cer -pfx MyApp.pfx -pi MyPassword -po MyPassword

Несмотря на документы pvk2pfx.exe, я обнаружил, что если -po не предоставляется, то pfx не будет хранить тот же пароль, что и pvk, и X509Certificate2() завершится с ошибкой.

Сертификат образца idsrv3 отлично работал на azure для меня, используя код примера idsrv3:

        var assembly = typeof(Certificate).Assembly;
        using (var stream = assembly.GetManifestResourceStream("MyCompany.Identity.Website.Config.idsrv3test.pfx"))
        {
            return new X509Certificate2(ReadStream(stream), "idsrv3test");
        }

Однако, когда я сделал свой собственный сертификат, он отлично работал в локальном тестировании с использованием кода выше, но на Azure мне пришлось добавить дополнительные флаги, чтобы заставить его работать. Я не обязательно уверен в их использовании, но они работают, так что начало:

        using (var stream = assembly.GetManifestResourceStream("MyCompany.Identity.Website.Config.MyApp.pfx"))
        {
            return new X509Certificate2(ReadStream(stream), 
                "MyPassword", 
                X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
        }