Solución:
También enfrenté el problema de obtener una ERR_SSL_VERSION_OR_CIPHER_MISMATCH
error, usando la imagen de Docker jboss / keycloak y certificados gratuitos de letsencrypt. Incluso después de considerar los consejos de los otros comentarios. Ahora, tengo una configuración que funciona (y bastante fácil), que también podría ayudarlo.
1) Generar certificado letsencrypt
Al principio, generé mi certificado letsencrypt para el dominio sub.example.com
utilizando el certbot. Puede encontrar instrucciones detalladas y formas alternativas de obtener un certificado en https://certbot.eff.org/ y la guía del usuario en 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) Preparar el entorno docker-compose
yo suelo docker-compose
para ejecutar keycloak a través de la ventana acoplable. Los archivos de configuración y datos se almacenan en la ruta /srv/docker/keycloak/
.
- Carpeta
config
contiene ladocker-compose.yml
- Carpeta
data/certs
contiene los certificados que generé a través de letsencrypt - Carpeta
data/keycloack_db
se asigna al contenedor de la base de datos para que sus datos sean persistentes.
Coloque los archivos del certificado en la ruta correcta
Cuando tuve problemas por primera vez al usar los certificados originales de letscrypt para keycloak, probé la solución alternativa de convertir los certificados a otro formato, como se menciona en los comentarios de las respuestas anteriores, que también fallaron. Finalmente, me di cuenta de que mi problema se debía a los permisos establecidos en los archivos de certificado asignados.
Entonces, lo que funcionó para mí es simplemente copiar y cambiar el nombre de los archivos proporcionados por letsencrypty móntelos en el contenedor.
$ 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
En mi caso, necesitaba usar la red de host de mi host de la ventana acoplable. Esta no es la mejor práctica y no debería ser necesaria para su caso. Encuentre información sobre los parámetros de configuración en la documentación en 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
Configuración final del directorio
Así es como se ve la configuración final de mi archivo y carpeta.
$ cd /srv/docker/keycloak/
$ tree
.
├── config
│ └── docker-compose.yml
└── data
├── certs
│ ├── tls.crt
│ └── tls.key
└── keycloak_db
Iniciar contenedor
Finalmente, pude iniciar mi software usando docker-compose
.
$ cd /srv/docker/keycloak/config/
$ sudo docker-compose up -d
Podemos ver los certificados montados dentro del contenedor.
$ cd /srv/docker/keycloak/config/
$ sudo docker-compose up -d
Podemos verificar los certificados montados dentro del contenedor.
## 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
Considerando la configuración de docker-compose.yml, keycloak ahora está disponible en https://sub.example.com:8443
Después de investigar un poco, el siguiente método funcionó (para los certificados autofirmados, todavía tengo que averiguar cómo hacerlo con letsencrypt CA para prod)
generar un certificado autofirmado usando la herramienta de claves
keytool -genkey -alias localhost -keyalg RSA -keystore keycloak.jks -validity 10950
convertir .jks a .p12
keytool -importkeystore -srckeystore keycloak.jks -destkeystore keycloak.p12 -deststoretype PKCS12
generar .crt desde el almacén de claves .p12
openssl pkcs12 -in keycloak.p12 -nokeys -out tls.crt
generar .key desde el almacén de claves .p12
openssl pkcs12 -in keycloak.p12 -nocerts -nodes -out tls.key
Luego use tls.crt y tls.key para el montaje de volumen / etc / x509 / https
Además, en la aplicación de seguridad, en el archivo keycloak.json, especifique las siguientes propiedades
"truststore" : "path/to/keycloak.jks",
"truststore-password" : "<jks-pwd>",
Para cualquiera que intente ejecutar Keycloak con un archivo de clave privada protegida con frase de contraseña:
Keycloak ejecuta el script /opt/jboss/tools/x509.sh
para generar el almacén de claves basado en los archivos proporcionados en /etc/x509/https
como se describe en https://hub.docker.com/r/jboss/keycloak – Configuración de TLS (SSL).
Desafortunadamente, este script no tiene en cuenta la contraseña. Pero con una pequeña modificación en el momento de la compilación de Docker, puede solucionarlo usted mismo: dentro de su Dockerfile, agregue:
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
Este comando modifica el script y agrega el parámetro para pasar la frase de contraseña
-passin pass:"${SERVER_KEYSTORE_PASSWORD}"
El valor del parámetro es una variable de entorno que puede configurar libremente: SERVER_KEYSTORE_PASSWORD
Probado con Keycloak 9.0.0