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
我的 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