Saltar al contenido

Configuración de Keycloak SSL usando la imagen de la ventana acoplable

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 la docker-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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *