c++ - 在 Win32 上通过代码安装根 CA 证书

标签 c++ winapi certificate

我们刚刚使用 Microsoft 的 TS 网关设置了一个新的远程访问解决方案,这需要代表最终用户执行一些有点繁琐的步骤才能使其正常工作(安装我们的根 ca 证书,RDP 6.1 客户端的要求等)。

为了使这个设置过程尽可能简单(其中很多用户没有技术头脑),我希望创建一个程序来自动执行所有这些任务。我的大部分工作正常,但我不完全确定如何将根 CA 证书导入 Windows 证书存储区。

因为这可能会在具有不同级别的补丁和更新的各种计算机上运行,​​所以我非常清楚 .NET 和任何非 native 的东西 - 该工具应该在没有用户的情况下“运行”必须安装任何额外的东西(好吧,我会说 windows XP,没有服务包,是 windows 的最低要求版本)。话虽如此,我不介意使用第三方的东西,只要它可以与该工具捆绑在一起,只要它不是很大,并且不引入任何交互步骤。理想情况下,Windows API 中的某些内容最好,但我似乎无法找到任何相关内容。

目前该工具是一个 C++ 应用程序,所以我不介意它是否是非常底层的东西。

最佳答案

首先你需要打开根证书库...

 HCERTSTORE hRootCertStore = CertOpenSystemStore(NULL,"ROOT");

然后使用 CertAdd 函数之一添加证书,例如 CertAddEncodedCertificateToStore。

CertAddEncodedCertificateToStore(hRootCertStore,X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,pCertData,cbCertData,CERT_STORE_ADD_USE_EXISTING,NULL);

pCertData 和 cbCertData 可能指向您从文件中读取的证书数据(不确定证书是否在文件中,或者您将如何将其包含在您的应用程序中)。

然后用...关闭商店

CertCloseStore(hRootCertStore,0);

注意:此代码如果以用户身份运行,会将证书安装到用户的根存储区,而不是计算机的根存储区。它还会产生一个警告对话框,用户必须理解该对话框并选择"is"以授权导入。如果您的安装程序可以在系统帐户中运行此代码,导入将影响计算机的根存储并且不会显示警告对话框。

关于c++ - 在 Win32 上通过代码安装根 CA 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/656706/

相关文章:

c++ - 重载指向重载函数的指针

c++ - WaitCommEvent() 是否报告已经收到的数据?

c++ - GetProcessAffinityMask 给出了错误的值

security - 本地主机/127.0.0.1 的证书 SSL_ERROR_BAD_CERT_DOMAIN

windows - 我可以在 Windows 证书下创建一个新文件夹/目录并在其中导入我所有的自签名 CA 证书吗

.NET HttpClient - 有条件地忽略证书错误

c++ - 使用相互依赖的类是不好的做法吗?

c++ - 当 C++ 全局变量未显式初始化时发出警告?

winapi - ValidateRect 与 BeginPaint

c - 模拟点击进入 PopMenu 窗口