【发布时间】:2013-08-02 07:59:27
【问题描述】:
我正在尝试在 Go 中实现 Chef API client,但一直在尝试创建正确的请求标头 RSA 签名。根据documentation:
规范标头使用发送请求的客户端计算机使用的私钥进行签名,并且还使用 Base64 进行编码。
以下对OpenSSL::PKey::RSA.private_encrypt()的ruby调用可以在mixlib-authenticationgem code中找到,它使用OpenSSL bindings,private_encrypt()方法调用RSA_private_encryptopenssl function。
很遗憾,我在 Go 的标准库中找不到匹配的函数; crypto/rsa 看起来很接近,但它只实现了传统的加密方法:使用 public 密钥加密,使用 private 密钥进行哈希签名。 OpenSSL 的RSA_private_encrypt 则相反:它使用私钥加密(小)消息(类似于从消息哈希创建签名)。
这个“签名”也可以用这个命令来实现:
openssl rsautl -sign -inkey path/to/private/key.pem \
-in file/to/encrypt -out encrypted/output
是否有任何本地 Go 库可以实现与 OpenSSL 的 RSA_private_encrypt 相同的结果,或者唯一的方法是使用 Cgo 从 OpenSSL 库中调用此函数?也许我错过了一些东西。我的想法是在没有任何非 go 依赖项的情况下实现客户端。
我是 Go 新手,所以我不确定是否可以深入了解 crypto/rsa 模块源代码。
找到了similar question,但是the answer使用SignPKCS1v15显然是错误的(这个function encrypts message's hash, not the message itself)。
【问题讨论】:
-
Chef API 文档非常不清楚,但我认为您应该签署标头,这意味着 SignPKCS1v15 可能是您想要的。
-
@GregS,可悲的是,事实并非如此,我仔细检查了mixlib-authentication sources。
-
我认为您可能是正确的。我怀疑它使用的是 PKCS1 v15 block type 1 填充,但这对你没有帮助。对不起。