Docker+ActiveDirectory+nginx(certbot)でKeycloakを使いたい！

Windows Server上に構築したActiveDirectoryの認証情報を使って、OIDCなどを使用したかったのですが、その際Keycloakの構築に結構手間取ったので備忘録として

**後から再構築するのを楽にするために、Docker環境を使用しています**

# サーバーの準備
ConoHaを使います。（学割があるのがいいですよね）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/5e10b33c-f588-5c2c-0119-dfae4221df42.png)

普通に、Docker環境が使えるイメージがあるので、そのまま使います（その場からDocker環境が使えるのいいですよね）

# 証明書の書き出し
Keycloakは、[公式のDockerイメージ](https://hub.docker.com/r/jboss/keycloak/)が提供されています（サクッと構築できるの以下略
ActiveDirectoryは、オンプレで構築していて、**イマドキ暗号化されていないとかあり得ない時代なので**、接続はLDAPSを使用します（LDAP over SSLです、困ってググってもLDAPSではなくLDAPが引っかかったりするので注意しましょう）

AD側は、証明機関の機能をインストールして、CA証明書を発行してください（その時点で、ADもLDAPS接続が利用可能になるはずです）

本当であれば、ADに使用する証明書も、ちゃんとしたCAから発行されているものが望ましいのですが、個人レベルなので、オレオレ証明書もとい自己署名証明書を使用します

Keycloakで正しくSSL接続できるよう、ルート証明書を書き出して、トラストします

ツール→証明機関→発行した証明書から、一番要求IDが若く、証明書テンプレートが「クロス証明機関（CrossCA）」になっているものをダブルクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/07ec7fbf-58c2-0232-3865-e4200864e301.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/c285cbe2-e4d0-9dd4-8e9a-faee1b763097.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/08b8de02-1fa0-36da-63c3-3def85ab3dd9.png)

Base64 encoded X.509でエクスポートします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/427d0844-26b6-1252-758a-ab9aba620739.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/000fa461-5c15-ef7d-cdb5-f9d9d7e9d194.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92661/f0f32443-9429-2f21-0a99-8383a1a590df.png)

Dockerfileを書きます
（4行目でADDしているファイルがADを構築しているWindows Serverで書き出したルート証明書です）

```Dockerfile:Dockerfile
FROM jboss/keycloak

WORKDIR /opt/jboss/keycloak/standalone
ADD cert.pem /usr/share/pki/ca-trust-source/anchors/cert.pem
USER root
RUN keytool -import -noprompt -alias selfsigned -cacerts -file /usr/share/pki/ca-trust-source/anchors/cert.pem  -storepass changeit
```

JDKがデフォルトで使用している（ので合ってましたっけ、オプションなしのものは）keystoreにインストールしてあげれば大丈夫です
ストアのパスワードは `changeit` です（変えたほうがいいんでしょうかね）

デプロイします
そういえば、GitLabに実はContainer Registryの機能があったんですね・・・初めて知りました・・・

# nginxの設定
Certbot（Let's Encrypt）を使いたい~~のと、個人的に圧倒的信頼がある~~のでnginxでリバースプロキシを行い、nginxより外はHTTPS、nginxより内側はHTTPな環境を準備します

この際、注意する点としては、実際にはHTTPSでも、Keycloakから見たらHTTPであるというところです
そのため、リソースがHTTPで埋め込まれ、Chromeなどに怒られるため、対策の設定も加えます

```nginx:proxy.conf
server{
    listen 80;
    server_name YOUR_DOMAIN_NAME;

    location / {
            # プロキシ先のサーバアドレスとポート番号を指定
            return 301 https://$host$request_uri;
    }
}


# HTTPSの設定
server{
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name    YOUR_DOMAIN_NAME;

    # SSL認証キーの参照先。certbotで自動的に生成されるファイルを指定する。
    ssl_certificate     /etc/letsencrypt/live/YOUR_DOMAIN_NAME/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN_NAME/privkey.pem;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    add_header Access-Control-Allow-Origin *;
    
    location / {
        # プロキシ先のサーバアドレスとポート番号を指定
        proxy_pass http://localhost:8080;
    }
}
```