新的使用jose4j。我从cert中找到了这样的例子来设置私钥:
JsonWebSignature jws = new JsonWebSignature();
PKCS8EncodedKeySpec spec =
new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey pk = kf.generatePrivate(spec);
jws.setKey(kf.generatePrivate(spec));但是我得到了这个错误信息
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format 我认为这是因为证书是作为SHA256而不是RSA创建的。下面是我被告知证书是如何创建的:
openssl req -x509 -sha256 -nodes -days 730 -newkey rsa:2048 -keyout private.key -out certificate_pub.crt有人知道我如何用SHA256证书来签署JWT吗?
发布于 2015-12-08 05:29:28
有了更多信息,该私钥文件是PEM,而不是PKCS#8,因为OpenSSL应该为req -newkey创建一个现代版本。标准Java所要求的PEM和"DER“(二进制)之间的区别不仅仅是删除(并添加)开始行和结束行。
如果OpenSSL可用,最简单的解决方案是转换这两种方法,而不加密:
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),丢弃BEGIN和END行,将它们之间的所有行连接起来,并将它们从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与您的程序一起部署或作为程序的一部分。
https://stackoverflow.com/questions/34097035
复制相似问题