GitLab に HTTPS でアクセスできるようにする

Software Configuration Management (SCM)

GitLab の設定を調整すると、Web インターフェイスや Git リポジトリへ SSL を使ってアクセスできるようになります。

ここではその設定方法と、併せて SSL 接続に必要な電子証明書を証明機関に取得申請するための申請ファイルの作成方法についても軽く触れます。


先日に ConoHa VPS 上で稼働している Fedora 20 にGitLab をインストールしてみました。

GitLab は、標準ではHTTP を使ってアクセスするようにセットアップされますが、これをSSL を使ったHTTPS でアクセスできるようにしてみました。

Fedora 20 に GitLab をインストールしたときのお話はこちら に記してあります。

電子証明書を用意する

GitLab に SSL で接続するには、このサーバーに秘密鍵 を作成して、証明書発行機関から取得した電子証明書 を用意する必要があります。

秘密鍵と電子証明書を保存する場所を用意する

まずはGitLab が使用する証明書を保存する場所を用意します。

sudo mkdir -p /etc/gitlab/ssl
sudo chmod 700 /etc/gitlab/ssl

この/etc/gitlab/ssl/ というディレクトリが、GitLab が秘密鍵や電子証明書を読み込む標準の場所になります。

秘密鍵を作成する

保存するディレクトリを作成したら、そこに秘密鍵を作成します。

秘密鍵の名前は、GitLab のexternal_url で指定するドメイン名に ".key" という拡張子を付けた名前になります。ドメイン名は "xxx.xx.jp" のようになりますが、以下では便宜上、このドメイン名を FQDN と記載します。


秘密鍵は次のコマンドを実行すると作成できます。

sudo openssl genrsa -des3 -out /etc/gitlab/ssl/FQDN.key 2048

すると、次のようなメッセージが画面に表示されます。

Generating RSA private key, 2048 bit long modulus
.............................+++
......................................+++
e is 65537 (0x10001)
Enter pass phrase for /etc/gitlab/ssl/FQDN.key:

ここでパスフレーズ(パスワード)の入力を求められます。

パスフレーズは設定しないでおきたいのですが、必須なようなので、ここで何か秘密鍵に設定するパスワードを指定して、いったん秘密鍵の作成を完了しておきます。


秘密鍵を作成できたら、次のコマンドを実行して、秘密鍵からパスワードを取り除きます。

openssl rsa -in /etc/gitlab/ssl/FQDN.key -out /etc/gitlab/ssl/FQDN.key

このときパスフレーズの入力を促されるので、先ほどの作成のときに指定したパスフレーズを入力すると、パスワードを取り除いた秘密鍵に置き換わります。

秘密鍵からパスフレーズを抜いておかないと、GitLab を起動させても Web サービスが動作していなかったり、Nginx 起動時にtimeout: down: nginx: 1s, normally up, want up というメッセージが表示され、起動できない様子でした。

証明書要求ファイル (CSR) を作成する

秘密鍵ができたら、それを元に証明書要求ファイルを作成します。

このファイルは、電子証明書の発行に必要なテキストが記載されているファイルで、これを電子証明書を発行する証明機関に送付することで、元にした秘密鍵で利用できる電子証明書を取得することができます。


証明書要求ファイルは、次のコマンドを実行することで作成できます。

sudo openssl req -new -key /etc/gitlab/ssl/FQDN.key -out /etc/gitlab/ssl/FQDN.csr

これで、証明書要求ファイルが/etc/gitlab/ssl/FQDN.csr に出来上がります。

このファイルは、次のようなテキストファイルになっています。

-----BEGIN CERTIFICATE REQUEST-----
gMAj08304TS23V3AQjF3u7QrXBZax4nhCCt67HjD0IKkuGCj3MVcn9SwD2mfa6j7
mEtu7+a4KuekrAGSwvNjGkZEIbBXVMGl3VystQIorUrw8M7AZ6ZaU3wlQnFtpX/y
7Bhf1eyh+QIDAQABoAAwDQYJKoZIhvcNAQEFBQADggEBAJ9ojrVRTAq32Ox84yd2
+XBBKGZDc+2O92JuU0hj38pReI+ej8qVaTOVcD8Iq0wGj3nmCkAiKo0TzYMqPXqZ
Pgc=
-----END CERTIFICATE REQUEST-----

