如何读取存储在usb令牌上的X.509证书的详细信息?

时间:2013-04-26 07:33:32

标签: c++ x509certificate pkcs#11

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

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

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

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

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

我彻底浏览了SDK文档,并通过互联网,但我找不到我的问题的答案:

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

我很感激任何解决这个问题的提示,谢谢......

2 个答案:

答案 0 :(得分:2)

根据PKCS#11,X509证书是某种存储对象,其数据类(CKA_CLASS属性)等于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
   }
}

答案 1 :(得分:0)

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