株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

GitとCI/CDに関する知識ゼロのSEが、プライベートCAで発行した証明書を使ってGitLabにhttpsでアクセスするだけの話

2022/05/06 少しでも見やすく…と思い、ブログのスタイルを一部更新致しました。
2022/05/20 GitLabのデモ動画を作りました!このブログの末尾にリンクを張ったのでよろしければご視聴ください。 

皆様こんにちは。普段はセキュリティ商材を担当しているSEの小池と申します。

私の普段の業務はGitやCI/CDに無縁なのですが、会社から頂戴した「GitLabの技術ブログ書いておいて」というミッションを達成すべく、今回も頑張ってGitLabの技術をちまちま習得してまいります。
今回は、プライベートCAで使ってGitLabのSSL証明書を発行し、それを用いてhttpsでアクセスするというお話です。
どうしてもプライベートCAを使った証明書でGitLabにhttpsでアクセスしたいんだ!という方のご参考になれば幸いです。

このブログの内容は以下の通りです。

本記事の対象の方

  • プライベートCAで発行した証明書を使って、オンプレミスのGitLabにhttpsでアクセスしたい方。

今回のブログのゴール

このブログのゴールはただ1つ・・・!!

このブログのゴール
  • プライベートCAで発行した証明書を使って、オンプレミスのGitLabにhttpsでアクセスする。

このブログをお読みいただくにあたっての事前ご連絡事項

  • 本記事の内容はオンプレミス版のGitLabのみが対象となります。(GitLab社がDocker Hubに公開なさっているDocker Imageを用いて、任意のDockerホスト等でコンテナとして起動させたGitLabもこの記事の対象です。)
  • 本記事は中間CAがない環境を想定しています。
  • 本記事の手順は全て、任意のサーバーのローカルにインストールされたGitLabを想定したパスで記載しております。Docker Imageを用いて起動しているGitLabの場合は、docker exec -it コマンドを利用してコンテナにサインインした状態で実行する等、適宜手順を読みかえてください。
  • 本記事は GitLab Community Edition 14.7.3 における仕様をベースに記載しております。それ以外のエディションやバージョンではこの記事に記載の通りではない可能性がございます。

作業フロー

本記事の作業は以下のフローの作業番号に準じています。
ご自身の環境の状況を確認しつつ、必要な作業を実施してください。

各種作業

前述した作業フローの作業を記載します。
フローをご参照いただきつつ、必要な作業を実施してください。
また、GitLab Docsのこちらも併せてご参照ください。
NGINX settings | GitLab

A) 自己証明書でhttpsを実装済か

既存環境で自己証明書を使ってhttpsでアクセスしているか否かを確認してください。

実装済である場合は既にGitLabサーバーに秘密鍵があるということなので、この場合は続いて B) 既存の自己証明書を任意のディレクトリへ移動する をご参照ください。
実装済みでない場合はGitLabサーバーの秘密鍵を作成する必要があるので、この場合は続いて C) /etc/gitlab/ssl/ の有無確認 をご参照ください。

B) 既存の自己証明書を任意のディレクトリへ移動する

現在使用している自己証明書を任意の場所に移動してください。

自己証明書は通常 /etc/gitlab/ssl/ 配下に格納されています。
自己証明書を任意の場所に移動したら、続いて G) 証明書署名要求を作成 をご参照ください。

C) /etc/gitlab/ssl/ があるか

GitLabサーバーに /etc/gitlab/ssl/ ディレクトリがあるかを確認してください。

/etc/gitlab/ssl/ ディレクトリがある場合は、続いて D) /etc/gitlab/ssl/ 配下に秘密鍵があるか をご参照ください。
/etc/gitlab/ssl/ ディレクトリがない場合は、続いて E) /etc/gitlab/ssl/ を作成 をご参照ください。

D) /etc/gitlab/ssl/ 配下に秘密鍵があるか

GitLabサーバーの /etc/gitlab/ssl/ ディレクトリ配下に秘密鍵があるかを確認してください。

秘密鍵がある場合は、続いて G) 証明書署名要求を作成 をご参照ください。
秘密鍵がない場合は、続いて F) /etc/gitlab/ssl/ に秘密鍵作成 をご参照ください。

E) /etc/gitlab/ssl/ を作成

GitLabサーバーにて、以下のコマンドで /etc/gitlab/ssl/ ディレクトリを作成してください。

$ sudo mkdir -p /etc/gitlab/ssl/

作成したディレクトリのパーミッションを変更します。

$ sudo chmod 755 /etc/gitlab/ssl/

