在 Spring Boot 安全性中使用公钥/私钥创建和验证 JWT 签名
Posted
技术标签:
【中文标题】在 Spring Boot 安全性中使用公钥/私钥创建和验证 JWT 签名【英文标题】:Creating and Verifying JWT signature using public/private key in Spring boot security 【发布时间】:2018-05-22 15:09:34 【问题描述】:想了解spring boot security中使用公钥和私钥创建JWT签名和验证的过程。
我正在尝试使用 HMAC 算法验证 JWT 令牌。我正在使用硬编码的秘密“MYSECRET”构建 JWT。
Jwts.builder()
.setClaims(claims)
.setSubject(subject)
.setAudience(audience)
.setIssuedAt(createdDate)
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS512, "MYSECRET")
.compact()
解析代码如下
Jwts.parser()
.setSigningKey("MYSECRET")
.parseClaimsJws(token)
.getBody();
我不想使用签名密钥作为“MYSECRET”,而是使用公钥和私钥
【问题讨论】:
您的代码没有使用spring security,它使用的是jjwt
库,可以与spring一起使用,也可以不使用。或者,spring 有自己的 JWT 实现。您想调整您的代码以使用密钥对还是全部重新实现?
【参考方案1】:
生成 JKS Java KeyStore 文件
让我们首先使用命令行工具 keytool 生成密钥——更具体地说是一个 .jks 文件:
导出您的公钥keytool -genkeypair -alias mytest -keyalg RSA -keypass 我的密码 -keystore mytest.jks -storepass 我的通行证
keytool -list -rfc --keystore mytest.jks | openssl x509 -通知 pem -公钥
使用您的密钥在您的授权服务器中签署令牌。
@Bean
public JwtAccessTokenConverter accessTokenConverter()
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
KeyStoreKeyFactory keyStoreKeyFactory =
new KeyStoreKeyFactory(new ClassPathResource("mytest.jks"), "mypass".toCharArray());
converter.setKeyPair(keyStoreKeyFactory.getKeyPair("mytest"));
return converter;
最后在资源服务器中使用你的公钥。
@Bean
public JwtAccessTokenConverter accessTokenConverter()
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
Resource resource = new ClassPathResource("public.txt");
String publicKey = null;
try
publicKey = IOUtils.toString(resource.getInputStream());
catch (final IOException e)
throw new RuntimeException(e);
converter.setVerifierKey(publicKey);
return converter;
【讨论】:
有没有办法在不使用 OAuth 的情况下做到这一点? Oauth2可以使用(或不使用)JWT,但不需要使用非对称密钥对实现JWT认证系统 JWT 我们可以用 JWT 来实现,这很好!我们称之为无状态,它可以使您的应用具有可扩展性,因为您的资源无需检查数据库中的令牌,他们只需验证密钥是否足够! @user8363477 如果您不想使用 oauth2,您只需使用他们的私钥并通过读取文件而不是您的秘密来公开!它会工作我也用它! 您能提供更多描述吗?实际上我是第一次在多模块项目上工作,我不知道我的第二个模块请求应该如何授权。以上是关于在 Spring Boot 安全性中使用公钥/私钥创建和验证 JWT 签名的主要内容,如果未能解决你的问题,请参考以下文章