2

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

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

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

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

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

我彻底查看了 SDK 文档和 Internet,但找不到我的问题的答案:

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

我将不胜感激任何提示来解决这个问题,谢谢...

4

2 回答 2

3

CKA_CLASS根据 PKCS#11,X509 证书是其数据类(属性)等于的某种存储对象CKO_CERTIFICATE
如果你想从你的令牌中检索一个证书对象,你只需要使用C_GetAttributeValue函数。
在执行此操作之前,您可能希望找到存储在您的令牌上的所有 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
   }
}
于 2013-04-27T10:40:21.073 回答
0

除了 PKCS#11 库,Microsoft CryptoAPI (mscapi.dll) 也可用于检索证书详细信息。但是,MSCAPI在内部也使用PKCS与 USB 令牌进行交互。因此,应该有一些方法可以单独使用 PKCS 库而不使用 MSCAPI 来解决问题。

于 2013-04-27T20:12:29.843 回答