PHP中gnupg_sign带密码短语签名失败问题求助
带密码短语的GnuPG密钥无法签名问题排查
我正在测试HSBC沙箱,发送数据前需要对载荷进行加密和签名。HSBC为沙箱提供了预生成密钥,我拥有:
- 客户端私钥
- 客户端公钥
- HSBC公钥
以及密码短语1password
我的机器上运行着GnuPG 2.2.19,已通过PHP的gnupg_import导入全部3个密钥。执行gnupg_keyinfo后得到如下密钥信息(已修改隐私相关信息):
Array ( [0] => Array ( [disabled] => [expired] => [revoked] => [is_secret] => [can_sign] => 1 [can_encrypt] => 1 [uids] => Array ( [0] => Array ( [name] => Client Payment Notification [comment] => [email] => tomw@client.co.uk [uid] => Client_ Payment Notification [revoked] => [invalid] => ) ) [subkeys] => Array ( [0] => Array ( [fingerprint] => 70A91F261D23DDDE77CB52BE61BE8D97497C9424 [keyid] => 61BE8D97497C9424 [timestamp] => 1675936132 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => [can_sign] => 1 [disabled] => [expired] => [revoked] => ) [1] => Array ( [fingerprint] => 34CA88A208742E3DAB6850040C1088250E620B25 [keyid] => 0C1088250E620B25 [timestamp] => 1675936132 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => 1 [can_sign] => [disabled] => [expired] => [revoked] => ) ) ) [1] => Array ( [disabled] => [expired] => [revoked] => [is_secret] => [can_sign] => 1 [can_encrypt] => 1 [uids] => Array ( [0] => Array ( [name] => HSBC-Sandbox-Public [comment] => [email] => help@mail.develop.hsbc.com [uid] => HSBC-Sandbox-Public [revoked] => [invalid] => ) ) [subkeys] => Array ( [0] => Array ( [fingerprint] => 37518BFC71C9B490C9980F489E459E50958DA76C [keyid] => 9E459E50958DA76C [timestamp] => 1668584185 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => [can_sign] => 1 [disabled] => [expired] => [revoked] => ) [1] => Array ( [fingerprint] => 0F973BB7DBF26B8EA2A05299251305CBA700420A [keyid] => 251305CBA700420A [timestamp] => 1668584185 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => 1 [can_sign] => [disabled] => [expired] => [revoked] => ) ) )
我可以使用HSBC公钥成功加密消息,代码如下:
$res = gnupg_init(); gnupg_addencryptkey($res,"0F973BB7DBF26B8EA2A05299251305CBA700420A"); $enc = gnupg_encrypt($res, "just a test"); echo $enc;
输出结果为:
-----BEGIN PGP MESSAGE----- hQGMAyUTBcunAEIKAQv/VhNCgR5GQU/xYxYF5dzLh5s2oegX4ARZ0pg6PeXREsva FXh/W4hkJFb4jSdLCDSY8eerzII7AyIDrsuasG25tsfAZ1FVJhs0y5TPEqSNpLuV CG0nt9s0CFiJUWyF3gwYipE73OaMbHJxYGZy1zQLpLd4L92rhaUS2pC6Xq1SLydp hz/CWoROwxpuGekaaVX015EeFhaCeZa0K/yleTP05dbBJPaYKwi/4z5QVBMlpYwf K/nDkq8b0HG+RF6+T99GzXldp7wxBPSIY65Ft5iC9cL9vTcEFnHtiglyXziwBgNV KMLYyaf8iH2AYKLwLd31XRswHAf+E6PLMRwqoDJg639h8G8oNvYJrGJf77e95FI/ LdAzwb8SpOTAadgfysLxK0pkRgFFRxAC0ykbjjDNJVPiOqw7GfEiM4hNvnFhvmNX elfYjQCLCeDakZFKVobkkQYDyUybci1ItFvIN5fqgwIzLF+CBqUvcnpROqGkbONR hc30VqDYX1B2aMLABHGB0kYBTUzkcQl3q6nNxCYj6ib3g/6Rk8u6y++4FKQYuO3Q TbPMF7Rl4UKAGMywQEYXiWOUoEFAD49vVisYfuIk01wBfgmd/ZHu =J+Ry -----END PGP MESSAGE-----
但签名操作始终失败。我尝试使用gnupg_encryptsign,代码如下:
$res = gnupg_init(); gnupg_addencryptkey($res,"0F973BB7DBF26B8EA2A05299251305CBA700420A"); // HSBC 公钥 gnupg_addsignkey($res,"70A91F261D23DDDE77CB52BE61BE8D97497C9424", "1password"); // 客户端私钥 $enc = gnupg_encryptsign($res, "Tom Test"); echo $enc; echo "<h1>Errors</h1>"; print_r(gnupg_geterror($res));
得到错误:encrypt-sign failed
于是我尝试单独签名,不进行加密,代码如下:
$res = gnupg_init(); gnupg_addsignkey($res,"70A91F261D23DDDE77CB52BE61BE8D97497C9424", "1password"); // 客户端私钥 $signed = gnupg_sign($res, "just a test"); echo $signed; echo "<h1>Errors</h1>"; print_r(gnupg_geterror($res));
得到错误:data signing failed
为排查问题,我还进行了以下尝试:
- 留空密码短语尝试签名 - 失败
- 创建新密钥对,密码短语设为
test后尝试签名 - 失败 - 创建无密码短语的密钥对并尝试签名 - 成功
请问为何使用带密码短语的密钥时始终无法完成签名?
内容的提问来源于stack exchange,提问作者Tomwwud
相关产品推荐
相关产品推荐

