Docker Compose上のKeycloakをTLS/HTTPS化する(自己署名で)

2023/07/15に公開

1.はじめに

https://zenn.dev/motu2119/articles/a70b611329d133

上記で利用したlocalhost上のKeycloakを、自己署名証明書を使ってTLS/HTTPSでアクセスできるようにします。

2.自己署名証明書の作成

docker-compose.ymlが存在するディレクトリにて、certsディレクトリを作成します。certsディレクトリ内で、以下のopensslコマンドを実行します。

openssl req -x509 -out localhost.crt -keyout localhost.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=localhost' -extensions EXT -config <( \
   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

上記コマンドは、Let's Encryptのページ(以下)に記載されているものを利用しました。

https://letsencrypt.org/docs/certificates-for-localhost/#making-and-trusting-your-own-certificates

これで、certsディレクトリ内に自己署名証明書localhost.crtとそれに対応する秘密鍵localhost.keyが生成されます。

3.docker-compose.yml

docker-compose.ymlは以下のとおりです。

version: '3'
services:
  keycloak:
    image: quay.io/keycloak/keycloak:21.1.1
    container_name: keycloak
    tty: true
    stdin_open: true
    ports:
      - "8080:8080"
      - "8443:8443"
    volumes:
      - ./data/keycloak:/opt/keycloak/data
      - ./certs/localhost.crt:/etc/x509/https/tls.crt
      - ./certs/localhost.key:/etc/x509/https/tls.key
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_HTTPS_CERTIFICATE_FILE: /etc/x509/https/tls.crt
      KC_HTTPS_CERTIFICATE_KEY_FILE: /etc/x509/https/tls.key
    command:
      - start-dev --http-relative-path /auth

volumesでは、生成した自己署名証明書と秘密鍵を指定しています。
その上で、environmentにKC_HTTPS_CERTIFICATE_FILEKC_HTTPS_CERTIFICATE_KEY_FILEを指定しています。

KC_HTTPS_CERTIFICATE_FILEKC_HTTPS_CERTIFICATE_KEY_FILEについては、以下に記載があります。

https://www.keycloak.org/server/all-config?options-filter=config#category-http

4.コンソールへTLS/HTTPSでアクセスしてみる

https://localhost:8443/auth/

上記へアクセスしてみます。

ですよね。自己署名ですからね。
「詳細設定」を表示して、「localhostにアクセスする(安全ではありません)」を選択します。

アクセスできました。

5.おわりに

localhost上のKeycloakをTLS/HTTPS化できました。(自己署名ですけど)

なんでこんなことをしているかというと、FirebaseでSAMLをやりたいなー、と思ったからです。
しかもFlutterで。(できるのかな...? もちろんWeb Onlyだと思うので、Flutter Webでね。)

FirebaseのAuthenticationでSAMLを有効化してSSOのURLを指定しようとすると、httpsを求められるのですよね...だからです。

これを使って、今度試してみます。
自己署名じゃダメって言われたらどうしよう・・・

Discussion