この-----BEGIN CERTIFICATE REQUEST----- から-----END CERTIFICATE REQUEST----- までを、この "-----" が含まれる部分も含めて送付することで、電子証明書を発行してもらうことができます。

電子証明書の発行機関について

電子証明書の発行機関には、たとえば次のようなものがありました。

電子証明書は何かとお高いですが、安い電子証明書といえばRapidSSL でしょうか。この電子証明書は以前に利用したことがあり、そのときのお話は格安の SSL 電子証明書を Rapid-SSL で取得してみる に記してあります。

自分だけで GitLab を使うのであれば、自前の証明書発行機関で電子証明書を発行する方法もあります。その場合は、自分で発行した電子証明書に第三者認証はありませんが、無料で電子証明書を発行することもできます。

発行された電子証明書をサーバーに保存する

証明機関から電子証明書が発行されたら、その証明書を/etc/gitlab/ssl/FQDN.crt という名前で保存します。

上記の FQDN のところは、GitLab のexternal_url で指定するドメイン名です。

取得した電子証明書ファイルを scp などの方法でサーバーに保存します。

電子証明書はテキスト形式になるはずなので、ファイルのコピー以外にも、上記の名前でテキストファイルを作成して、そこに取得した電子証明書ファイルの中身をコピーして貼り付けるでも大丈夫です。

電子証明書を Windows Server の証明機関で発行した場合は、証明書を Base64 形式で取得するようにします。DER エンコード形式で取得すると Nginx が起動しなかったり、起動しても、ブラウザで接続しようとするとSSL received a record that exceeded the maximum permissible length というエラーメッセージが表示されることがあるようでした。

GitLab を設定する

設定ファイルを編集する

秘密鍵と電子証明書を用意できたら、GitLab の設定ファイルを調整します。

設定の調整はとても簡単で、設定ファイル/etc/gitlab/gitlab.rb の最初の方にあるexternal_url を "http://" から "https://" に変更するだけです。

external_url 'https://FQDN'

注意点としては、URL に指定するホスト名と、先ほど用意した秘密鍵と電子証明書のファイル名とが一致する必要があるところです。

名前が一致しなくても、使用するファイルをこの設定ファイル内で明記すれば問題ないはずですが、同じ名前にしておけば自動設定されるので、名前を合わせておくのが簡単です。

設定を有効化する

設定ファイルの編集が終わったら、次のようにして新しい設定内容を GitLab に反映させます。

sudo gitlab-ctl reconfigure

これで設定が有効化され、Web サービスが https で待ち受けるようになります。

Web サービスが上手く起動しない場合は、秘密鍵にパスフレーズが設定されていたり、秘密鍵や電子証明書のファイル名がexternal_url で設定したホスト名と違っている可能性があります。

電子証明書まわりの設定に失敗している場合、設定を再調整したり電子証明書を差し替えたりすることになりますが、このときgitlab-ctl reconfigure を実行するだけでは上手く反映されない場合があるようでした。正しく修正したはずなのに動かない場合は、サービスをいったんgitlab-ctl stop で止めて、gitlab-ctl start で起動し直してみると上手く行くかもしれません。

ファイアーウォールを調整する

GitLab 自体は HTTPS で待ち受けるようになりましたが、今回 GitLab をインストールした Fedora 20 は、標準では HTTPS への通信が遮断されるようになっています。

そこで最後に、次のようにfirewalld の設定を調整して HTTPS での通信ができるようにします。

sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld

これで HTTPS を使って GitLab の Web インターフェイスを利用できるようになりました。Git リポジトリも HTTPS を使って操作できるようになっています。