在密码机HSM之间复制密钥

当您需要将一个密码机中的密钥复制到另一个密码机时,可以在原密码机中将密钥导出,然后导入到另外一个密码机中。本文介绍如何在两台密码机之间复制密钥。

适用的密码机类型

通用密码机(FIPS)

适用场景

两台密码机不在同一集群,密钥无法自动同步的场景。

说明

两台密码机属于同一集群时,集群中的密码机信息会自动同步,您无需复制密钥。

前提条件

已启动HSM客户端代理(hsm_proxy)。具体操作,请参见启动HSM客户端(hsm_proxy)

使用的工具

key_mgmt_tool命令行工具。详细介绍,请参见key_mgmt_tool

执行本文档操作前,请通过key_mgmt_tool(密码机密钥管理工具)并使用CU用户登录,命令如下。

说明
  • 请将/opt/hsm/bin/key_mgmt_tool替换为真实路径。

  • 请将<yourCuUserName><yourCuUserPassword>替换真实CU用户名、密码。

$/opt/hsm/bin/key_mgmt_tool 
Command: loginHSM -u CU -s <yourCuUserName> -p <yourCuUserPassword>

复制对称密钥

以将密码机A中的对称密钥,复制到密码机B中为例介绍。其中:

  • 被复制的密钥为AES 256位密钥。

  • 封装密钥采用RSA 2048位密钥,公钥指数使用65537。

  • 导出复制的密钥时,使用RSA_OAEP(SHA256)封装和解封装方法。

  1. 在密码机B中,生成并导出封装密钥。

    1. 执行genRSAKeyPair命令,生成一个RSA密钥作为封装密钥。

      Command:  genRSAKeyPair -m 2048 -e 65537 -l rsa_wrapping_key

      参数

      说明

      -m

      密钥长度。

      -e

      公钥指数。取值在65537~2^31-1之间,且为奇数。

      -l

      密钥标签。

      预期输出:

      	Cfm3GenerateKeyPair returned: 0x00 : HSM Return: SUCCESS
        Cfm3GenerateKeyPair:    public key handle: 33    private key handle: 32
      	Cluster Status:
      	Node id 0 status: 0x00000000 : HSM Return: SUCCESS
    2. 执行exportPubKey命令,导出RSA公钥。

      Command:  exportPubKey -k 33 -out rsa_wrapping_key.pub 

      参数

      说明

      -k

      公钥的标识。

      -out

      导出后的公钥文件名。

      预期输出:

      	PEM formatted public key is written to rsa_wrapping_key.pub
      	Cfm3ExportPubKey returned: 0x00 : HSM Return: SUCCESS
  2. 在密码机A中,使用密码机B中导出的RSA公钥,封装要复制的对称密钥。

    1. 执行genSymKey命令,生成对称密钥。如果您已有对称密钥,请跳过本步骤。

      Command:  genSymKey -t 31 -s 32 -l mySymmetricKey

      参数

      说明

      -t

      密钥类型。取值:

      • 16:GENERIC_SECRET

      • 21:3DES

      • 31:AES

      -s

      密钥长度。单位为字节。

      • AES类型的密钥:取值为16、 24或32。

      • 3DES类型的密钥:取值为24。

      • GENERIC_SECRET类型的密钥:取值<= 800。

      -l

      密钥标签。

      预期输出:

      Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS
      	Symmetric Key Created.  Key Handle: 29
      	Cluster Status:
      	Node id 0 status: 0x00000000 : HSM Return: SUCCESS
    2. 执行importPubKey命令,导入从密码机B获取的RSA公钥。

      Command:  importPubKey -sess -l rsa_pub_key -f rsa_wrapping_key.pub

      参数

      说明

      -sess

      密钥用于会话。表示它是临时使用,而非长期存储。

      -l

      密钥标签。

      -f

      公钥的文件名。

      预期输出:

      	Cfm3CreatePublicKey returned: 0x00 : HSM Return: SUCCESS
        Public Key Handle: 28 
      	Cluster Status:
      	Node id 0 status: 0x00000000 : HSM Return: SUCCESS
    3. 执行wrapKey命令,使用上述RSA公钥进行对称密钥的封装并保存到文件。

      Command:  wrapKey -k 29 -w 28 -m 8 -t 3 -out symmetric_key_wrapped_with_rsa.wrap

      参数

      说明

      -k

      待封装的密钥的标识。

      -w

      封装密钥的标识。

      -m

      封装方法。取值:

      • 0:AES_CBC_PAD (如果设置了-noheader,则必须提供 IV)

      • 1:AES_CBC (如果设置了-noheader,则必须提供 IV)

      • 4:CLOUDHSM_AES_KEY_WRAP

      • 5:NIST_AES_WRAP_NO_PAD (密钥长度必须是 8 字节的倍数)

      • 6(默认值):NIST_AES_WRAP_PAD

      • 7:RSA_AES

      • 8:RSA_OAEP (密钥长度必须 <= (Mod_len-2*Hash_len-2) 字节)

      • 9:NIST_TDEA_WRAP (密钥长度必须是 4 字节的倍数)

      • 10:AES_GCM

      • 11:CLOUDHSM_AES_GCM

      • 12:RSA_PKCS (密钥长度必须 <= (Mod_len-11) 字节)

      -t

      哈希类型。封装方法为RSA_AES(7)、RSA_OAEP(8)时,需要设置。取值:

      • 2(默认值):SHA1

      • 3:SHA256

      • 4:SHA384

      • 5:SHA512

      • 6:SHA224

      -out

      密钥封装后,保存的文件名称。

      预期输出:

      	Cfm2WrapKey5 returned: 0x00 : HSM Return: SUCCESS
      	Key Wrapped.
      	Wrapped Key written to file "symmetric_key_wrapped_with_rsa.wrap" length 525
  3. 在密码机B中,执行unWrapKey命令,使用RSA私钥对已封装的对称密钥进行解封装并存入密码机。

    Command:  unWrapKey  -f symmetric_key_wrapped_with_rsa.wrap -w 32 -m 8 -t 3 

    参数

    说明

    -f

    封装后的密钥文件名称。

    -w

    封装密钥的标识。

    -m

    封装方法。取值:

    • 0:AES_CBC_PAD (如果设置了-noheader,则必须提供 IV)

    • 1:AES_CBC (如果设置了-noheader,则必须提供 IV)

    • 4:CLOUDHSM_AES_KEY_WRAP

    • 5:NIST_AES_WRAP_NO_PAD

    • 6(默认值):NIST_AES_WRAP_PAD

    • 7:RSA_AES

    • 8:RSA_OAEP

    • 9:NIST_TDEA_WRAP

    • 10:AES_GCM

    • 11:CLOUDHSM_AES_GCM

    • 12:RSA_PKCS

    -t

    哈希类型。封装方法为RSA_AES(7)、RSA_OAEP(8)时,需要设置。取值:

    • 2(默认值):SHA1

    • 3:SHA256

    • 4:SHA384

    • 5:SHA512

    • 6:SHA224

    	Cfm2UnWrapKey5 returned: 0x00 : HSM Return: SUCCESS
    	Key Unwrapped.  Key Handle: 31 
    	Cluster Status:
    	Node id 0 status: 0x00000000 : HSM Return: SUCCESS

