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に固有の問題というよりも、証明書作成の問題である可能性がありますが、これを機能させる方法がわかりません。どんな助けでも大歓迎です
いくつかの調査の後、次の方法が機能しました(自己署名証明書の場合、製品用の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>",
jboss/keycloak Docker image および letsencryptからの無料証明書 を使用して、ERR_SSL_VERSION_OR_CIPHER_MISMATCH
エラーが発生するという問題にも直面しました。他のコメントからのアドバイスを検討した後でも。今、私はあなたを助けるかもしれない実用的な(そして非常に簡単な)セットアップを持っています。
最初に、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"
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ホストのホストネットワークを使用する必要がありました。これはベストプラクティスではなく、ケースに必要なものではありません。構成パラメーターに関する情報は、ドキュメントの 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 で利用できるようになりました。