GitLab に Let's Encrypt で SSL を設定

# はじめに
前回、[AmazonLinux2023 に GitLab をインストール
](https://qiita.com/kooohei/items/c7431d6546cdbf41a58f)で GitLab のインストールを行いました。
今回はその続きで、SSLの導入を行いたいと思います。

# 事前作業
初期状態をいつでも確認できるようにバックアップを取っておきましょう。
```bash:バックアップ
$ sudo cp -pi /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb_org
```

# Let's Encrypt の導入
導入自体は簡単に行えます。
先ほどバックアップを取った `/etc/gitlab/gitlab.rb` に記載されている、 `external_url` を `https://` にするだけです。
ただし、注意が必要なのが [AmazonLinux2023 に GitLab をインストール](https://qiita.com/kooohei/items/c7431d6546cdbf41a58f) では、AWS発行のパブリックDNSを利用していますが、このドメインだとSSLの発行はできません。

実際に試してみたところ以下のようなエラーが出力されました。

```bash:パブリックDNSでSSL設定しようとした際のエラー
There was an error running gitlab-ctl reconfigure:

letsencrypt_certificate[ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com] (letsencrypt::http_authorization line 6) had an error: Acme::Client::Error::RejectedIdentifier: acme_certificate[staging] (letsencrypt::http_authorization line 43) had an error: Acme::Client::Error::RejectedIdentifier: Error creating new order :: Cannot issue for "ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com": The ACME server refuses to issue a certificate for this domain name, because it is forbidden by policy
```

Let's Encrypt のポリシーとして、すぐに変更される可能性があるドメインは禁じられているそうです。
>By policy, Let’s Encrypt does not allow people to get certificates for generic EC2 hostnames. Mostly because they can change hands far more quickly than certificates expire.
>
>You need to use your own domain name of some sort.
>
>(You can certainly use AWS, EC2, and EC2 IP addresses. You just can’t use the EC2 hostname.)
>
>  ー URL:https://community.letsencrypt.org/t/urnparamserror-rejectedidentifier/110334/2

ということで、独自ドメインを使って行いたいと思います。
今回は `sample.hengjiu.jp` というドメインを利用して設定していきたいと思います。

```bash:差分
$ sudo diff -y --suppress-common-lines /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb_org 
external_url 'https://sample.hengjiu.jp'              | external_url 'http://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.
```
修正したら、 `gitlab-ctl reconfigure` します。
```bash:reconfigure
$ sudo gitlab-ctl reconfigure
[2023-09-27T01:49:56+00:00] INFO: Started Cinc Zero at chefzero://localhost:1 with repository at /opt/gitlab/embedded (One version per cookbook)
Cinc Client, version 17.10.0
Patents: https://www.chef.io/patents
Infra Phase starting
~~~
Running handlers:
[2023-09-27T01:52:15+00:00] INFO: Running report handlers
Running handlers complete
[2023-09-27T01:52:15+00:00] INFO: Report handlers complete
Infra Phase complete, 38/951 resources updated in 02 minutes 19 seconds
gitlab Reconfigured!
```
無事に更新ができました。


# 確認
URLの部分に鍵マークが表示されていれば完了です。
![スクリーンショット 2023-09-27 11.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/74b0a118-da1e-e515-2606-2a1b4bbe5535.png)

# 自動更新設定
次は自動更新です。
Let' Encrypt なので有効期限が90日になるため、定期的にチェックして期限が切れる前に更新する必要があります。
ですが、実はデフォルトの設定で `4日目の午前0時以降に更新がスケジュール` されているというのがドキュメントに記載ありました。

https://docs.gitlab.com/16.4/omnibus/settings/ssl/

そのため、今回は自動更新タイミングの変更を行います。
以下が変更前と変更後の内容です。
>変更前：4日目の午前0時
>変更後：7日目の午後9時30分

ということで以下が修正後の差分です。

```bash：差分
$ sudo diff -y --suppress-common-lines /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb_org 
external_url 'https://sample.hengjiu.jp'              | external_url 'http://ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.
 letsencrypt['auto_renew'] = true                 | # letsencrypt['auto_renew'] = true
 letsencrypt['auto_renew_hour'] = 21                  | # letsencrypt['auto_renew_hour'] = 0
 letsencrypt['auto_renew_minute'] = 30 # Should be a number o | # letsencrypt['auto_renew_minute'] = nil # Should be a number
 letsencrypt['auto_renew_day_of_month'] = "*/7"           | # letsencrypt['auto_renew_day_of_month'] = "*/4"
```

それでは修正したら、改めて `gitlab-ctl reconfigure` します。
```bash:reconfigure
$ sudo gitlab-ctl reconfigure
[2023-09-27T06:21:32+00:00] INFO: Started Cinc Zero at chefzero://localhost:1 with repository at /opt/gitlab/embedded (One version per cookbook)
Cinc Client, version 17.10.0
Patents: https://www.chef.io/patents
Infra Phase starting
~~~
Running handlers:
[2023-09-27T06:23:38+00:00] INFO: Running report handlers
Running handlers complete
[2023-09-27T06:23:38+00:00] INFO: Report handlers complete
Infra Phase complete, 8/924 resources updated in 02 minutes 06 seconds
gitlab Reconfigured!
```

以上で完了です。


# おわりに
今回も `/etc/gitlab/gitlab.rb` で設定できる簡単な内容でしたが、
- EC2にデフォルトで発行されるパブリックDNSは使えない。
- SSLは　`external_url` で `https` にすると `Let's Encrypt` で発行される。
- `Let's Encrypt` で発行した場合、デフォルトで自動更新される。

がポイントかなと思います。


# その他の GitLab に関する投稿
GitLab に関する記事は他にも投稿しているのでよければ読んでもらえたら嬉しいです。

https://qiita.com/kooohei/items/c7431d6546cdbf41a58f

https://qiita.com/kooohei/items/ddb69d37147e8952d0ee

https://qiita.com/kooohei/items/ff235f7857c8593801dc

https://qiita.com/kooohei/items/5fd8f81e5f099544e61d