Windows上的OpenSSL可以使用系统证书存储吗?

一些正在从Linux移植到Windows的C ++代码在Windows上失败,因为SSL_get_verify_result()返回X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY

该代码在Linux上使用SSL_CTX_set_default_verify_paths()来告诉SSL仅查看证书存储的标准默认位置。

是否有可能让OpenSSL使用系统证书存储?

Solutions Collecting From Web of "Windows上的OpenSSL可以使用系统证书存储吗?"

我早些时候做过。 希望这有助于,如果这正是你正在寻找。

  1. 使用Crypto API从Windows Cert存储加载您的证书(在PCCERT_CONTEXT结构中)。
  2. 以二进制格式获取加密内容。 [ PCCERT_CONTEXT->pbCertEncoded ]。
  3. 使用OpenSSL的d2i_X509()方法将此二进制缓冲区解析为X509证书对象。
  4. 使用SSL_CTX_get_cert_store()方法获取OpenSSL的信任存储的句柄。
  5. 使用X509_STORE_add_cert()方法将上面已解析的X509证书加载到此信任存储中。
  6. 你完成了!

对于那些还在苦苦挣扎的人,下面是一个示例代码来帮助你开始:

 #include <stdio.h> #include <windows.h> #include <wincrypt.h> #include <cryptuiapi.h> #include <iostream> #include <tchar.h> #include "openssl\x509.h" #pragma comment (lib, "crypt32.lib") #pragma comment (lib, "cryptui.lib") #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) int main(void) { HCERTSTORE hStore; PCCERT_CONTEXT pContext = NULL; X509 *x509; X509_STORE *store = X509_STORE_new(); hStore = CertOpenSystemStore(NULL, L"ROOT"); if (!hStore) return 1; while (pContext = CertEnumCertificatesInStore(hStore, pContext)) { //uncomment the line below if you want to see the certificates as pop ups //CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT, pContext, NULL, NULL, 0, NULL); x509 = NULL; x509 = d2i_X509(NULL, (const unsigned char **)&pContext->pbCertEncoded, pContext->cbCertEncoded); if (x509) { int i = X509_STORE_add_cert(store, x509); if (i == 1) std::cout << "certificate added" << std::endl; X509_free(x509); } } CertFreeCertificateContext(pContext); CertCloseStore(hStore, 0); system("pause"); return 0; } 

可以使用OpenSSL进行正常操作,并且仅将CryptoAPI用于证书验证过程。 我在这里看到围绕这个主题的几条线索,大多数都围绕/通过。

有了CryptoAPI你必须:

  • 使用CryptStringToBinary()PEM解码为DER
  • CertCreateCertificateContext()创建一个CERT_CONTEXT对象
  • 并通过众所周知的/形成文件的程序来验证这种形式的证书。 (例如在这里的ETutorials 。)

    对于最后一步的工作,您还需要初始化HCERTSTORE作为MYROOTCA系统商店中的一个,或者遍历它们…取决于您想要的行为。

不,不是开箱即用。

不,这是不可能的。 这将需要额外的编程。 有了OpenSSL,你有两个(开箱即用)选项:

  1. 使用OpenSSL自己的证书存储(这是由OpenSSL提供的perl脚本创建的目录层次结构)
  2. 只使用您创建的证书链文件(这是一个包含信任链中所有PEM编码证书的文本文件)。 创建这样的文件很容易(只是附加)