当您需要将一个密码机中的密钥复制到另一个密码机时,可以在原密码机中将密钥导出,然后导入到另外一个密码机中。本文介绍如何在两台密码机之间复制密钥。
适用的密码机类型
通用密码机(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)封装和解封装方法。
在密码机B中,生成并导出封装密钥。
执行
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
执行
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
在密码机A中,使用密码机B中导出的RSA公钥,封装要复制的对称密钥。
执行
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
执行
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
执行
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
在密码机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)封装和解封装方法。
在密码机B中,生成并导出封装密钥。
执行
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
执行
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
在密码机A中,使用密码机B中导出的RSA公钥,封装要复制的非对称密钥。
执行
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
执行
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
执行
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
执行
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
在密码机B中,解封装非对称密钥的私钥,并导入非对称密钥的公钥。
执行
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
执行
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