対象環境
GitLab Community Edition 9.0.4
certbot 0.13.0(Let's EncryptのCLIクライアント)
原理
Let's Encryptの「webroot」モードを利用する。
webrootモードはサーバに .well-known
ディレクトリが置かれていることを認証基準としてSSL証明書を発行する。
GitLabのログインを回避して .well-known
をLet's Encryptに発見させ、SSL証明書を発行するのが本記事の目的である。
手順
※ GitLabはインストールが完了しており、既に稼働しているものとする。
1. GitLabが利用しているNginxの設定を変更する
GitLabのログインを回避して .well-known
の存在を確認させるためにNginxのリダイレクト設定を変更する。
まずは設定ファイルを新規作成。
$ sudo vim /etc/gitlab/custom_gitlab_server_config.conf
location ^~ /.well-known {
alias /var/letsencrypt/.well-known;
}
その後、設定ファイルを適用。
$ sudo vim /etc/gitlab/gitlab.rb
nginx['custom_gitlab_server_config'] = "include /etc/gitlab/custom_gitlab_server_config.conf;"
最後に、Let's Encryptに発見させる用のディレクトリを作成しておく。
.well-known
は作成しなくてよい。
$ sudo mkdir /var/letsencrypt
2. GitLabに設定を適用して再起動
$ sudo mkdir /var/letsencrypt
3. Let's Encryptをインストール
絶対に最後の --debug
を忘れないように。
Amazon Linux限定の手法なので他のOSの場合は不要。
$ sudo mkdir /usr/local/letsencrypt
$ sudo chown `whoami` /usr/local/letsencrypt
$ cd /usr/local/letsencrypt
$ git clone https://github.com/letsencrypt/letsencrypt .
$ sudo ./letsencrypt-auto --debug
4. SSL証明書を取得
[gitlab.example.com]
の部分はGitLabに適用しているドメインを指定する。
$ sudo ./letsencrypt-auto certonly --webroot --webroot-path /var/letsencrypt -d [gitlab.example.com]
エラーが出た場合
エラーの場合はこんな表示が出る。
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: gitlab.example.com
Type: unauthorized
Detail: Invalid response from
Typeが unauthorized の場合
- ログインが回避できていないので、1の手順が正しく完了しているか確認する
Typeが unconnected の場合
- AWSのセキュリティグループを確認し、80番と443番のポートを開ける
- 勢い余って
/etc/gitlab/gitlab.rb
のexternal_url
をhttpsにしていないか確認する(証明書取得まで禁止!)
5. SSL証明書が自動更新されるよう設定
$ sudo crontab -u root -e
00 05 01 * * /path/to/letsencrypt/letsencrypt-auto renew --force-renew && gitlab-ctl restart
5. SSL証明書をGitLabに適用
external_url
をHTTPSに変更する。
[gitlab.example.com]
の部分はGitLabに適用しているドメインを指定する。
redirect_http_to_https
をtrueにしておくと、HTTPでアクセスされてもHTTPSにリダイレクトされる。
証明書の再発行の際はHTTPによる .well-known
の確認が走らないので、HTTP接続を潰してしまってよい。
同じくAWSのセキュリティグループレベルでも80番ポートを潰してしまってよい。
$ sudo vim /etc/gitlab/gitlab.rb
nginx['external_url'] = "https://[gitlab.example.com]"
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/letsencrypt/live/[gitlab.example.com]/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/[gitlab.example.com]/privkey.pem"
6. GitLabを再起動
$ sudo gitlab-ctl reconfigure
参考文献
GitLab Omnibus package の SSL 証明書を Let's Encrypt で取得する
http://qiita.com/yuuAn/items/09a434d3f6cffa31101e
アクセス制限のかかったGitLabをLet's Encryptをつかってhttps化する
https://gist.github.com/mamemomonga/a36a194f8a80ce5fa49bf950e092c604