作成後は、続いて F) /etc/gitlab/ssl/ に秘密鍵作成 をご参照ください。

F) /etc/gitlab/ssl/ に秘密鍵作成

opensslコマンドで /etc/gitlab/ssl/ 配下に秘密鍵を作成します。
以下にコマンドサンプルを載せますのでご参考までに。

$ sudo openssl genrsa -out "/etc/gitlab/ssl/<GitLabサーバーにhttpsでアクセスする際に使うFQDN>.key" 2048

仮にGitLabサーバーにhttpsでアクセスする際に使うFQDNが gitlab.sample.com の場合は以下のようになります。

$ sudo openssl genrsa -out "/etc/gitlab/ssl/gitlab.sample.com.key" 2048

なお、キー作成時のオプションによってはパスフレーズを求められる場合があります。
(作成時にパスフレーズを求められなかった場合は、このコマンドは実行不要です。)
この場合は秘密鍵作成後に以下のコマンドを実行してパスフレーズを削除してください。

$ sudo openssl rsa -in <先ほど作成した秘密鍵> -out <先ほど作成した秘密鍵>

先ほど作成した秘密鍵が /etc/gitlab/ssl/gitlab.sample.com.key の場合は以下のようになります。
(作成時にパスフレーズを求められなかった場合は、このコマンドは実行不要です。)

$ sudo openssl rsa -in /etc/gitlab/ssl/gitlab.sample.com.key -out /etc/gitlab/ssl/gitlab.sample.com.key

秘密鍵のパーミッションを変更します。

$ sudo chmod 400 <先ほど作成した秘密鍵>

先ほど作成した秘密鍵が /etc/gitlab/ssl/gitlab.sample.com.key の場合は以下のようになります。

$ sudo chmod 400 /etc/gitlab/ssl/gitlab.sample.com.key

秘密鍵を作成したら、続いて G) 証明書署名要求を作成 をご参照ください。

G) 証明書署名要求を作成

opensslコマンドで証明書署名要求を作成します。
なお、作成時にSubjectAltName (以降SANと記載) を指定することをお勧めいたします。
以下にコマンドサンプルを載せますのでご参考までに。

$ sudo openssl req -new -key "<GitLabサーバーの秘密鍵>" -out "<出力する証明書署名要求のファイルパス>" -addext "subjectAltName = DNS:<もう一つのFQDN や *.<ドメイン>等を指定>,IP:xxx.xxx.xxx.xx"

仮にGitLabサーバーの秘密鍵が /etc/gitlab/ssl/gitlab.sample.com.key で、証明書署名要求を /var/gitlab.sample.com.csr に出力し、GitLabサーバーのドメインがexample.com、GitLabサーバーのIPが 192.168.1.100 の場合は以下のようになります。

$ sudo openssl req -new -key "/etc/gitlab/ssl/gitlab.sample.com.key" -out "/var/gitlab.sample.com.csr" -addext "subjectAltName = DNS:*.sample.com,IP:192.168.1.100"

続けて、通常の証明書署名要求と同様にDN情報を対話形式で入力してください。
以下は設定サンプルです。

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:<httpsでアクセスする際に使うFQDN>
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

-out で指定したパスに証明書署名要求ができていることを確認します。
続いて、H) プライベートCAで証明書を発行 をご参照ください。

H) プライベートCAで証明書を発行

先ほど作成した証明書署名要求をプライベートCAの任意の場所にコピーし、プライベートCA側でopensslコマンドを実行して証明書を作成します。
証明書作成時に証明書署名要求に追加したSANを反映させたいので、openssl.conf の [ CA_default ] セクションにある copy_extensions = copy のコメントアウトを外します。
([alt_names]セクションを参照させて直接 DNS.1 = xxxx.example.com と指定する方法もありますが、より変更箇所が少ないと理由で今回は copy_extensions = copy のコメントアウトを外す方法をご紹介いたします。)

行数は環境によって異なるため、参考程度にしていただければと存じます。

上記の通り openssl.conf を編集したら、証明書を発行します。
オプションは任意に指定してください。
以下にコマンドサンプルを載せますのでご参考までに。

$ sudo openssl ca -in <先ほど作成した証明書署名要求> -keyfile <CAの秘密鍵> -out <出力したい証明書のパス>

仮に証明書署名要求が /var/gitlab.sample.com.csr にあり、CAの秘密鍵が /etc/pki/CA/private/cakey.pem にあり、出力先のパスを /var/gitlab.example.com.crt とする場合は以下の通りとなります。

$ sudo openssl ca -in /var/gitlab.sample.com.csr -keyfile /etc/pki/CA/private/cakey.pem -out /var/gitlab.example.com.crt

