一些正在从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使用系统证书存储?
.NET运行时(CLR),JIT编译器位于何处?
我们可以在Windows上编译目标c吗?
C / Linux – 服务器< – >与命名pipe道的terminal通信
使用Visual Studio 11编译的可执行文件有什么特别之处,导致可执行文件无法在Windows XP上执行?
为什么fopen / fgets同时使用mmap和read系统调用来访问数据?
正确使用P / Invoke
根据窗口中的驱动器号查找USB大容量存储实例ID
问题 – TCHAR作为LParaM属于另一个进程/线程的窗口
在.NET中检测HDMI电缆事件?
我早些时候做过。 希望这有助于,如果这正是你正在寻找。
使用Crypto API从Windows Cert存储加载您的证书(在PCCERT_CONTEXT结构中)。
以二进制格式获取加密内容。 [ PCCERT_CONTEXT->pbCertEncoded ]。
使用OpenSSL的d2i_X509()方法将此二进制缓冲区解析为X509证书对象。
使用SSL_CTX_get_cert_store()方法获取OpenSSL的信任存储的句柄。
使用X509_STORE_add_cert()方法将上面已解析的X509证书加载到此信任存储中。
你完成了!
#include <stdio.h> #include <windows.h> #include <wincrypt.h> #include <cryptuiapi.h> #include <iostream> #include <tchar.h> #include "opensslx509.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); 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作为MY , ROOT , CA系统商店中的一个,或者遍历它们…取决于您想要的行为。
不,不是开箱即用。
不,这是不可能的。 这将需要额外的编程。 有了OpenSSL,你有两个(开箱即用)选项:
使用OpenSSL自己的证书存储(这是由OpenSSL提供的perl脚本创建的目录层次结构)
只使用您创建的证书链文件(这是一个包含信任链中所有PEM编码证书的文本文件)。 创建这样的文件很容易(只是附加)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。