系统存储中的证书上下文总是有一个无效的pbCertEncoded指针
Certificate context from system store always has an invalid pbCertEncoded pointer
我正试图在CryptoAPI中使用CertEnumCertificatesInStore()来迭代所有根证书,并将它们编码到PEM文件中,以便与OpenSSL一起使用。我已经找到了一些这样的例子,所以这似乎是可能的,然而,我为每个证书返回的PCCERT_CONTEXT都有一个无效的pbCertEncoded指针,cbCertEncoded(缓冲区大小)总是0,但我觉得不应该是这种情况,因为示例使用编码的缓冲区将证书转换为其他格式。有没有其他人遇到过获得空缓冲区的问题,或者可以看到我缺少的一步?
我已经用CryptUIDlgViewContext()函数验证了我实际上正在获得证书。我觉得我错过了一些基本的东西。以下基本代码:
HCERTSTORE hStore = CertOpenSystemStore(NULL, L"ROOT");
for ( PCCERT_CONTEXT pCertContext = CertEnumCertificatesInStore(hStore, NULL); pCertContext != NULL; pCertContext = CertEnumCertificatesInStore(hStore, pCertContext) )
{
// This shows the certificates fine
CryptUIDlgViewContext(CERT_STORE_CERTIFICATE_CONTEXT, pCertContext, NULL, NULL, 0, NULL)
// but
// pCertContext->pbCertEncoded is a Bad Ptr and
// pCertContext->cbCertEncoded is always 0
// If i try
TCHAR *OutString = NULL;
DWORD Size = 0;
DWORD lastError;
BOOL success = CryptBinaryToString(pCertContext->pbCertEncoded, pCertContext->cbCertEncoded, CRYPT_STRING_BASE64,OutString, &Size);
if( !success )
{
// I get a invalid parameter error here.
lastError = GetLastError();
}
}
以64位编译时,编码的缓冲区不会被填满。用32位编译似乎可以解决这个问题。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 系统存储中的证书上下文总是有一个无效的pbCertEncoded指针
- 是否有一个标准容器允许在不使迭代器无效的情况下插入元素