Vso*_*oma 6 ssl docker keycloak keycloak-services
我正在尝试使用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以使用它。
我按照给定的步骤进行操作,并为卷安装设置提供了一个包含必要文件(tls.crt和tls.key)的文件夹,但是我面临SSL握手问题,
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
错误,尝试访问浏览器时阻止了它的加载。
我使用过letencrypt来生成pem文件,并使用openssl来创建.crt和.key文件。还尝试过仅使用openssl创建这些文件以缩小问题范围,并且行为相同(如果这很重要,请提供一些其他信息)
默认情况下,当我仅指定端口绑定-p 8443:8443而未指定证书卷挂载/ etc / x509 / https时,keycloak服务器会生成一个自签名证书,并且在浏览器中查看应用程序时看不到问题
我猜这可能是证书创建问题,而不是密钥遮罩特有的问题,但是,不确定如何使它起作用。任何帮助表示赞赏
Kiw*_*iwi 19
我还遇到了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。
$ 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"
Run Code Online (Sandbox Code Playgroud)
我docker-compose过去常常通过 docker 运行 keycloak。配置和数据文件存储在 path 中/srv/docker/keycloak/。
config包含docker-compose.ymldata/certs包含我通过letsencrypt 生成的证书data/keycloack_db映射到数据库容器以使其数据持久化。当我第一次遇到使用原始 letcrypt 证书作为 keycloak 的问题时,我尝试了将证书转换为另一种格式的解决方法,如先前答案的评论中所述,但也失败了。最终,我意识到我的问题是由设置到映射证书文件的权限引起的。
因此,对我有用的只是复制和重命名 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/*
Run Code Online (Sandbox Code Playgroud)
就我而言,我需要使用我的 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
Run Code Online (Sandbox Code Playgroud)
这就是我的最终文件和文件夹设置的样子。
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
Run Code Online (Sandbox Code Playgroud)
最后,我能够使用docker-compose.
$ cd /srv/docker/keycloak/
$ tree
.
??? config
? ??? docker-compose.yml
??? data
??? certs
? ??? tls.crt
? ??? tls.key
??? keycloak_db
Run Code Online (Sandbox Code Playgroud)
我们可以看到容器内挂载的证书。
$ cd /srv/docker/keycloak/config/
$ sudo docker-compose up -d
Run Code Online (Sandbox Code Playgroud)
我们可以仔细检查容器内安装的证书。
## 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
Run Code Online (Sandbox Code Playgroud)
考虑到 docker-compose.yml 的设置,keycloak 现在可以在https://sub.example.com:8443 获得
经过研究后,以下方法有效(对于自签名证书,我仍然必须弄清楚如何使用letencrypt CA for prod)
使用keytool生成自签名证书
keytool -genkey -alias localhost -keyalg RSA -keystore keycloak.jks -validity 10950
Run Code Online (Sandbox Code Playgroud)
将.jks转换为.p12
keytool -importkeystore -srckeystore keycloak.jks -destkeystore keycloak.p12 -deststoretype PKCS12
Run Code Online (Sandbox Code Playgroud)
从.p12密钥库生成.crt
openssl pkcs12 -in keycloak.p12 -nokeys -out tls.crt
Run Code Online (Sandbox Code Playgroud)
从.p12密钥库生成.key
openssl pkcs12 -in keycloak.p12 -nocerts -nodes -out tls.key
Run Code Online (Sandbox Code Playgroud)
然后使用tls.crt和tls.key进行卷挂载/ etc / x509 / https
另外,在安全应用程序中,在keycloak.json文件中指定以下属性
"truststore" : "path/to/keycloak.jks",
"truststore-password" : "<jks-pwd>",
Run Code Online (Sandbox Code Playgroud)
对于尝试使用受密码保护的私钥文件运行 Keycloak 的任何人:
Keycloak运行脚本/opt/jboss/tools/x509.sh生成基于提供的文件密钥库/etc/x509/https中描述https://hub.docker.com/r/jboss/keycloak -建立TLS(SSL)。
不幸的是,这个脚本没有考虑密码。但是在 Docker 构建时稍作修改,您可以自己修复它:在您的 Dockerfile 中添加:
RUN sed -i -e 's/-out "${KEYSTORES_STORAGE}\/${PKCS12_KEYSTORE_FILE}" \\/-out "${KEYSTORES_STORAGE}\/${PKCS12_KEYSTORE_FILE}" \\\n -passin pass:"${SERVER_KEYSTORE_PASSWORD}" \\/' /opt/jboss/tools/x509.sh
Run Code Online (Sandbox Code Playgroud)
此命令修改脚本并附加参数以传入密码
-passin pass:"${SERVER_KEYSTORE_PASSWORD}"
该参数的值是一个您可以自由设置的环境变量: SERVER_KEYSTORE_PASSWORD
使用 Keycloak 9.0.0 测试
| 归档时间: |
|
| 查看次数: |
2894 次 |
| 最近记录: |