我正在使用 Abp.io,在 .NET 8 中,它可以通过以下代码行正常工作:
if (!File.Exists(fileName))
{
throw new FileNotFoundException($"Signing certificate couldn't be found: {fileName}");
}
var certificate = new X509Certificate2(fileName, passPhrase, X509KeyStorageFlags.MachineKeySet);
builder.AddSigningCertificate(certificate);
builder.AddEncryptionCertificate(certificate);
但是当升级到 Abp.io
9.0.3
和 .NET 9 时,我必须更新这些行,因为构造函数已过时,如此处所述 microsoft x509-certificates
我现在的新代码是:
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
if (!File.Exists(path))
{
throw new FileNotFoundException($"Signing certificate couldn't be found: {fileName}");
}
var certificate = X509CertificateLoader.LoadPkcs12FromFile(path, passPhrase, X509KeyStorageFlags.MachineKeySet);
builder.AddSigningCertificate(certificate);
builder.AddEncryptionCertificate(certificate);
但它在Azure App Service中不起作用,我收到以下错误:
System.Security.Cryptography.CryptographicException:系统找不到指定的文件。
我检查了该文件是否存在于正确的位置,情况确实如此。我也尝试添加环境变量
WEBSITE_LOAD_USER_PROFILE
到1
,错误不同但还是不行
System.Security.Cryptography.CryptographicException:密钥集不存在
我很难理解为什么它在 net8 中工作但在 .NET 9 中不起作用,无论是使用构造函数还是
Load
方法。
证书是在管道构建任务期间使用命令生成的
dotnet dev-certs https -v -ep openiddict.pfx -p $(passPhrase)
它生成一个包含所有 DLL 和证书的工件,然后发布管道将其推送到应用服务
经过大量测试和调整,它终于可以使用以下密钥存储标志了
X509KeyStorageFlags.EphemeralKeySet
和
WEBSITE_LOAD_USER_PROFILE=1
环境变量