我曾遇到使用jboss/keycloak Docker镜像和letsencrypt免费证书时出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH
错误的问题。即使考虑了其他评论中给出的建议,问题仍未得到解决。现在,我有一个可用且易于设置的环境,这可能也能帮到你。
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
文件夹与数据库容器映射,使其数据持久化。
将证书文件放到正确的路径下
当我第一次使用原始的 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"
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
我们可以在容器内仔细检查已安装的证书。
$ sudo docker exec -it keycloak_app /bin/bash
$ 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访问。
ports: - 8443:8443
但不挂载/etc/x509/https
卷对我起作用了。Keycloak创建了自己的证书... - Doctor