この記事にはプロモーションが含まれていることがあります

クラウド上に構築したGitLabサーバをHTTPS化する方法

IT

前回、GCPを使ってクラウド上にGitLab環境を構築しました。

HTTP通信なのでLAN内なら問題ないのですが、インターネット経由で通信となるとセキュリティ的に問題です。

そんなわけで、今回は前回構築したGitLabサーバをHTTPS化します。

近々ドメインを取得して正式なSSL証明書を発行する予定ですが、ちょっと時間とお金がかかりますので、今回はすぐに作れるオレオレ証明書を使いたいと思います。

オレオレ証明書は一時的なテストなどで代用する等、限定的な利用に留めてください。オレオレ証明書のまま運用し続けるのは危険です。また、利用が終わったら必ずブラウザの証明書ストアから削除するようにしてください。

スポンサーリンク

ネットワーク設定変更

HTTPの接続を遮断

GCPの場合だと、VMインスタンス詳細設定画面のファイアウォールで、HTTPの許可を外して画面下部の保存ボタンをクリックすると、設定が適用されます。

これでHTTPSしか受け付けなくなります。

実際にブラウザでアクセスすると、このようにさっきまで表示されていた画面が表示されなくなります。これでHTTPのブロック完了です。

スポンサーリンク

SSL証明書の作成(今回はオレオレ証明書)

