OpenSSL unable to verify data: error:0906D06C:PEM routines:PEM_read_bio:no start line in Box API

OpenSSL unable to verify data: error:0906D06C:PEM routines:PEM_read_bio:no start line in Box API

将以下正文发送到 Box OAuth /token 操作时出现上述错误: grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&client_id=.............&client_secret=..........&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Im81NGFtcGR6In0=.eyJpc3MiOiIyOHRhZmZ0ejhlenhncnI3aTBocmZnMGlteTc2MjRuMyIsInN1YiI6IjU0MjA5MSIsImJveF9zdWJfdHlwZSI6ImVudGVycHJpc2UiLCJhdWQiOiJodHRwczovL2FwaS5ib3guY29tL29hdXRoMi90b2tlbiIsImp0aSI6IjE0NDYyMzA3MTgxMjM0NTYiLCJleHAiOjE0NDYyMzA3NjgsImlhdCI6MTQ0NjIzMDcxOH0=.ANwpzohhFyUmPMw1wh6kM8xzqsUanS3UIdEPN40hvpVDmzI9wS0fTpmxWvudGPPXXmeE0Cr+frbMx+R9V9DvzfJsGv2+mu1bqwsjHwPkOy06IigAvgiJPPFt9CuIdmY/H6pGtDpODfeau77KrT0OJhpQX9He4xy0maS26D7yc/5F3fyxZXHdG/XzTpx88xTpg2HbEJ5ImeZjxkFf6ZH4Un0ZY9TJ3TSEITTcqRxhAUN2qAttnX8H5jmKWyTE5U78+f1LzQz1lPjnQsj/BSRCrF2jkf7N0LfJwq3U1BXNBWiEZRW8wqvaTvZLpiODDsl6VuG/xs1m549wGVwyXCglJQ==

现在,断言参数的 JWT 在 jwt.io 处正确验证,并且定义到 Box 的 Public 密钥也在 UI 中验证 jwt.io ].

这表明我发送的内容是正确的。

但是 Box 有问题.....任何帮助都会非常受欢迎!

对...这很烦人! 尽管已经为其他 Public API 创建了正确的 JWT,并且拥有声明的 Header 和 body,以及由 jwt.io 验证的签名,THE让 box 接受我的 JWT 的唯一方法是使用 Box SDK 使用的 JOSE4J 实用程序。

这真是糟糕的 BOX - 提升你的游戏,并支持有效的 JWT,而不仅仅是 JOSE4J 创建的专有的 类!!!

问题似乎出在 public 和在 DOS 命令提示符下使用 openssl 生成的私钥。

您可以按照 link 中的说明进行操作: https://box-content.readme.io/docs/app-auth

首先你要下载Cygwin工具:http://www.cygwin.com/

然后,您可以在 Cygwin 控制台中启动以下命令:

对于私钥

openssl genrsa -aes256 -out private_key.pem 2048

对于public键

openssl rsa -pubout -in private_key.pem -out public_key.pem

一定要包含完整的页眉和页脚:'-----BEGIN PUBLIC KEY-----' AND '-----END PUBLIC KEY-- ---'

生成 public 密钥后,您需要将其添加到应用的配置中。 完成后你会得到一个 Public Key ID.

您应该能够使用 Box API 连接您的密钥。

var privateKey = File.ReadAllText("private_key.pem");

var boxConfig = new BoxConfig(CLIENT_ID, CLIENT_SECRET, ENTERPRISE_ID, privateKey, JWT_PRIVATE_KEY_PASSWORD, JWT_PUBLIC_KEY_ID);
var boxJWT = new BoxJWTAuth(boxConfig);

var adminToken = boxJWT.AdminToken();
Console.WriteLine("Admin Token: " + adminToken);

希望对您有所帮助

问题示例中的 JWT 是断言 parameter 的值,其部分似乎使用常规 base64 编码而不是 [=13= 规定的 base64url 编码进行编码]. Many/most base64 实现在解码方面非常自由,并且很乐意接受 base64 或 base64url 可互换。我猜这就是为什么尽管 JWT 在技术上不符合规范,但在 jwt.io 之类的地方直接使用时它可以验证。但是,如果在 HTTP 请求正文中发送时未正确编码,则可能会导致问题,预计为 application/x-www-form-urlencoded。例如,'+' 将解码为 space,许多 base64 解码器将忽略它。您看到的错误中的描述似乎与问题不符,但它会破坏数据并在某些时候成为问题(除非您正在 url 编码参数值并且只是在问题中显示它们未编码)。使用 base64url 而不是 base64 将意味着断言 parameter 的值不需要 url 编码并且在 url 解码期间不会被弄乱。 base64url 将与 JWT 兼容。至少它可以让你排除一些潜在的问题。

我遇到了完全相同的问题,来自 Box 的相同错误消息和 JWT 在 jwt.io 中正确验证。

原来问题出在Base64 vs Base64Url编码上。正如 Brian 指出的那样,jwt.io 可以同时使用 Base64 和 Base64Url 编码,但 Box 需要 Base64Url。我使用的框架默认使用 Base64,这就是问题所在,在 JWT 断言的所有部分强制使用 Base64Url 后,Box 登录成功。