Возможно, он не может конвертироваться из-за проблем с разрешениями или загрузки сертификата в виде потока.
В моем случае с использованием 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)