作成する証明書の内容確認が表示されます。この中に X509v3 Subject Alternative Name という項目があり、証明書署名要求で指定したSANが含まれていることを確認します。

他の項目も確認し、問題がなければ y を入力します。

Sign the certificate? [y/n]:y

続けてコミットするか否かの確認が表示されるので、 y を入力して証明書を作成します。

1 out of 1 certificate requests certified, commit? [y/n]y

opensslコマンドで出力先に指定したファイルパスに証明書が作成されていることを確認してください。
続けて I) 証明書を /etc/gitlab/ssl/ に置く をご参照ください。

I) 証明書を /etc/gitlab/ssl/ に置く

プライベートCAで作成したGitLabサーバーの証明書をGitLabサーバーの /etc/gitlab/ssl/ 置きます。
この時証明書のファイル名は <GitLabサーバーにhttpsでアクセスする際に使うFQDN>.crt にします。

置いた後、パーミッションを 400 に変更しておきましょう。

$ sudo chmod 400 /etc/gitlab/ssl/<GitLabサーバーにhttpsでアクセスする際に使うFQDN>.crt

この時点で、/etc/gitlab/ssl/ 配下には以下の2ファイルがあることを確認してください。

  • GitLabサーバーのSSL証明書(permission400):<GitLabサーバーにhttpsでアクセスする際に使うFQDN>.crt
  • GitLabサーバーの秘密鍵(permission400):<GitLabサーバーにhttpsでアクセスする際に使うFQDN>.key

続けて、J) external_urlを変更・確認 をご参照ください。

J) external_urlを変更・確認

GitLabの構成ファイル /etc/gitlab/gitlab.rb にあるパラメーター external_url を、GitLabサーバーにhttpsでアクセスする際に使うFQDNに変更します。
なお、既にGitLabサーバーにhttpsでアクセスする際に使うFQDNを /etc/gitlab/gitlab.rbexternal_url に指定している場合は、本手順は実施不要です。続きの K) GitLabを再構成 をご参照ください。

編集前にバックアップの取得をお忘れなく。

$ sudo cp -p /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.<日付等の任意文字列>

エディタで /etc/gitlab/gitlab.rb を開きます。
32行目あたりに external_url を指定している行があります。ここのURLを https://<httpsアクセス時に使うFQDN等> に変更します。

なお、httpでhttpsにリダイレクトしたい 等の設定も可能です。
こちらのGitLab Docsを参考になさりながら、必要に応じて設定してください。
NGINX settings | GitLab

変更後、/etc/gitlab/gitlab.rb を保存します。

また、もしGitLabをコンテナとして起動している場合は、以下のように /etc/gitlab/gitlab.rb を直接変更する以外で変更すべき箇所がないかご確認ください。

  • コンテナ起動時のコマンドオプションで直接 external_url を指定していないか。
  • docker-compose.yml を使っている場合は、その中の環境変数で直接 external_url を指定していないか。

続けて、K) GitLabを再構成 をご参照ください。

K) GitLabを再構成

前の手順で実施した /etc/gitlab/gitlab.rb の設定変更を反映するために、GitLabを再構成します。
以下のコマンドを実行します。

$ sudo gitlab-ctl reconfigure

最終的に gitlab Reconfigured! と表示されたことを確認してください。

続けて、L) ルート証明書インストール済のPCからhttpsでアクセス確認 をご参照ください。

L) ルート証明書インストール済のPCからhttpsでアクセス確認

httpsでGitLabにアクセスできることを確認します。
またその際、できればルート証明書をインストール済のPCから接続を試行してください。
接続時にブラウザのからの警告メッセージが表示されないことや、URLの冒頭に安全でない接続を示唆するメッセージが表示されていないことを確認してください。

最後に

この度はGitもCI/CDもよくわかっていないど素人SEによるGitLab検証ブログをお読みいただき、誠にありがとうございます。
このブログの目標は以下のとおりでしたが、皆さまはいかがでしたでしょうか。

このブログのゴール
  • プライベートCAで発行した証明書を使って、オンプレミスのGitLabにhttpsでアクセスする。

この記事が「なんかよくわからんけどGitLabをとりあえず触りたい!」という方のお力になれば幸甚にございます。


GitLabに関するお問い合わせは、以下のフォームからお願い致します。
GitLab製品 お問い合わせ

2022/05/20追記
GitLab操作デモ動画 (基本編) を作っちゃいました。
つたない内容ではありますが、ご興味がおありでしたら是非ご視聴いただければと存じます。

www.youtube.com