Java KeyClope-SSL错误:证书不符合算法约束

Java KeyClope-SSL错误:证书不符合算法约束,java,amazon-web-services,docker,jboss,keycloak,Java,Amazon Web Services,Docker,Jboss,Keycloak,我正在使用以下docker命令运行连接到Amazon RDS Postgres的KeyClope实例: docker run --rm --name keycloak \ -p 9090:8080 -e KEYCLOAK_USER=xxx \ -e KEYCLOAK_PASSWORD=xxx \ -e DB_VENDOR=postgres \ -e DB_ADDR=mydb2.xxx.rds.amazonaws.com:5432 \ -e DB_USER=xxx \ -e DB_PASSWORD

我正在使用以下docker命令运行连接到Amazon RDS Postgres的KeyClope实例:

docker run --rm --name keycloak \
-p 9090:8080 -e KEYCLOAK_USER=xxx \
-e KEYCLOAK_PASSWORD=xxx \
-e DB_VENDOR=postgres \
-e DB_ADDR=mydb2.xxx.rds.amazonaws.com:5432 \
-e DB_USER=xxx \
-e DB_PASSWORD=xxx \
-e DB_DATABASE=keycloak \
jboss/keycloak:latest
但它无法连接到数据库:

05:18:54,776 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([("deployment" => "keycloak-server.war")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"keycloak-server.war\".undertow-deployment" => "java.lang.RuntimeException: RESTEASY003325: Failed to construct public org.keycloak.services.resources.KeycloakApplication(javax.servlet.ServletContext,org.jboss.resteasy.core.Dispatcher)
    Caused by: java.lang.RuntimeException: RESTEASY003325: Failed to construct public org.keycloak.services.resources.KeycloakApplication(javax.servlet.ServletContext,org.jboss.resteasy.core.Dispatcher)
    Caused by: java.lang.RuntimeException: Failed to connect to database
    Caused by: java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:jboss/datasources/KeycloakDS
    Caused by: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:jboss/datasources/KeycloakDS
    Caused by: javax.resource.ResourceException: IJ031084: Unable to create connection
    Caused by: org.postgresql.util.PSQLException: SSL error: Certificates do not conform to algorithm constraints
    Caused by: javax.net.ssl.SSLHandshakeException: Certificates do not conform to algorithm constraints
    Caused by: java.security.cert.CertificateException: Certificates do not conform to algorithm constraints
    Caused by: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on keysize limits. RSA 1024bit key used with certificate: C=US, ST=Washington, L=Seattle, O=Amazon.com, OU=RDS, CN=mydb2.xxx.us-east-1.rds.amazonaws.com.  Usage was tls server"}}
我确信以下几点:

  • RDS实例可用,端口打开。我用psql检查了它
  • 这种情况发生在
    jboss/keydove:7.0.1
    上,而在
    jboss/keydove:7.0.0
    上则不会发生。版本
    7.0.0
    运行良好
为什么会发生这种情况以及如何解决


这可能是一个太宽泛的问题,但我不是一个Java爱好者(我主要从事Python),所以这是我能做的最窄的问题。

这看起来像是Java安全性的问题。使用了不同的Java版本(1.8 vs 11),因此可能需要在RDS端的
Java.security
或密码配置中进行一些调整(如果可能):

您可以比较和调整7.0.1
java.security
文件:

$ docker run --rm -ti --entrypoint bash jboss/keycloak:7.0.1 \
  -c 'cat /etc/java/java-11-openjdk/java-11-openjdk-*/conf/security/java.security | grep -v ^# | grep -v ^$'

$ docker run --rm -ti --entrypoint bash jboss/keycloak:7.0.0 \
  -c 'cat /usr/lib/jvm/java-1.8.0-openjdk-*/jre/lib/security/java.security | grep -v ^# | grep -v ^$'
正如在不同的Java版本中所说的那样

这是失败的,因为RDS使用的RSA密钥长度只有1024位,而
java。安全性
只允许密钥长度超过1024位

将您的RDS更新到新的证书颁发机构(
RDS-ca-2019
)似乎会创建更长的密钥并解决此问题


您的实例是公共子网中的实例还是具有internet访问权限的实例?正在尝试使用TLS连接RDS?是的,我的实例可以访问internet。我用psql检查过了。我看到了完全相同的问题。使用
7.0.1
8.0.0
中的
7.0.0
中断,针对RDS运行了数周,没有问题。