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
出现异常:
线程“main”中的异常 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);
是的,它是重复的。但是因为我花了 1 个多小时在 SO 站点中寻找它。基于这个回复,以及充气城堡的PEMParser。谢谢,@dave_thompson_085
>
要创建私钥:
然后从爪哇
--
final PrivateKey pKey = getPrivateKey();
final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.RS256; // private key to sign / public to confrim a sign
final JwtBuilder builder = Jwts.builder().setId("id1")
.setIssuedAt(now)
.setSubject(subject)
.setIssuer(issuer)
.setAudience("api")
.addClaims(Map.of(
"user_name", "test user",
"authorities", List.of("ROLE_USER"),
"scope", List.of("read", "write"),
"client_id", "test-client"
)
) .signWith(signatureAlgorithm, pKey);
String jwt = builder.compact();
哪里:
private static PrivateKey getPrivateKey() throws Exception {
val path = TestUtils.class.getResource("/").getPath();
final PEMParser pemParser = new PEMParser(new FileReader(path + "/private.key"));
final JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
final PEMKeyPair object = (PEMKeyPair) pemParser.readObject();
final KeyPair kp = converter.getKeyPair(object);
final PrivateKey pKey = kp.getPrivate();
return pKey;
}
然后检查,粘贴:生成的 jwt
到 https://jwt.io/(或任何其他工具)以查看/检查内容。
在那里放置一个公开.key内容以检查签名。看到一切都是绿色的。
我试图测试我正在构建的一个关于JWT的软件的功能,以了解它,它使用Firebase JWT PHP包 我正在尝试创建一个使用密钥对作为编码/解码的测试用例,但无法获得http://jwt.io页面以使用我的密钥创建令牌。 这些是我使用命令创建的密钥,没有任何修改。 我转到页面,选择HS256/384/512并删除页面默认设置的键。然后我粘贴我的私钥以便对我的数据进行签名。但是,该页面不会生成任何J
后端服务器有一个endpoint,在ping时提供JSON响应,并受Apigee边缘代理的保护。目前,该endpoint没有安全性,我们希望为发出请求的所有客户端实现仅承载令牌身份验证。所有向API发出请求的客户端都将在授权承载中发送JWT令牌,Apigee Edge将用于验证JWT令牌。 我如何使用keydape生成这个JWT令牌? 此外,Apigee还需要一个JWT令牌来源的公钥(签署JWT令
我有一个由多个客户端访问的JWT实现。从某种意义上说,多个客户端正在向我发送JWT令牌,他们正在使用我在他们之间共享的RSA公钥创建JWT令牌。我正在使用RSA私钥解码JWT令牌。 但现在由于一些安全原因,我需要向他们发送不同的公钥,并获得JWT令牌,然后使用我拥有的一个私钥对其进行解码。 简而言之,我将如何生成多个公钥和单个私钥或任何类似的方法。
鉴于: 由RSACryptoServiceProvider生成的签名密钥。 创建带有孩子的签名jwt的需求。 如果签名密钥来自x509证书,那么我会将kid设置为x5t。在这种情况下,情况并非如此。我可以为孩子编造一些武断的东西,但是如果碰撞不太可能发生,并且孩子和证书之间存在有意义的联系,那就最好了。 我的意图是:- 创建一个字节数组,通过将模字节附加到指数字节来创建。 SHA256编码数组。
我正在使用jose-jwt库,并希望使用RS256加密算法在C#中创建一个有签名的JWT。我对密码学没有经验,所以请原谅我的无知。我在文档中看到以下示例: 它显示了文件的使用,但是如何使用下面表单的RSA密钥文件呢?我正在查看X509Certificate2的文档,但我看不到RSA私钥的选项。它似乎只接受,我认为这是公钥。 最后,文档中列出的两个选项之间的区别是什么?我如何在这两个选项之间进行选择
我有一个私钥文件(PEM BASE64编码)。我想用它来解密一些其他数据。使用Java我试着读取文件并解码其中的BASE64编码数据。这是我尝试的代码片段.... 我得到以下错误 类似的问题已经贴在这里,但那些对我没有用。几乎所有的人都建议使用Bouncycastle provider,而Bouncycastle provider并不愿意使用FIPS兼容的provider,并且不确定BC prov
我需要与GitHub集成API进行交互,但具体是从。NET 4.0,所以我不能使用Octokit。 基本上,我得到了一个格式化的私有rsa密钥(标准不支持。NET API),并且必须发送RS256 jwt令牌才能获得与API交互的身份验证令牌。 提供了以下ruby示例代码: 使用下面的curl示例 以及以下Result示例: