我正在尝试使用docker映像(https://hub.docker.com/r/jboss/keycloak/版本4.5.0-Final)部署keycloak,并面临设置SSL的问题。
根据文档
Keycloak映像允许您同时指定私钥和用于服务HTTPS的证书。在这种情况下,您需要提供两个文件: tls.crt- 证书 tls.key- 私钥这些文件需要挂载在/ etc / x509 / https目录中。该映像将自动将它们转换为Java密钥库,并重新配置Wildfly以使用它。
Keycloak映像允许您同时指定私钥和用于服务HTTPS的证书。在这种情况下,您需要提供两个文件:
tls.crt- 证书 tls.key- 私钥这些文件需要挂载在/ etc / x509 / https目录中。该映像将自动将它们转换为Java密钥库,并重新配置Wildfly以使用它。
我按照给定的步骤进行操作,并为卷安装设置提供了一个包含必要文件(tls.crt和tls.key)的文件夹,但是我面临SSL握手问题,
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
错误,尝试访问浏览器时阻止了它的加载。
我使用过letencrypt来生成pem文件,并使用openssl来创建.crt和.key文件。还尝试过仅使用openssl创建这些文件以缩小问题范围,并且行为相同(如果这很重要,请提供一些其他信息)
默认情况下,当我仅指定端口绑定 -p 8443:8443 而未指定证书卷挂载 / etc / x509 / https时 ,keycloak服务器会生成一个自签名证书,并且在浏览器中查看应用程序时看不到问题
我猜这可能是证书创建问题,而不是密钥遮罩特有的问题,但是,不确定如何使它起作用。任何帮助表示赞赏
我还遇到了ERR_SSL_VERSION_OR_CIPHER_MISMATCH使用jboss / keycloak Docker映像和letsencrypt提供的免费证书时出错的问题。即使考虑了其他评论的建议。现在,我有了一个有效的(并且非常简单)的设置,它可能也对您有所帮助。
首先,我sub.example.com使用certbot 为域生成了letencrypt证书。你可以找到详细的说明和替代方法获得的证书https://certbot.eff.org/在和用户指南https://certbot.eff.org/docs/using.html。
sub.example.com
$ sudo certbot certonly --standalone Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator standalone, Installer None Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): sub.example.com Obtaining a new certificate Performing the following challenges: http-01 challenge for sub.example.com Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/sub.example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/sub.example.com/privkey.pem Your cert will expire on 2020-01-27. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew"
我docker-compose过去通过docker运行keycloak。配置和数据文件存储在path中/srv/docker/keycloak/。
docker-compose
/srv/docker/keycloak/
config
docker-compose.yml
data/certs
data/keycloack_db
当我最初使用原始的letcrypt证书进行密钥隐藏时遇到问题时,我尝试了将证书转换为另一种格式的变通方法,如先前答案的注释中所述,该方法也失败了。最终,我意识到我的问题是由对映射的证书文件设置的权限引起的。
因此,对我有用的是仅复制并重命名letencrypt提供的文件 ,然后将它们安装到容器中。
$ cp /etc/letsencrypt/live/sub.example.com/fullchain.pem /srv/docker/keycloak/data/certs/tls.crt $ cp /etc/letsencrypt/live/sub.example.com/privkey.pem /srv/docker/keycloak/data/certs/tls.key $ chmod 755 /srv/docker/keycloak/data/certs/ $ chmod 604 /srv/docker/keycloak/data/certs/*
就我而言,我需要使用Docker主机的主机网络。这不是最佳做法,您的情况不应该这样做。请在hub.docker.com/r/jboss/keycloak/的文档中找到有关配置参数的信息。
version: '3.7' networks: default: external: name: host services: keycloak: container_name: keycloak_app image: jboss/keycloak depends_on: - mariadb restart: always ports: - "8080:8080" - "8443:8443" volumes: - "/srv/docker/keycloak/data/certs/:/etc/x509/https" # map certificates to container environment: KEYCLOAK_USER: <user> KEYCLOAK_PASSWORD: <pw> KEYCLOAK_HTTP_PORT: 8080 KEYCLOAK_HTTPS_PORT: 8443 KEYCLOAK_HOSTNAME: sub.example.ocm DB_VENDOR: mariadb DB_ADDR: localhost DB_USER: keycloak DB_PASSWORD: <pw> network_mode: host mariadb: container_name: keycloak_db image: mariadb volumes: - "/srv/docker/keycloak/data/keycloak_db:/var/lib/mysql" restart: always environment: MYSQL_ROOT_PASSWORD: <pw> MYSQL_DATABASE: keycloak MYSQL_USER: keycloak MYSQL_PASSWORD: <pw> network_mode: host
这就是我最终文件和文件夹设置的样子。
$ cd /srv/docker/keycloak/ $ tree . ├── config │ └── docker-compose.yml └── data ├── certs │ ├── tls.crt │ └── tls.key └── keycloak_db
最后,我能够使用启动我的软件docker-compose。
$ cd /srv/docker/keycloak/config/ $ sudo docker-compose up -d
我们可以在容器中看到已安装的证书。
我们可以仔细检查容器中已安装的证书。
## open internal shell of keycloack container $ sudo docker exec -it keycloak_app /bin/bash ## open directory of certificates $ cd /etc/x509/https/ $ ll -rw----r-- 1 root root 3586 Oct 30 14:21 tls.crt -rw----r-- 1 root root 1708 Oct 30 14:20 tls.key
考虑从docker- compose.yml进行的设置,现在可以在https://sub.example.com:8443上使用keycloak