【发布时间】:2021-06-06 16:38:07
【问题描述】:
我有一个 .NET Framework 4.7 应用程序,它允许用户上传 PFX 或 PKCS#12 格式的 X.509 证书(想想:包含私钥的“SSL 证书”),然后将证书加载到 @987654321 @ 实例。由于我的应用程序代码还需要重新导出证书,因此我指定了 X509KeyStorageFlags.Exportable 选项。
在我的生产网络服务器上的 IIS 下运行时,w3wp.exe 在其下运行的身份的 Windows 用户配置文件未加载,因此我没有指定 UserKeySet 标志。
String filePassword = ...
Byte[] userProvidedCertificateFile = ...
using( X509Certificate2 cert = new X509Certificate2( rawData: userProvidedCertificateFile, password: filePassword, keyStorageFlags: X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet )
{
...
}
在 2017 年初,我将此代码部署到 Azure 应用服务(又名 Azure 网站)实例,它工作正常 - 在最初失败后,因为我确实设置了 UserKeySet 标志(因为 Azure 应用服务不加载用户 -配置文件证书存储。
但是,自 2017 年年中(可能在 5 月或 6 月左右)以来,我的应用程序已停止工作 - 我假设 Azure 应用程序服务已移至更新的系统(尽管 Kudu 报告我的应用程序正在 Windows Server 2012 上运行 (NT 6.2.9200.0 )。
它目前失败并显示两条因输入而异的错误消息:
-
CryptographicException"系统找不到指定的文件。" -
CryptographicException"访问被拒绝。"
我编写了一个广泛的测试用例,尝试了 X509Certificate2 构造函数参数的不同组合,以及使用和不使用 WEBSITE_LOAD_CERTIFICATES Azure 应用程序设置。
以下是我在处理上传的 PFX/PKCS#12 证书文件时的发现,该文件包含私钥且没有密码保护:
- 在我的开发盒上运行在 IIS Express 下:
- 无论
X509KeyStorageFlags值如何,加载证书文件始终成功。 - 导出证书文件至少需要
X509KeyStorageFlags.Exportable。
- 无论
- 在未加载
w3wp.exe用户配置文件的生产服务器(不是 Azure 应用服务)上的 IIS 下运行:- 加载证书文件需要不设置
X509KeyStorageFlags.UserKeySet,否则总是成功。 - 导出证书文件至少需要
X509KeyStorageFlags.Exportable,否则总是成功,否则失败并显示“Key not valid for use in specified state”。
- 加载证书文件需要不设置
- 在 Azure 应用服务下运行,未定义
WEBSITE_LOAD_CERTIFICATES:- 加载设置了
MachineKeySet并且未设置了UserKeySet的证书失败并显示CryptographicException:“访问被拒绝。” - 使用任何其他
keyStorageFlags值(包括UserKeySet | MachineKeySet | Exportable或仅DefaultKeySet之类的值)加载证书失败,并显示CryptographicException:“系统找不到指定的文件。” - 由于我根本无法加载证书,因此无法测试导出证书。
- 加载设置了
- 在 Azure 应用服务下运行,
WEBSITE_LOAD_CERTIFICATES定义为已上传证书的指纹:- 使用
MachineKeySet和UserKeySet加载证书未 设置,失败并显示CryptographicException:“访问被拒绝。” .- 因此,
UserKeySet、UserKeySet | MachineKeySet和Exportable等值将起作用。
- 因此,
- 导出证书需要
X509KeyStorageFlags.Exportable- 与所有其他环境相同。
- 使用
因此,WEBSITE_LOAD_CERTIFICATES 似乎可以工作 - 但前提是加载到 X509Certificate2 实例中的证书具有与 WEBSITE_LOAD_CERTIFICATES 中指定的相同的指纹。
有没有办法解决这个问题?
【问题讨论】:
标签: azure azure-web-app-service x509certificate