web-dev-qa-db-ja.com

Dockerイメージを使用したKeycloakSSLセットアップ

Dockerイメージ( https://hub.docker.com/r/jboss/keycloak/ バージョン4.5.0-最終版)を使用してkeycloakをデプロイしようとしていますが、SSLの設定で問題が発生しています。

ドキュメントによると

Keycloakイメージを使用すると、HTTPSを提供するための秘密鍵と証明書の両方を指定できます。その場合、2つのファイルを提供する必要があります。

tls.crt-証明書tls.key-秘密鍵これらのファイルは/ etc/x509/httpsディレクトリにマウントする必要があります。イメージはそれらを自動的にJavaキーストアに変換し、Wildflyを再構成して使用します。

所定の手順に従い、必要なファイル(tls.crtおよびtls.key)を含むフォルダーでボリュームマウント設定を提供しましたが、SSLハンドシェイクで問題が発生し、

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

エラー、アクセスしようとしたときにブラウザでキークロークの読み込みをブロックしています。

私はletsencryptを使用してpemファイルを生成し、opensslを使用して.crtファイルと.keyファイルを作成しました。また、opensslを使用してこれらのファイルを作成し、問題を絞り込んでみましたが、動作は同じです(これが問題になる場合は追加情報)

デフォルトでは、ポートバインディングのみを指定すると、証明書ボリュームマウントを指定せずに-p 8443:844/ etc/x509/httpsキークロークサーバーが自己署名証明書を生成しますブラウザでアプリを表示しても問題は発生しません

これは、keycloakに固有の問題というよりも、証明書作成の問題である可能性がありますが、これを機能させる方法がわかりません。どんな助けでも大歓迎です

6
Vsoma

いくつかの調査の後、次の方法が機能しました(自己署名証明書の場合、製品用のletsencrypt CAの使用方法を理解する必要があります)

keytoolを使用して自己署名証明書を生成します

keytool -genkey -alias localhost -keyalg RSA -keystore keycloak.jks -validity 10950

.jksを.p12に変換します

keytool -importkeystore -srckeystore keycloak.jks -destkeystore keycloak.p12 -deststoretype PKCS12

.p12キーストアから.crtを生成します

openssl pkcs12 -in keycloak.p12 -nokeys -out tls.crt

.p12キーストアから.keyを生成します

openssl pkcs12 -in keycloak.p12 -nocerts -nodes -out tls.key

次に、ボリュームマウントにtls.crtとtls.keyを使用します/ etc/x509/https

また、セキュリティで保護するアプリのkeycloak.jsonファイルで次のプロパティを指定します

"truststore" : "path/to/keycloak.jks",
"truststore-password" : "<jks-pwd>",
5
Vsoma

jboss/keycloak Docker image および 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"   # 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:844 で利用できるようになりました。

0
Kiwi