Certificate 使用jose4j使用SHA证书签署JWT

Certificate 使用jose4j使用SHA证书签署JWT,certificate,jwt,private-key,sha,Certificate,Jwt,Private Key,Sha,使用jose4j的新手。我发现过这样的例子,可以从cert设置私钥: JsonWebSignature jws = new JsonWebSignature(); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); PrivateKey pk = kf.generatePrivate(spec); jws.setKey(kf.gen

使用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的例子吗?

还有其他信息,私钥文件是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:与about相同,但省略了
-outform der
(并使用指示PEM的文件名,以避免混淆)。然后,在Java中,将该文件作为字符读取(使用
读取器
,通常是
缓冲读取器
,而不是
),丢弃
开始
结束
行,将它们之间的所有行连接起来,并将它们从base64转换为
字节[]
:在Java8中,您有
Java.util.base64
,在此之前,您可以使用
javax.xml.bind.DatatypeConverter

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


另一种选择是使用第三方库,该库在处理PEM文件方面比标准Java更灵活。但是,您需要了解他们的API以及标准API,如果您的程序将在其他任何地方运行,则需要确保BC与您的程序一起部署或作为您的程序的一部分部署。

证书使用SHA256和RSA签名,但您用于签名的私钥不使用任何哈希,仅为RSA。(如果它是加密的,PBE将包含一些散列,但这是不可选择的。)对于最新版本(1.0.0及以上),大多数
openssl
commandline操作,包括这一操作,在PEM中以PKCS#8格式写入私钥。文件的第一行是否为可读字符
---BEGIN PRIVATE KEY-----
?您(或任何人)是否使用了1.0.0+,在将PEM放入
PKCS8EncodedKeySpec
之前是否将其转换为二进制文件?证书文件是可读的,并且以------begin RSA PRIVATE KEY------开头。。。。我还尝试从文件中删除此文件并运行------END RSA,但没有任何帮助。下面是我用来读取私钥文件的代码:String filename=“C:\\private.key”;文件f=新文件(文件名);FileInputStream fis=新的FileInputStream(f);DataInputStream dis=新的DataInputStream(fis);byte[]keyBytes=新字节[(int)f.length()];dis.readfull(keyBytes);