Warm tip: This article is reproduced from serverfault.com, please click

c#-加载 X509Certificate2 以 Windows server 2012 上发生内部错误结束

(c# - Loading X509Certificate2 ends with An internal error occurred on Windows server 2012)

发布于 2021-10-20 15:58:59

我正在尝试从路径加载证书并在 Windows 服务器上出现内部服务器错误。虽然我在 Windows 10 上执行此操作,但一切正常。

不工作的控制台应用程序代码

var path = args[0];
var password = args[1];
var certificate2 = new X509Certificate2(path, password);

但是出现错误

Unhandled exception. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: An internal error occurred.
   at Internal.Cryptography.Pal.CertificatePal.FilterPFXStore(Byte[] rawData, SafePasswordHandle password, PfxCertStoreFlags pfxCertStoreFlags)
   at Internal.Cryptography.Pal.CertificatePal.FromBlobOrFile(Byte[] rawData, String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   at CertCoreTest.Program.Main(String[] args) in C:\Users\Admin\Documents\Visual Studio 2019\Projects\CertTest\CertCoreTest\Program.cs:line 12

破解工作代码(不知道为什么会工作)

var path = args[0];
var password = args[1];

Chilkat.Cert cert = new Chilkat.Cert();
var success = cert.LoadPfxData(File.ReadAllBytes(path), password);
if (success == false)
{
    throw new Exception(cert.LastErrorText);
}

var bytes = cert.ExportToPfxData(password, true);
var ceeert = new X509Certificate2(bytes, password);

如何在不使用 chilkat 库的情况下使其在 Windows 服务器上工作?

Questioner
Qba
Viewed
0
Danut Radoaica 2021-10-28 14:57:34

如果你的代码在 IIS 下的 Web 应用程序中运行:

  1. 转到 IIS 管理器
  2. 转到应用程序池实例
  3. 点击高级设置
  4. 在流程模型下,将加载用户配置文件设置为 true

否则,请尝试指定 UserKeySet(PFX 可能在内部包含“使用机器存储”标记):

var path = args[0]; var password = args[1]; var certificate2 = new X509Certificate2(path, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet);

否则,在本地机器上安装证书并尝试通过指纹从存储区加载:

如果上述方法失败,则可能无法使用 Windows 2012 内置工具将 .p12 文件导入 Windows 2012。要检查:“对于每个 PKCS #12 文件,你可以尝试以下操作:发出命令 certutil -asn | findstr /i "pb aes des sha"(将 "" 替换为 PKCS #12 文件的名称) .

如果输出开始如下:

| | | | | ; 1.2.840.113549.1.12.1.3 szOID_PKCS_12_pbeWithSHA1And3KeyTripleDES

那么应该可以将 PKCS #12 文件导入 Windows 2016。

如果输出开始如下:

| | | | | ; 1.2.840.113549.1.5.13 szOID_PKCS_5_PBES2 | | | | | | ; 1.2.840.113549.1.5.12 szOID_PKCS_5_PBKDF2 | | | | | ; 2.16.840.1.101.3.4.1.42 aes256

或类似的,那么 PKCS #12 文件可能无法使用内置的 Windows 2016 工具导入到 Windows 2016 中。你将不得不使用 TripleDES 和 SHA1 重新创建 PKCS #12 文件。” - 请参阅线程:https ://docs.microsoft.com/en-us/answers/questions/518605/importing-a-pkcs12-to-windows- server-2016.html