复制非对称密钥

以将密码机A中的非对称密钥,复制到密码机B中为例介绍。其中:

  • 被复制的密钥为EC secp256k1密钥。

  • 封装密钥采用RSA 2048位密钥,公钥指数使用65537。

  • 导出复制的密钥时,使用RSA_OAEP(SHA256)封装和解封装方法。

  1. 在密码机B中,生成并导出封装密钥。

    1. 执行genRSAKeyPair命令,生成一个RSA密钥作为封装密钥。

      Command:  genRSAKeyPair -m 2048 -e 65537 -l rsa_wrapping_key

      参数

      说明

      -m

      密钥长度。

      -e

      公钥指数。取值在65537~2^31-1之间,且为奇数。

      -l

      密钥标签。

      预期输出:

      	Cfm3GenerateKeyPair returned: 0x00 : HSM Return: SUCCESS
        Cfm3GenerateKeyPair:    public key handle: 33    private key handle: 32
      	Cluster Status:
      	Node id 0 status: 0x00000000 : HSM Return: SUCCESS
    2. 执行exportPubKey命令,导出RSA公钥。

      Command:  exportPubKey -k 33 -out rsa_wrapping_key.pub 

      参数

      说明

      -k

      公钥的标识。

      -out

      导出后的公钥文件名。

      预期输出:

      	PEM formatted public key is written to rsa_wrapping_key.pub
      	Cfm3ExportPubKey returned: 0x00 : HSM Return: SUCCESS
  2. 在密码机A中,使用密码机B中导出的RSA公钥,封装要复制的非对称密钥。

    1. 执行genECCKeyPair命令,生成非对称密钥。如果您已有非对称密钥,请跳过本步骤。

      Command:   genECCKeyPair -i 16 -l  secp256k1_key

      参数

      说明

      -i

      ECC曲线。取值:1~16。

      -l

      密钥标签。

      预期输出:

      	Cfm3GenerateKeyPair returned: 0x00 : HSM Return: SUCCESS
      	Cfm3GenerateKeyPair:    public key handle: 29    private key handle: 28
      	Cluster Status:
      	Node id 0 status: 0x00000000 : HSM Return: SUCCESS
    2. 执行importPubKey命令,导入从密码机B获取的RSA公钥。

      Command:  importPubKey -sess -l rsa_pub_key -f rsa_wrapping_key.pub

      参数

      说明

      -sess

      密钥用于会话。表示它是临时使用,而非长期存储。

      -l

      密钥标签。

      -f

      公钥的文件名。

      预期输出:

      	Cfm3CreatePublicKey returned: 0x00 : HSM Return: SUCCESS
        Public Key Handle: 31 
      	Cluster Status:
      	Node id 0 status: 0x00000000 : HSM Return: SUCCESS
    3. 执行wrapKey命令,使用导入的RSA公钥,对非对称密钥的私钥进行封装。

      Command:  wrapKey -k 28 -w 31 -m 8 -t 3 -out secp256k1_key_wrapped_with_rsa.wrap

      参数

      说明

      -k

      待封装的密钥的标识。

      -w

      封装密钥的标识。

      -m

      封装方法。取值:

      • 0:AES_CBC_PAD (如果设置了-noheader,则必须提供 IV)

      • 1:AES_CBC (如果设置了-noheader,则必须提供 IV)

      • 4:CLOUDHSM_AES_KEY_WRAP

      • 5:NIST_AES_WRAP_NO_PAD (密钥长度必须是 8 字节的倍数)

      • 6(默认值):NIST_AES_WRAP_PAD

      • 7:RSA_AES

      • 8:RSA_OAEP (密钥长度必须 <= (Mod_len-2*Hash_len-2) 字节)

      • 9:NIST_TDEA_WRAP (密钥长度必须是 4 字节的倍数)

      • 10:AES_GCM

      • 11:CLOUDHSM_AES_GCM

      • 12:RSA_PKCS (密钥长度必须 <= (Mod_len-11) 字节)

      -t

      哈希类型。封装方法为RSA_AES(7)、RSA_OAEP(8)时,需要设置。取值:

      • 2(默认值):SHA1

      • 3:SHA256

      • 4:SHA384

      • 5:SHA512

      • 6:SHA224

      -out

      密钥封装后,保存的文件名称。

      预期输出:

      	Cfm2WrapKey5 returned: 0x00 : HSM Return: SUCCESS
      	Key Wrapped.
      	Wrapped Key written to file "secp256k1_key_wrapped_with_rsa.wrap" length 515
    4. 执行exportPubKey命令,导出非对称密钥的公钥。

      Command:  exportPubKey -k 29 -out secp256k1_key.pub 

      参数

      说明

      -k

      公钥的标识。

      -out

      导出后的公钥文件名。

      预期输出:

      	PEM formatted public key is written to secp256k1_key.pub
      	Cfm3ExportPubKey returned: 0x00 : HSM Return: SUCCESS
  3. 在密码机B中,解封装非对称密钥的私钥,并导入非对称密钥的公钥。

    1. 执行unWrapKey命令,使用RSA私钥,对已封装的非对称密钥的私钥,进行解封装。

      Command:  unWrapKey  -f secp256k1_key_wrapped_with_rsa.wrap -w 32 -m 8 -t 3

      参数

      说明

      -f

      封装后的密钥文件名称。

      -w

      封装密钥的标识。

      -m

      封装方法。取值:

      • 0:AES_CBC_PAD (如果设置了-noheader,则必须提供 IV)

      • 1:AES_CBC (如果设置了-noheader,则必须提供 IV)

      • 4:CLOUDHSM_AES_KEY_WRAP

      • 5:NIST_AES_WRAP_NO_PAD

      • 6(默认值):NIST_AES_WRAP_PAD

      • 7:RSA_AES

      • 8:RSA_OAEP

      • 9:NIST_TDEA_WRAP

      • 10:AES_GCM

      • 11:CLOUDHSM_AES_GCM

      • 12:RSA_PKCS

      -t

      哈希类型。封装方法为RSA_AES(7)、RSA_OAEP(8)时,需要设置。取值:

      • 2(默认值):SHA1

      • 3:SHA256

      • 4:SHA384

      • 5:SHA512

      • 6:SHA224

      预期输出:

      	Cfm2UnWrapKey5 returned: 0x00 : HSM Return: SUCCESS
      	Key Unwrapped.  Key Handle: 27 
      	Cluster Status:
      	Node id 0 status: 0x00000000 : HSM Return: SUCCESS
    2. 执行importPubKey命令,导入非对称密钥的公钥。

      Command:  importPubKey -l secp256k1_key_pub_imported -f secp256k1_key.pub

      预期输出:

      参数

      说明

      -sess

      密钥用于会话。表示它是临时使用,而非长期存储。

      -l

      密钥标签。

      -f

      公钥的文件名。

      	Cfm3CreatePublicKey returned: 0x00 : HSM Return: SUCCESS
      Public Key Handle: 26 
      	Cluster Status:
      	Node id 0 status: 0x00000000 : HSM Return: SUCCESS