【发布时间】:2019-10-18 02:50:00
【问题描述】:
1- 从命令行生成私钥:
openssl genrsa -aes256 -out private.key 2048
-
来自
java,阅读:String privateKey = IOUtils.toString(TestJwtSecurityUtil.class.getResourceAsStream("/private.key")); privateKey = privateKey.replace("-----BEGIN RSA PRIVATE KEY-----", ""); privateKey = privateKey.replace("-----END RSA PRIVATE KEY-----", ""); privateKey = privateKey.replaceAll("\\s+",""); byte[] encodedKey = DatatypeConverter.parseBase64Binary( privateKey ); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedKey); KeyFactory kf = KeyFactory.getInstance("RSA"); PrivateKey pKey = kf.generatePrivate(keySpec); // fails
遇到异常:
线程“主”java.security.spec.InvalidKeySpecException 中的异常: java.security.InvalidKeyException:IOException: DerInputStream.getLength():lengthTag=58,太大了。
我尝试转换为base64:
byte[] encodedKey = DatatypeConverter.parseBase64Binary( encodedString );
PrivateKey pKey = kf.generatePrivate(keySpec); // fails
得到:
Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:251)
问:如何通过这个?为了让私钥被读取,最后我可以唱 JWT 令牌:
final JwtBuilder builder = Jwts.builder().setId("id1")
....
.signWith(signatureAlgorithm, pKey);
【问题讨论】:
-
欺骗stackoverflow.com/questions/52638604stackoverflow.com/questions/41934846stackoverflow.com/questions/7216969stackoverflow.com/questions/3243018。简短回答:使用
openssl pkcs8 -topk8 -nocrypt或openssl pkey。或者首先使用keytool或 JCE 而不是 OpenSSL 生成。 @michalk:不,genrsa不加密,但它使用“传统”(PKCS1)格式而不是 PKCS8 格式。 -
所以
-aes256在使用genrsa时不加密密钥内容? -
如果您将其放入 .jks 或 .p12 密钥库,也许您的 Java 代码可以更轻松地使用您的密钥。
标签: java jwt private-key