我们刚刚使用 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/