无法通过 Chef API 正确验证

Can't authenticate properly with Chef API

我一直在尝试构建一个 Scala 库来调用 Chef APIs,但我一直在验证 API 调用时遇到这个问题。

我已经三重检查,私钥和所有其他的都正确 headers。我使用的代码在这里:

https://github.com/LiamHaworth/shef/blob/master/src/main/scala/au/id/haworth/shef/ChefUtils.scala

我是这样称呼它的

import au.id.haworth.shef.{RequestMethod, ChefUtils}
import au.id.haworth.shef.ChefServer

val key = io.Source.fromFile("user.pem").getLines.mkString("\n")

val chefServer = ChefServer("chef.example.com", 443, "https", "myorg", "myuser", key)

ChefUtils.sendRequestToServer(chefServer, RequestMethod.GET, "", "")

但我一直从服务器收到此响应

"{"error":["Invalid signature for user or client 'myuser'"]}"

我确信这个问题很简单,并且正盯着我看,但我看不到它,所以我们将不胜感激任何帮助

我已成功获得 API 进行身份验证。在调试模式下使用 knife 检查 headers 它产生了什么,并在我的 mixlib 中添加了额外的一行来打印规范的 headers 我让它工作了。

使用 mixlib 打印的规范 headers 我 运行 他们通过我的签名代码发现我没有得到与签名相同的结果所以我更深入地发现我以非常错误的方式签署我的 headers。

我是在消化它们而不是签名!在我的代码中将 RSADigestSigner 换成 Signature 并更改算法(SHA1withRSARSA)后,我终于得到了与 headers 相同的签名混合库的!

TL;DR 我愚蠢地使用了错误的 类 来做我想做的事。我所做的更改可以在此提交中看到:

https://github.com/LiamHaworth/shef/commit/2db2aa5b89cae272eecd0901be91533b61d2a6c3