今回は正式な認証局のSSL証明書ではなく、とりあえずオレを信じろ的なSSL証明書(通称:オレオレ証明書で試します。ちゃんと運用する方は第三者機関の正式なSSL証明書を取得してください。

正式なSSL証明書を取得する方は、サイバートラストのSSL証明書がシンプルでわかりやすく、営業担当や技術担当者も親切でしたので、個人的にオススメです。

準備

opensslコマンドが使える環境にログインします。今回はLinuxサーバを立てているので、そこでopensslが使えると思います。

which で opensslが入っているか確認します。次のようにフルパスでopensslが表示されれば入っています。なにも表示されない場合は、opensslがインストールされていないので、apt intsll openssl等でインストールしてください。

$ which openssl
/usr/bin/openssl

Subject Alternative Namesファイルを作成

DNSはドメイン名、IPは外部IPアドレスを指定します。これを sam.txt ファイルに書き出します。ファイル名は何でもよいです。

$ echo "subjectAltName = DNS:gitlab.battan.com, IP:xxx.xxx.xxx.xxx" > sam.txt

秘密鍵ファイルを作成

一番大事な秘密鍵ファイルを作成します。鍵ファイルの名前は何でもよいですが、秘密鍵、署名、証明書などごちゃごちゃしますので、マイルール決めたほうがよいです。

$ openssl genrsa 2048 > secret.key

秘密鍵ファイルから署名ファイル(CSR)を作成

次に署名を作ります。署名内容はパラメータで指定します。

$ openssl req -new -key secret.key -subj "/C=JP/ST=Tokyo/L=Chiyoda City/O=Battan Land/OU=Team Battan/CN=gitlab.battan.com" > server.csr
  • C(国):JP(日本)
  • ST(所在地):Tokyo(都道府県)
  • L(地域):千代田区(市区町村)
  • O(登録者名):Battan Land(個人名、または法人名)
  • OU(部署名):Team Battan(会社などでの部署名)※指定しなくてもよいです
  • CN(コモンネーム):gitlab.battan.com(FQDN、ワイルドカードも使用可能)

ちなみにオレオレ証明書の場合はコモンネームだけでも良かったかもしれません。

SSL証明書(CRT)を作成 ※オレオレ証明書

本来は署名ファイル(CSR)の内容を認証局に提出して、審査が通って初めて正式な証明書ファイルができるんですが、今回は自分で審査して証明書ファイルを作ります。まさにオレオレ証明書

期間は一年間にしときましょうか。短いと面倒くさいので。

$ openssl x509 -days 365 -req -extfile sam.txt -signkey server.key < server.csr > server.crt

作成したファイル群の確認

このような感じで4つのファイルが作成できたと思います。

$ ls -l
-rw-rw-r-- 1 battan users   58 Mar 21 08:59 sam.txt
-rw-rw-r-- 1 battan users 1679 Mar 21 09:02 secret.key
-rw-rw-r-- 1 battan users 1294 Mar 21 09:08 server.crt
-rw-rw-r-- 1 battan users 1009 Mar 21 09:03 server.csr
  • sam.txt: Subject Alternative Names定義ファイル
  • secret.key: 秘密鍵ファイル(絶対流出したらあかんやつです)
  • server.crt: オレオレ証明書ファイル
  • server.csr: 署名ファイル

次に証明書ファイルが正しく作成できているか確認します。いろいろ指定した設定値が適所にセットされていればOKです。

$ openssl x509 -in server.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            2c:48:c4:0d:(省略)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, L = Chiyoda City, O = Battan Land, OU = Team Battan, CN = gitlab.battan.com
        Validity
            Not Before: Mar 17 11:12:34 2021 GMT
            Not After : Mar 17 11:12:34 2022 GMT
        Subject: C = JP, L = Chiyoda City, O = Battan Land, OU = Team Battan, CN = gitlab.battan.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:c8:ac:4c:aa:01:b1:5d:90:94:cf:19:f2:9f:e8:
                    (省略)
                    46:13
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:gitlab.battan.com, IP Address:xxx.xxx.xxx.xxx
    Signature Algorithm: sha256WithRSAEncryption
         07:21:e0:b9:f8:df:b7:a3:4f:d4:ec:b7:11:64:f1:31:75:XX:
          (省略)
         53:4e:9d:82
スポンサーリンク

Nginxにオレオレ証明書をセット

作成ファイル一式をNginxの設定フォルダに設置

場所はどこでもよいのですが、Nginxの設定として行うなら他の設定ファイルと一緒にまとめておいたほうが管理が楽ですので、/etc/nginx ディレクトリ内にsslディレクトリを作成して4ファイルを移動します。

(1) root作業が多くなるのでrootユーザに切り替え
sudo su

(2) SSL証明書格納ディレクトリを作成
mkdir /etc/nginx/ssl

(3) 作成した一式を確認
ls -l
-rw-rw-r-- 1 battan users   58 Mar 21 08:59 sam.txt
-rw-rw-r-- 1 battan users 1679 Mar 21 09:02 secret.key
-rw-rw-r-- 1 battan users 1294 Mar 21 09:08 server.crt
-rw-rw-r-- 1 battan users 1009 Mar 21 09:03 server.csr

(4) 一式を移動
mv * /etc/nginx/ssl

(5) 秘密鍵が漏洩するとまずいので、rootしか見れないようにオーナーとパーミッションを変更
chown -R root:root /etc/nginx/ssl
chmod -R 600 /etc/nginx/ssl/*
chmod 700 /etc/nginx/ssl

Nginxの設定変更(HTTP⇒HTTPS切り替え)

前回設定したHTTPで受け付けて、裏側で動いているGitLab(12000番ポート)へ転送する部分を書き換えます。

  • listenを 80 から 443 sslに変更
  • server_nameを _ から gitlab.battan.com に変更
  • ssl_certificateを追加して、SSL証明書ファイルを指定
  • ssl_certificate_keyを追加して、秘密鍵ファイルを指定
server {
  listen 443 ssl;
  server_name gitlab.battan.com;
  ssl_certificate      /etc/nginx/ssl/server.crt;
  ssl_certificate_key  /etc/nginx/ssl/server.key;

	location / {
	  # Reverse Proxy Settings
	  proxy_set_header X-Forwarded-Proto $scheme;
	  proxy_set_header Host              $http_host;
	  proxy_set_header Host              $host;
	  proxy_set_header X-Real-IP         $remote_addr;
	  proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
	  proxy_pass       http://localhost:12000;

    # Logs  
    access_log  /var/log/nginx/proxy_access.log;
    error_log   /var/log/nginx/proxy_error.log;
  }
}

次の3箇所のFQDNが一致するようにしてください。

  1. server_name で指定したFQDN
  2. sam.txtの DNSの部分
  3. 署名作成時のCNの部分

スポンサーリンク

ブラウザにオレオレ証明書をセット

第三者機関の正式なSSL証明書の場合はブラウザに対してなにもする必要はありません。ブラウザがアクセスする際には証明機関に照合します。

但し、今回のようにオレオレ証明書の場合は、誰も証明書を証明してくれないため、手動でブラウザに証明書ファイルをインポートする必要があります

SSL証明書(CRT)ファイルをダウンロード

さきほど作成したオレオレ証明書ファイル(server.crt)をパソコンにダウンロードして、ブラウザにインポートします。

インポート方法はこのサイトを参考にしてみてください。

名前解決

DNSにも登録がないと思いますので、hostsファイルで名前解決させます。

コマンドプロンプトか、ファイル名を指定して実行で、次のコマンドを実行します。

> notepad c:\windows\system32\drivers\etc\hosts

ノートパッドが起動してhostsの中身が表示されたら、次の一行を追加して保存します。

xxx.xxx.xxx.xxx gitlab.battan.com

xxx.xxx.xxx.xxxの部分は構築したサイトのIPアドレスを指定します。

ブラウザで暗号化されているか確認

これで設定は完成です。hostsで定義したURIをブラウザでアクセスしてみましょう。

https://gitlab.battan.com/

おお、表示されましたね。しかもきちんと鍵マークで一応通信は暗号化されています。これでSSL化完了です。お疲れさまでした。

スポンサーリンク

まとめ

これでクラウド上に構築したGitLabをHTTPS化できました。

GitLabに限らず、Nginxを使ったWebサーバなら、この手順SSL証明書を作ってHTTPS化できると思います。最後におさらいしておきましょう。

  1. Webサーバを立ててHTTPで通信できるところまで確認
  2. HTTP通信を遮断する
  3. 秘密鍵を作成
  4. 秘密鍵から署名を作成
  5. 署名から証明書を作成 ※今回はオレオレ証明書
  6. Webサーバに秘密鍵とSSL証明書を指定してHTTPS化
  7. ブラウザにSSL証明書をインポート

今回は一度HTTPで動かしたかったので分けましたが、最初からHTTPSでしか動かさない前提でしたら、3から始めて6のタイミングで1のWebサーバを構築した方が効率がよいと思います。

コメント

タイトルとURLをコピーしました