我正在尝试使用 docker 镜像(https://hub.docker.com/r/jboss/keycloak/ 版本 4.5.0-Final)部署 keycloak,但遇到了设置 SSL 的问题。
根据文档
Keycloak image allows you to specify both a private key and a certificate for serving HTTPS. In that case you need to provide two files:
tls.crt - a certificate tls.key - a private key Those files need to be mounted in /etc/x509/https directory. The image will automatically convert them into a Java keystore and reconfigure Wildfly to use it.
我按照给定的步骤进行操作,并为卷安装设置提供了一个包含必要文件(tls.crt 和 tls.key)的文件夹,但我遇到了 SSL 握手问题,获取
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
错误,尝试访问时阻止浏览器中的 keycloak 加载。
我已经使用 letsencrypt 生成 pem 文件并使用 openssl 创建 .crt 和 .key 文件。 还尝试只用 openssl 来创建这些文件以缩小问题范围,并且行为是相同的(如果这很重要,还有一些额外的信息)
默认情况下,当我仅指定端口绑定(bind) -p 8443:8443 而未指定证书卷挂载 /etc/x509/https 时,keycloak 服务器会生成一个自签名证书,我在浏览器中查看应用程序时没有发现问题
我想这可能更像是一个证书创建问题,而不是任何特定于 keycloak 的问题,但是,不确定如何让它工作。 感谢任何帮助
最佳答案
我还遇到了 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
错误的问题,使用 jboss/keycloak Docker image和 free certificates from letsencrypt .即使在考虑了其他评论的建议之后。现在,我有了一个有效(而且非常简单)的设置,它也可能对您有所帮助。
1) 生成letsencrypt证书
首先,我使用 certbot 为域 sub.example.com
生成了我的 letsencrypt 证书。您可以在 https://certbot.eff.org/ 找到详细说明和获得证书的替代方法。用户指南位于 https://certbot.eff.org/docs/using.html .
$ 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"
2)准备docker-compose环境
我使用 docker-compose
通过 docker 运行 keycloak。配置和数据文件存储在路径 /srv/docker/keycloak/
中。
- 文件夹
config
包含docker-compose.yml
- 文件夹
data/certs
包含我通过 letsencrypt 生成的证书 - 文件夹
data/keycloack_db
映射到数据库容器以使其数据持久化。
将证书文件放到正确的路径
当我第一次为 keycloak 使用原始的 letscrypt 证书时遇到问题时,我尝试了将证书转换为另一种格式的解决方法,如前一个答案的评论中所述,但也失败了。最终,我意识到我的问题是由映射证书文件的权限设置引起的。
因此,对我有用的是复制并重命名 letsencrypt 提供的文件,然后将它们挂载到容器中。
$ 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-compose.yml
在我的例子中,我需要使用我的 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
我们可以在容器中看到挂载的证书。
$ 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 的设置,keycloak 现在可以在 https://sub.example.com:8443 获得
关于docker - 使用 docker 镜像的 Keycloak SSL 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52674979/