如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?

Posted

技术标签:

【中文标题】如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?【英文标题】:How to select a Certificate using the Windows Security's Confirm Certificate popup in C# console or WinForms application? 【发布时间】:2020-07-09 22:56:26 【问题描述】:

我想编写一个 C# 控制台或 WinForms 应用程序,以使用证书 .PFX 文件将数字签名添加到 PDF 文件。目前,我可以使用来自文件系统文件夹的 PFX 证书,使用 iText7 和 BouncyCastle 库对 PDF 文件进行签名。

但我需要让用户在运行时从系统中已安装的证书列表中选择一个证书。

具体来说,我想显示 Windows 安全的确认证书对话框,并使用用户选择的证书进行签名。我想显示如下所示的弹出窗口:

我的具体问题是: 如何触发 Windows 安全的确认证书对话框,如何读取用户选择的证书?

编辑 1: 如果我使用 X509Certificate2UI.SelectFromCollection 方法,我会得到一个不同的弹出窗口,如下所示。这和我想要的不一样。

【问题讨论】:

【参考方案1】:

您可以尝试使用X509Certificate2UI.SelectFromCollection 记录在案的here。

正如@Crypt32 在 cmets 中提到的,我觉得有必要添加代码示例如何使用 api。我想知道@AllSolutions 如何设法使用相同的 API 获取该 UI 窗口。似乎 UI 会随着 selectionFlag 参数而变化。

var store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var collection = store.Certificates;
var cert = X509Certificate2UI.SelectFromCollection(collection, "Select", "Select a certificate to sign", X509SelectionFlag.SingleSelection);

【讨论】:

当我使用 X509Certificate2UI.SelectFromCollection 时,我得到了另一种对话框。这与我在问题中显示的不完全相同。我已经在我的问题中发布了我在 EDIT 1 下得到的对话框的屏幕截图 您必须在selectionFlag 方法调用的selectionFlag 参数中设置SingleSelection 标志。这将调用第一个 UI 对话框。当您使用MultiSelection 时,会显示第二个用户界面。 谢谢。这样可行。我有一个后续问题:如何使用 BouncyCastle 库实现相同的目标?要使用 iText 签署 PDF 文件,我需要使用 BouncyCastle 库。所以要么我想要这个使用 BouncyCastle 的证书选择屏幕,否则我如何将 .NET 库的 X509Certificate2 转换为 BouncyCastle 的 Pkcs12Store?你想让我为此发布一个单独的问题吗? 我在***.com/questions/60918431/… 发布了 1 个后续问题

以上是关于如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?的主要内容,如果未能解决你的问题,请参考以下文章

c# winforms如何保存用户输入的数据

如何在 C# Winforms 程序的文本框中突出显示文本?

如何在 C# Winforms 的下拉列表控件中获取数据源名称

散列或加密或两者都存储用户的密码? C# Winforms [关闭]

C# Winforms 选项卡控制选项卡宽度错误

BackgroundWorker,我怎样才能显示真正的进步? C# Winforms