通过


你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 云 HSM 中的身份验证

身份验证是安全访问和使用 Azure 云 HSM 的关键方面。 本文概述了身份验证方法,包括命令行接口(CLI)、PKCS#11、Java 加密扩展(JCE)和 OpenSSL。 本文还提供了多线程处理和会话处理的最佳做法。

云 HSM CLI 身份验证

可以使用 CLI 工具进行身份验证,例如 azcloudhsm_util 在交互模式或单命令模式下。 在交互模式下,使用 login 命令。 对于单命令模式,包含singlecmdloginHSM的参数。 建议在应用程序未使用 HSM 凭据时安全地存储这些凭据。

交互模式

./azcloudhsm_util
loginHSM -u CU -s cu1 -p user1234

单命令模式

sudo ./azcloudhsm_util singlecmd loginHSM -u CU -s cu1 -p user1234 findKey

PKCS#11 身份验证

在 PKCS#11 中,可以在使用 C_Login 打开会话后,使用 C_OpenSession API 登录。 每个槽(云 HSM 群集)只需使用一次 C_Login。 成功登录后,可借助 C_OpenSession 打开其他会话,无需再次登录。

char pPin[256] = "cu1:user1234";
…
rv = (func_list->C_Initialize) (NULL);
rv = (func_list->C_GetTokenInfo) (slot, &token_info);
rv = (func_list->C_OpenSession) (slot, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL, &session_rw);
rv = (func_list->C_Login) (session_rw, CKU_USER, (CK_UTF8CHAR_PTR) pPin, n_pin);
…

若要获取用于向 PKCS#11 进行身份验证的代码示例,请参阅 将 PKCS#11 与 Azure 云 HSM 集成的指南

JCE 身份验证

Azure 云 HSM 的 JCE 提供程序支持隐式和显式登录方法。 每个方案适用于不同的用例。

建议尽可能使用隐式登录,因为 SDK 会自主管理身份验证。 如果应用程序与群集断开连接,并且需要重新身份验证,则此方法尤其有用。 在与无法直接控制应用程序代码的平台集成时,隐式登录还可以方便地向应用程序提供凭据。

LoginManager lm = LoginManager.getInstance();
lm.login("PARTITION_1","cu1", "user1234");
…
lm.logout();
…

有关登录方法的更多详细信息,请参阅 有关将 JCE 与 Azure 云 HSM 集成的指南

OpenSSL 身份验证

为 Azure 云 HSM 使用 OpenSSL 引擎时,环境变量会提供凭据。 建议在应用程序未使用 HSM 凭据时安全地存储这些凭据。 理想情况下,请将环境配置为自动检索和设置这些环境变量,以避免手动输入。

export azcloudhsm_password="cu1:user1234" 
export azcloudhsm_openssl_conf=/usr/local/bin/AzureCloudHSM-ClientSDK-1.0.4.0/azcloudhsm_openssl_dynamic.conf
export LD_LIBRARY_PATH=/usr/local/lib64/AzureCloudHSM-ClientSDK-1.0.4.0/:$LD_LIBRARY_PATH
…
sudo ./azcloudhsm_client azcloudhsm_client.cfg > /dev/null 2>&1 &
openssl genpkey -algorithm RSA -out private_key.pem -engine azcloudhsm_openssl
…

有关 OpenSSL 的身份验证详细信息,请参阅 将 OpenSSL 与 Azure 云 HSM 集成的指南

多线程处理技术

Azure 云 HSM 支持多线程应用程序,但需要注意以下事项:

  • PKCS#11:仅使用 C_Initialize 一次初始化 PKCS#11 库。 使用 C_OpenSession.. 为每个线程分配其自己的会话。 避免跨多个线程使用相同的会话。
  • JCE:仅初始化 Azure 云 HSM 提供程序一次。 避免在线程之间共享服务提供程序接口 (SPI) 对象的实例。 例如,CipherSignatureDigestMacKeyFactoryKeyGenerator对象仅应在各自的线程上下文中使用。

重试 HSM 操作的集成

Microsoft 可能会为了操作或维护目的(例如设备故障),更换您的 Azure 云 HSM 群集中的 HSM。 若要让应用程序做好应对此类情况的准备,建议为发送到群集的所有操作添加客户端重试逻辑。 此设置预计后续对失败操作的重试(无论是由于更换还是临时维护中断)都会成功。

云 HSM 客户端会话处理

每当任何应用程序执行登录或注销时,Azure Cloud HSM 客户端都会登录和注销所有 HSM 会话。因此,如果第二个应用程序使用 azurecloudhsm_client,它将共享相同的会话,并在从同一主机运行时继承相同的登录凭据。 该工具 azurecloudhsm_client 跟踪尝试登录的应用程序。 它允许正确登录的应用程序运行需要身份验证的命令。

例如,如果已登录 azurecloudhsm_util ,并且尝试使用 Azure Cloud HSM 提供程序在另一个终端窗口中运行应用程序或密钥工具,则遇到错误,因为活动会话已打开。 要进行身份验证,您必须关闭应用程序的azurecloudhsm_util会话,然后创建一个在主机上运行的azurecloudhsm_client会话。