首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jose4j用SHA签名JWT

使用jose4j用SHA签名JWT
EN

Stack Overflow用户
提问于 2015-12-04 20:40:10
回答 1查看 1.2K关注 0票数 1

新的使用jose4j。我从cert中找到了这样的例子来设置私钥:

代码语言:javascript
复制
JsonWebSignature jws = new JsonWebSignature();
PKCS8EncodedKeySpec spec =
new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pk = kf.generatePrivate(spec);
jws.setKey(kf.generatePrivate(spec));

但是我得到了这个错误信息

代码语言:javascript
复制
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format    

我认为这是因为证书是作为SHA256而不是RSA创建的。下面是我被告知证书是如何创建的:

代码语言:javascript
复制
openssl req -x509 -sha256 -nodes -days 730 -newkey rsa:2048 -keyout private.key -out certificate_pub.crt

有人知道我如何用SHA256证书来签署JWT吗?

EN

回答 1

Stack Overflow用户

发布于 2015-12-08 05:29:28

有了更多信息,该私钥文件是PEM,而不是PKCS#8,因为OpenSSL应该为req -newkey创建一个现代版本。标准Java所要求的PEM和"DER“(二进制)之间的区别不仅仅是删除(并添加)开始行和结束行。

如果OpenSSL可用,最简单的解决方案是转换这两种方法,而不加密:

代码语言:javascript
复制
openssl pkcs8 -topk8 -nocrypt -outform der -in private.pem -out good.der 

然后将good.der (如果您愿意的话使用更好的名称)读入字节,并将其放在PKCS8EncodedKeySpec中,并按您发布的方式使用。旁白:您不需要篡改DataInputStream,它并不是真正用于“普通旧”字节的;java.nio.file.Files.readAllBytes可以为您打开、分配和读取。

下一个更复杂的选择是转换为PKCS#8,但仍然是PEM:与-outform der相同,但省略了-outform der(并使用指示PEM的文件名,以避免混淆)。然后在Java中以字符的形式读取该文件(通常使用Reader,通常是BufferedReader,而不是Stream),丢弃BEGINEND行,将它们之间的所有行连接起来,并将它们从base64转换为byte[]:在Java8中有java.util.Base64,在此之前,您可以使用javax.xml.bind.DatatypeConverter

要读取标准Java中的文件要困难得多。您可以阅读PEM装甲PKCS#1并转换为二进制PKCS#1,然后通过构建DER编码将PKCS#1“包装”到PKCS#8中,但这比您所熟悉的要复杂得多。或者您可以解析PKCS#1并使用组件来构造您自己的RSAPrivateCrtKey实现并直接使用它(没有工厂),同上。

另一种选择是使用来自http://www.BouncyCastle.org的第三方库,它具有比标准Java更灵活的处理PEM文件的特性。但是,您需要学习他们的API以及标准API,如果您的程序将在任何其他地方运行,您需要确保BC与您的程序一起部署或作为程序的一部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34097035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档