gpt4 book ai didi

c++ - 如何读取存储在 USB token 上的 X.509 证书的详细信息?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:45 37 4
gpt4 key购买 nike

我正在为我的应用程序使用 SafeNet 的 iKey usb token 。

我的应用程序使用 C++(win32 应用程序),我正在通过其 SDK 中的 PKCS 接口(interface) (pkcs11.h) 访问 token 的功能。

到目前为止,我已经能够成功地执行以下操作:生成公钥/私钥对、加密/解密、签名/验证、读取存储在 token 中的对象的属性。

但主要问题是:将 X.509 证书导入 token 后(使用 iKey Token Utility),我无法在我的 C++ 应用程序中读取证书详细信息,因为我需要这些来了解哪个用户正在使用我的应用程序,即用户身份。但是,使用 token 驱动程序附带的“iKey Token Utility”,可以查看证书详细信息。我在任何地方都找不到该实用程序的源代码,而且 pkcs11.h 库没有任何与读取证书详细信息相关的功能。对我来说,读取证书的公钥值(而不是它的句柄)会很有帮助。

我尝试使用 PKCS 读取 token 内证书对象的属性,但它似乎给了我以某种格式编码的值。

我仔细查看了 SDK 文档和互联网,但找不到我的问题的答案:

  • 如何在 C++ 中使用 PKCS 从 usb 安全 token 中读取 X509 证书详细信息?

我将不胜感激解决此问题的任何提示,谢谢......

最佳答案

根据 PKCS#11,X509 证书是某种存储对象,其数据类(CKA_CLASS 属性)等于 CKO_CERTIFICATE
如果您想从 token 中检索证书对象,只需使用 C_GetAttributeValue 函数即可。
在执行此操作之前,您可能需要找到存储在您的 token 上的所有 x.509 证书:

CK_BBOOL _true = CK_TRUE;
CK_OBJECT_CLASS certClass = CKO_CERTIFICATE;
CK_CERTIFICATE_TYPE certType = CKC_X_509_ATTR_CERT;
CK_ATTRIBUTE certificateSearchTemplate[] = {
{CKA_CLASS, &certClass, sizeof(dataClass)},
{CKA_CERTIFICATE_TYPE, &certType, sizeof(certType)},
{CKA_TOKEN, &_true, sizeof(_true)}
};

CK_OBJECT_HANDLE hObject;
CK_ULONG ulObjectCount;
CK_RV rv = C_FindObjectsInit(hSession, certificateSearchTemplate, 3);
assert(rv == CKR_OK);
while (1) {
rv = C_FindObjects(hSession, &hObject, 1, &ulObjectCount);
if (rv != CKR_OK || ulObjectCount == 0)
break;
//hObject is handle of a x.509 certificate, so you can fetch your desired attributes from it using C_GetAttributeValue
getCertificateAttributes(hObject);
}
rv = C_FindObjectsFinal(hSession);
assert(rv == CKR_OK);

getCertificateAttributes 函数中,您可以获得所需的证书属性:

void getCertificateAttributes(CK_OBJECT_HANDLE hCert)
{
CK_ATTRIBUTE pTemplate[] = {
//List your desired attributes here
};
...
CK_RV rv = C_GetAttributeValue(hSession, hCert, &pTemplate, pTemplateLen);
if (rv == CKR_OK) {
//here you have your desired certificate attributes
}
}

关于c++ - 如何读取存储在 USB token 上的 X.509 证书的详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16231046/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com