微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有一个API预先检索Windows上受信任的根证书列表?

我正在使用Python和OpenSSL连接到使用TLS的站点(在某些跨平台软件中,因此切换到CryptoAPI的任何内容都是太多工作); 不过,我不想分发(和更新)自定义的证书列表。 我想从平台上获得他们。 在OS X和Linux上这很简单,但是Windows为TLS提供了一个不完整的受信任根证书颁发机构列表; 基本上只有微软自己的证书,然后当高级TLS的东西(例如通过HTTPS在Internet Explorer中加载网页)必须validation它之前没有看到的信任根时,dynamic地将信任根添加到商店。 (这个过程在这里解释。)这意味着我可以使用wincertstore来枚举Windows根证书存储wincertstore ,但是它没有用处,因为在具有最近安装的操作系统的机器上,那个存储区几乎是空的。

Microsoft 为pipe理员提供了详细的说明,以便预先检索此列表,以便能够以严格控制的networking访问方式操作计算机; 但是,我无法find任何可以执行相同操作的API的参考,只需从Microsoft下载所有受信任的根证书即可。 (老实说,在每周数兆字节的系统更新的时代,我不明白为什么预先下载这些是如此之大,如果它只是一个caching;对于奖励点,请解释为什么这需要发生。

所以:有没有一个API可以让我告诉系统预先caching受信任的根证书,根据它使用的任何规则? 否则,如果真的不可能(即,如果CryptoAPI一次只能下载一个信任根,并且只有给它提供由该根签名的证书),才有办法将OpenSSL证书validation连接到CryptoAPI的信任库,validation将像本地TLS连接一样下载和caching信任根?

Windows上的PBC:CryptGenRandom()

提取证书中的主题属性的所有值

一个X509 PEM文件加载到Windows CryptoApi中

Linuxencryption库中的alloc_ahash vs alloc_shash

如何在使用OpenSSL的TLS握手期间使用Windows Crypto APIvalidation证书?

PKCS#7 encrypted使用Windows Crypto API和C ++进行解密和validation

Windows证书存储中的私钥安全

使用RSA分配/validation签名(PKCS 7)

Cryptoapi签署/validation在Windows 8.1上不起作用

CryptoAPI / WinCrypt:如何在C ++中导入PEM文件中的私钥?

这不是一个理想的方法,但它应该做一个捏,它可能会给你一个开始的地方。 此代码将采用由certutil -generatesstFromWU生成的.sst文件,并将所有证书添加到根存储中:

#include <Windows.h> #include <WinCrypt.h> #pragma comment(lib,"crypt32.lib") #include <stdio.h> void process_cert(PCCERT_CONTEXT cert) { PCCERT_CHAIN_CONTEXT ccc; CERT_CHAIN_Para ccp = {sizeof(CERT_CHAIN_Para)}; DWORD flags; char certname[256]; CertGetNameStringA(cert,CERT_NAME_SIMPLE_disPLAY_TYPE,NULL,certname,_countof(certname)); flags = 0; if (!CertGetCertificateChain(HCCE_LOCAL_MACHINE,cert,&ccp,flags,&ccc)) { printf("Certificate %s CertGetCertificateChain: %un",GetLastError()); } else { printf("Certificate %s : %x (%x)n",ccc->TrustStatus.dwErrorStatus,ccc->TrustStatus.dwInfoStatus); } } void mainfn(void) { HCERTSTORE sst; PCCERT_CONTEXT cert; DWORD count; sst = CertOpenStore(CERT_STORE_PROV_FILENAME_W,(HCRYPTPROV)NULL,CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG,L"c:\downloads\roots.sst"); if (sst == NULL) { printf("CertOpenStore: %xn",GetLastError()); return; } for (cert = NULL,count = 0; cert = CertEnumCertificatesInStore(sst,cert); count++) process_cert(cert); { DWORD err = GetLastError(); if (err != CRYPT_E_NOT_FOUND) { printf("CertEnumCertificate: %un",err); return; } } } int main(int argc,char ** argv) { mainfn(); return 0; }

或者,在您的上下文中,您可能更愿意直接在.sst文件中使用根证书,而不将其添加到根存储。 (在这种情况下,您应该枚举根存储以及.sst文件,以包含所有本地添加的证书。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