【发布时间】:2021-03-20 20:29:03
【问题描述】:
我有一个 C++ 实现
-
根据颁发者搜索证书
-
验证这些证书
-
如果有多个证书
一个。在自己的商店中设置证书
b.使用 CryptUIDlgSelectCertificateFromStore 显示“选择证书”窗口
-
从证书中返回一个特定的值
这是在 Windows MFC 程序中完成的。现在我必须在命令行程序中执行此操作。我希望为此使用 C#,因为它更容易开发并且您可以使用 NUGET 包。
cryptuiapi.h 和 wincrypt.h 是否有一个好的“官方”C# 包装器?我找到了这些:
https://referencesource.microsoft.com/#system/security/system/security/cryptography/cryptoapi.cs https://referencesource.microsoft.com/#WsatUI/MMCUI/MMCSafeNativeMethods.cs,95a3d8346740ba05
...但是如果某处有更好的实现 (=NUGET),我不喜欢复制代码。
我使用的功能是:
CertOpenStore
CertCloseStore
CertEnumCertificatesInStore
CryptUIDlgSelectCertificateFromStore
CertVerifyRevocation
CertVerifyTimeValidity
CryptAcquireCertificatePrivateKey
CryptSignCertificate
CertFindCertificateInStore
CertGetIntendedKeyUsage
CertNameToStr
CertDuplicateCertificateContext
CertAddCertificateContextToStore
据我所知,我有 4 个选择:
- 使用 c# X509Store 实现整个事情,但我还没有找到 c# 的 CryptUIDlgSelectCertificateFromStore。我可以使用 pinvoke,但我认为我应该将 pinvoke 用于所有功能。
- 在非托管 C++ 中实现整个过程并使用现有代码。我的主要项目是 BIG 和 OLD,因此仅提取有用的功能很复杂。
- 在 C# 中实现控制台应用程序,引用 C++ CLR 包装器,该包装器又引用带有非托管代码的 C++ dll。
- 在 C# 中实现并使用上述 pinvoke 函数,这些函数可能是 PIA,因为 UNICODE/ASCII 问题。
【问题讨论】:
-
"我可以使用 pinvoke,但我认为我应该对所有功能使用 pinvoke。" -- 我不同意。我的首选方法是在可能的情况下使用 X509Store,但如果有一个您无法通过这种方式访问的功能,请直接对其进行 pinvoke。
X509Store.StoreHandle已公开,因此您可以这样做。 -
哦,谢谢!这就是我要做的。
-
(并且
X509Certificate2有一个构造函数,它采用PCCERT_CONTEXT,用于另一种方式)
标签: c# c++ certificate