タイトルの通りにnginxでリバースプロキシを組んでKeycolakにhttpsでアクセスできるようにしてみました。

環境


  • nginx 1.12.2
  • Keycloak 3.4.3 Final

証明書はいつも通りにLet’s Encryptで取得しました。

構成


下記のようにします。図をつけたかったのですが、パワポが使える環境がないので箇条書きで説明します。

  • KeycloakはStandaloneモードで動かします
  • nginxとKeycloakは同一サーバで動かします
  • Keycloakのポートはファイアウォールなどでサーバ内からしかアクセスできないようにします
  • 証明書はnginxに設定します
  • クライアントからnginxまではhttpsで通信します
  • nginxからKeycloakへはhttpで通信します

どうでもいいですが、私はこういうリバースプロキシを組んでnginxまではhttpsで通信してそこから先はhttpというのをよくやります。

Keycloakの設定


Keycloakのstandalone.xmlhttp-listner要素にproxy-address-forwarding="true"を追記します。追記後は下記のようになります。

1
<http-listener name="default" socket-binding="http" proxy-address-forwarding="true" redirect-socket="https" enable-http2="true"/>

これは次の記事を参考にさせて頂きました。ありがとうございます。

Keycloakを冗長構成で動かしてみる

Keycloakの設定はこれで終わりです。

nginxの設定


Keycloakは8080で動かしているものとして、下記のように設定します。

  • server_nameにドメインを指定します
  • ssl_certificateにサーバ証明書をssl_certificate_keyに秘密鍵を指定します
  • 80にアクセスが来た場合は443にリダイレクトさせる

暗号化スイートの部分は要件に合わせて設定してください。ちょっと説明できるだけの知識がないので…。で、これらを設定したのが下記な感じになります。すべての設定を書くと長くなってしまうので必要な部分だけ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
upstream keycloak {
server localhost:8080;
}

server {
listen 80;
server_name ${yourdomain};
return 301 https://$host$request_uri;
}

server {
listen 443;
server_name ${yourdomain};
ssl on;
ssl_certificate ${ssl.pem};
ssl_certificate_key ${ssl.key};
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
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;

location / {
proxy_pass http://keycloak;
proxy_redirect http:// https://;
}
}

後は、これでnginxを再起動して、設定したドメインでhttpsで通信できれば完了です。できない場合はnginxとKeycloakのログを確認して調査します。