我正在使用 Python和OpenSSL连接到使用TLS的站点(在某些跨平台的软件中,因此为了切换到CryptoAPI将会是太多的工作);不过,我不想分发(和更新)自定义的证书列表.我想从平台上得到他们.在OS X和Linux上,这是非常简单的,但Windows附带了TLS的受信任根证书颁发机构的不完整列表;基本上只是微软自己的证书,然后当高级别的TLS(例如通过HTTPS加载Internet Explorer中的网页)必须验证以前没有看到的信任根时,才会向商店动态添加信任根. (This process is explained here.)这意味着我可以 enumerate the Windows root certificate store with wincertstore,但它是无用的,因为在具有最近安装的操作系统的机器上,该商店几乎是空的.

Microsoft提供detailed instructions for administrators预先检索该列表,以便能够操作具有严格控制的网络访问的机器;但是,我找不到任何可以做同样事情的API的引用,只需从Microsoft下载所有受信任的根证书. (老实说,在每周多兆字节系统更新的时代,我不明白为什么预先下载这些是如此之大,如果它只是一个缓存;奖金积分请解释为什么这需要发生.)

那么,是否有API可以让我告诉系统只是根据它使用的规则预先缓存受信任的根证书?如果这是真的不可能的话(如果CryptoAPI只能一次下载一个信任根,并且只有在给它一个根目录下签名的证书的话)时,是否有办法将OpenSSL证书验证连接到CryptoAPI的信任存储,以便验证将下载并缓存信任根,就像一个本机TLS连接一样?

这不是一个理想的方法,但它应该是一个捏,它可能会让你在某个地方开始.此代码将使用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: %u\n",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: %x\n",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: %u\n",err);
            return;
        }
    }
}

int main(int argc,char ** argv)
{
    mainfn();
    return 0;
}

或者,在您的上下文中,您可能希望直接在.sst文件中使用根证书,而不必将其添加到根存储. (在这种情况下,您应该可以枚举根存储以及.sst文件,以便包括任何本地添加的证书.)

有没有API可以在Windows上预先检索受信任的根证书列表?的更多相关文章

  1. windows – 在受信任的根证书存储上安装SSL证书的脚本

    我想在Windows(XP和7)中为IE,Firefox和Chrome安装自签名证书.我需要为多个系统安装证书,所以我计划创建安装浏览器证书的.bat文件.谷歌搜索时我得到了以下命令certutil-addstore-f-enterprise-userrootroot_ca.cer但它只适用于IE.Chrome和Firefox有什么选择吗?有点旧的帖子,但我想我还是会投入两分钱.您是对的,批处理脚

  2. 有没有API可以在Windows上预先检索受信任的根证书列表?

    如果这是真的不可能的话时,是否有办法将OpenSSL证书验证连接到CryptoAPI的信任存储,以便验证将下载并缓存信任根,就像一个本机TLS连接一样?这不是一个理想的方法,但它应该是一个捏,它可能会让你在某个地方开始.此代码将使用certutil-generatesstFromWU生成的.sst文件,并将所有证书添加到根存储区中:或者,在您的上下文中,您可能希望直接在.sst文件中使用根证书,而不必将其添加到根存储.

  3. 在CentOS 6中安装根证书

    我知道它已被问到,但尽管经过了数小时的研究,我找不到合适的解决方案.我正在尝试在我的服务器中安装我的根证书,因此内部服务可以使用SSL相互绑定.应该了解新的根CA:>Apachehttpd和PHP>OpenLDAP客户端>Node.js对于Apache,我需要一个程序来了解根证书,因此如果站点连接到另一个SSL网站(由同一个CA签名),它可以正常工作,并且不会抱怨自签名证书.对于OpenLDAP,

  4. 如何从Windows中的pfx文件中删除CA根证书?

    在Windows2012R2和Windows10计算机上有一个pfx文件,其中包含服务器的证书链.我使用WindowsMMC证书导出工具创建了此文件.如果可能,选择是导出链中的所有证书或仅导出一个证书.该链包含根,两个中介,然后是我的服务器证书.我想删除CA根证书,因为客户端应该已经拥有它,但保留中间证书.如何编辑pfx文件以删除一个根证书?您可以使用少量PowerShell代码执行此操作:

  5. windows – 为什么不同版本的openssl会为同一个根证书生成不同的散列文件名?

    OpenSSL–Solaris–Windows当我运行c_rehash和c_rehash时,相同的cert.pem文件将转换为具有完全不同文件名的.0文件.cert.pem=>4e12356.0cert.pem=>3e121e8.0为什么是这样?无论我使用哪个版本的OpenSSL,哈希都不应该完全相同吗?

  6. windows-server-2008 – 什么原因导致将受信任的根证书颁发机构自动安装到本地计算机的证书存储区?

    我在某处找到了一些信息,这些CA是通过WindowsUpdate自动安装的.问题:如何在不关闭Windows更新的情况下关闭将CA证书安装到我们的计算机上?我不认为它们都是由WindowsUpdate安装的,老实说.可能会有更多的人遇到这个问题,对吧?它们也可以通过GPO和域成员身份安装,这是我首先看到的地方.但是,在查看之前,我想允许使用HTTPS…

  7. windows-server-2008-r2 – 自动从商店中删除受信任的根证书

    我有一个受信任的第三方的根证书.我将此安装到WindowsServer2008中的“受信任的根证书颁发机构”证书存储区,但它在未知时间从证书存储区中消失.可能是什么导致了这个?

  8. 无法将证书添加到Windows 7中的受信任的根证书颁发机构

    我正在尝试添加Apple开发人员证书,以便将推送通知发送到我的“受信任的根证书颁发机构”部分.我得到一个错误:“导入失败,因为商店是只读的,商店已满或商店没有正确打开”我以管理员身份登录.我想不出有什么方法可以解决这个问题.有没有人能够解决类似的问题?

  9. 使用Windows AD证书服务分发根证书

    WindowsServer提供证书颁发机构服务.但是,从其文档中不清楚根证书是如何(或如果)分发给客户端的.>域成员计算机是否自动信任根证书?>它只会在登录时获得吗?>如果域成员远程VPN进入LAN怎么办?>对于不同版本的Windows客户端,是否有任何警告?

  10. CentOS6.5下openssl加密解密及CA自签颁发证书详解

    sessionticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。意味着服务端会使用ECDHE-RSA算法进行密钥交换,通过AES_128_GCM对称加密算法来加密数据,利用SHA256哈希算法来确保数据完整性。服务端收到请求,选择合适的算法,下发公钥证书和随机数。客户端对服务端证书进行校验,并发送随机数信息,该信息使用公钥加密。双方根据以上交互的信息生成sessionticket,用作该连接后续数据传输的加密密钥。

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部