IdentityServer4 AddSigningCredentials с сертификатом - PullRequest
1 голос
/ 18 марта 2019

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

services.AddIdentityServer().AddSigningCredentials(certificate);

Однако я не могу понять, как на самом деле получить свой сертификат и передать его на сервер идентификации.

Я пробовал следующее:

var cert = X509Certificate.CreateFromCertFile(fileName);
services.AddIdentityServer().AddSigningCredentials(certificate);

Ошибка, которую я получаю, заключается в том, что она не может конвертировать из

'System.Security.Cryptography.X509Certificates.X509Certificate' в 'Microsoft.IdentityModel.Tokens.SIgningCredential'

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

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

В итоге я решил это так. Я использую общий сервер, где я размещаю это, и я не смог найти имя файла для сертификата или путь для его получения. В итоге я просто открыл магазин и нашел его таким. Не очень эффективно, но будет работать, пока я не перенесу его на выделенный сервер и не получу больше контроля.

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = null;

foreach (X509Certificate2 certificate in store.Certificates)
{
    if (!string.IsNullOrWhiteSpace(certificate?.SubjectName?.Name) && certificate.SubjectName.Name.StartsWith("CN=*.mysite.com"))
    {
        cert = certificate;
        break;
    }
}
0 голосов
/ 18 марта 2019

Возможно, он не может конвертироваться из-за проблем с разрешениями или загрузки сертификата в виде потока.

В моем случае с использованием IdentityServer3 работает следующий код:

    /// <summary>
    /// Load the certificate that sign the Id or Jw token
    /// </summary>
    /// <returns></returns>
    private static X509Certificate2 LoadCertificate()
    {
        string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
        return new X509Certificate2(
        Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigMngr.GetAppSettingsValue<string>("IdSrv:SigningCertificatePath")), ConfigMngr.GetAppSettingsValue<string>("IdSrv:SigningCertificatePassword"));
    }

Затем в файле запуска Оуэна я передаю его, как показано ниже:

  SigningCertificate = LoadCertificate(),

Я знаю, что в Idsrv4 это реализация, отличная от кода, который я разместил, но это должна быть та же абстракция, например, вы загружаете X509Certificate, но он устарел, поэтому убедитесь, что вы используете правильную перегрузку для загрузки сертификата в качестве потока и убедитесь, что вернуть правильный тип.

Кроме того, этот код можно тестировать с помощью IdSrv4:

var fileName = Path.Combine(env.WebRootPath, "FileName" );            

    if (!File.Exists(fileName))
    {
        throw new FileNotFoundException("No Signing Certificate!");
    }

    var cert = new X509Certificate2(fileName, "Pass" );

    services.AddIdentityServer().AddSigningCredential(cert)

Так что вместо использования

X509Certificate.CreateFromCertFile(fileName);

Вы можете создать новый сертификат X509Certificate2 следующим образом:

var cert = new X509Certificate2(fileName, "Pass" );

и передать его промежуточному программному обеспечению owin:

services.AddIdentityServer().AddSigningCredential(cert)
...