Spring 使用私有证书启动 + Keycloak

Spring Boot + Keycloak using private certificate

我的 Spring 启动应用程序使用 public 证书与 KeyCloak 一起工作正常。但是由于我的 Keycloak 已更改为私有证书,因此出现以下错误:

"An I/O error occurred while reading from the JWK Set source: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"

我已经获得了私人证书,但还没有想出一个成功的方法来设置它;如果我对 Keycloack 端点进行卷曲,将证书作为参数传递就可以正常工作。

curl --cacert mycertificate.crt -X GET \                                                                                                                                      130 ↵
https://keycloak.address.bla/auth/realms/my-app/protocol/openid-connect/certs

我试图调整我的 ResourceServerConfiguration class 以使用证书,方法是使用我的私有证书中的 keytool 生成 keystore.jks,但我没有成功;当我尝试下面的代码时,出现以下错误:"Cannot load keys from store: class path resource [keystore.jks]"

  @Bean
  @Primary
  public JwtAccessTokenConverter createJwtAccessTokenConverter() {
    var jwtAccessTokenConverter = new JwtAccessTokenConverter();

    KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("/keystore.jks"), "changeit".toCharArray());
    jwtAccessTokenConverter.setKeyPair(keyStoreKeyFactory.getKeyPair("myAlias"));
    jwtAccessTokenConverter.setAccessTokenConverter(keycloakAccessTokenConverter);
    return jwtAccessTokenConverter;
  }

我的application.properties

security.oauth2.resource.id=account
security.oauth2.resource.jwk.key-set-uri=${app.keycloak.api}/protocol/openid-connect/certs

您尝试设置类加载器吗?

KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("keystore.jks",this.getClass().getClassLoader()), "changeit".toCharArray());

或者你可以使用@Resource

@Value("classpath:keystore.jks")
Resource keystore;

...

 KeyStoreKeyFactory key = new KeyStoreKeyFactory(this.keystore, passphrase);

只需将私有证书导入我的 JVM 即可解决问题。导入“.crt”文件后,我的所有请求都成功了;

将.crt文件导入JVM的命令如下:keytool -importcert -file my_certificate.crt -noprompt -alias certificate_alias -storepass changeit -keystore $JAVA_HOME/lib/security/cacerts