View a markdown version of this page

使用 PKCS #11 库检索属性 AWS CloudHSM 客户端软件开发工具包 5 - AWS CloudHSM

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 PKCS #11 库检索属性 AWS CloudHSM 客户端软件开发工具包 5

当您的应用程序从密钥或证书对象读取属性时,PKCS #11 库会为每次C_GetAttributeValue调用向您的集群发送一个请求。模板中的属性数量不会改变请求的数量。一个请求十个属性的调用会发送一个请求。十次调用,每个请求一个属性,发送十个请求。

每次调用都会在一个请求中从您的集群读取对象的属性,然后复制您的模板请求的值。PKCS #11 库不缓存这些值,因此每次调用都会发送一个新请求。

要减少您的应用程序发送的请求数量,请遵循以下建议:

  • 在一个模板中请求所需的所有属性。生成一个包含所有所需属性的单一模板,然后将其传递给一个C_GetAttributeValue调用。以下示例通过一次调用读取密钥的三个属性。

    CK_OBJECT_CLASS obj_class; CK_BYTE label[128]; CK_BYTE id[128]; CK_ATTRIBUTE attrs[] = { {CKA_CLASS, &obj_class, sizeof(obj_class)}, {CKA_LABEL, label, sizeof(label)}, {CKA_ID, id, sizeof(id)}, }; rv = funcs->C_GetAttributeValue(session, object, attrs, sizeof(attrs) / sizeof(CK_ATTRIBUTE));

    有关更多信息,请参阅在 GitHub 网站上列出关键属性。

  • 仅请求您的对象支持且可以读取的属性。当您的模板命名对象没有的属性时,C_GetAttributeValue将该属性设置ulValueLenCK_UNAVAILABLE_INFORMATION为并返回CKR_ATTRIBUTE_TYPE_INVALID。敏感属性的行为方式相同并返回CKR_ATTRIBUTE_SENSITIVE。在这两种情况下,模板中的其他属性仍会收到其值。检查ulValueLen每个属性,而不仅仅是调用的返回值。有关每种对象类型支持的属性和敏感的属性,请参见PKCS #11 库属性表 AWS CloudHSM 客户端软件开发工具包 5。

  • 查看您的语言绑定拨打了多少次电话。诸如 Python 或 Java 之类的语言的 PKCS #11 绑定决定了它发送了多少C_GetAttributeValue次调用。有些绑定为每个属性发送一个调用,有些绑定发送两个调用。使用您的绑定提供的接口一次读取多个属性,并衡量您的应用程序发送的调用。

  • 在应用程序中缓存属性值。一次读取对象的属性,并存储应用程序所需的值。你可以重复使用缓存的值,直到对象发生变化为止。当其他应用程序或用户可以修改您的对象时,请在修改后刷新您的缓存。

  • 在读取属性之前分配缓冲区。PKCS #11 标准描述了可变长度值的两遍模式。您的应用程序调C_GetAttributeValue用 pValue set NULL_PTR 来了解长度,然后再次调用它来读取该值。这两个电话都发送请求。当您知道缓冲区大小可以容纳预期值时,请先分配缓冲区,然后通过一次调用读取值。

    CKR_BUFFER_TOO_SMALL对于该属性,如果缓冲区过小,则调用仍会发送请求。选择足够容纳预期值的缓冲区大小。包含模板的属性(例如)CKA_WRAP_TEMPLATE仍然需要两遍模式。

注意

这些建议适用于密钥对象和证书对象,并且对每个对象适用不同的限制。证书存储有固定的读取速率限制,对证书对象的每次C_GetAttributeValue调用都使用一个读取操作。对于关键对象,HSM 的节流属性会在它们达到容量时读取,而不是以固定速率读取。PKCS #11 库会自动重试这些请求。发送更少的请求有助于您的应用程序保持在两个限制范围内。有关更多信息,请参阅证书存储限制和HSM 节流。