【Ubuntu 22.04 LTS】GitBucketをApache + mkcertでHTTPS化(AJP連携 & Gitクライアント設定まで)

PC関連

Ubuntu上に構築した GitBucket を、Apache と mkcert(ローカル認証局) を使ってHTTPS化(SSL対応)した手順のまとめです。

HTTPのまま運用すると、ブラウザからビルド成果物(.exe 等)をダウンロードする際に安全性の警告が出たり、通信のセキュリティ上の問題が発生したりするため、HTTPS運用へ移行しました。

あわせて、「HTTPプロキシからAJPプロキシに変更して通信エラーを解決した理由」 や 「Windows / Visual Studio からの Git クローン時のSSL証明書エラー対策」 についても記述しています。

サーバー構成と前提条件

  • OS: Ubuntu Desktop 22.04 LTS
  • Webサーバー: Apache2 (リバースプロキシ & SSL終端)
  • APサーバー: Tomcat9 (AJPポート: 8009)
  • ホスト名: your-gitserver(任意のローカルホスト名)
  • アクセスURL:https://your-gitserver/gitbucket/

1. Apache2 モジュールの有効化

HTTPからHTTPSへのリダイレクトやSSL通信に必要なモジュールを有効化します。

sudo su -

# RewriteモジュールとSSLモジュールの有効化
a2enmod rewrite
a2enmod ssl
a2ensite default-ssl

systemctl restart apache2.service

この時点で https://your-gitserver/ にアクセスすると、Apacheのデフォルトページが表示されます(この時点では自前署名証明書のためブラウザの安全警告が出ます)。

2. mkcert によるローカル認証局(CA)の作成と証明書発行

オレオレ証明書の警告(「この接続は非保護です」)を消すため、mkcert を使ってローカル認証局を作成し、証明書を発行します。

# mkcertのインストールとローカルCAの作成
apt install -y mkcert
mkcert -install

# サーバー(your-gitserver)用の証明書と秘密鍵を発行
mkcert your-gitserver

# 生成されたファイルをSSLディレクトリへ移動
mv your-gitserver-key.pem /etc/ssl/private/your-gitserver-key.pem
mv your-gitserver.pem /etc/ssl/certs/your-gitserver.pem

3. Apacheのバーチャルホスト設定(★AJP連携がポイント)

HTTP(80番)アクセスを強制的にHTTPS(443番)へリダイレクトし、バックエンドのTomcatへは AJPプロトコル(8009番) で転送するように設定します。

① HTTP(80番ポート)設定: /etc/apache2/sites-available/001-your-gitserver.conf

<VirtualHost *:80>
    ServerName your-gitserver

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    AllowEncodedSlashes NoDecode
    ProxyPreserveHost On

    # HTTPSへリダイレクト
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

② HTTPS(443番ポート)設定: /etc/apache2/sites-available/your-gitserver-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName your-gitserver:443

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/your-gitserver.pem
    SSLCertificateKeyFile /etc/ssl/private/your-gitserver-key.pem

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    AllowEncodedSlashes NoDecode
    ProxyPreserveHost On

    # ★重要: AJPプロトコルでTomcatへ転送する
    ProxyPass /gitbucket ajp://localhost:8009/gitbucket
    ProxyPassReverse /gitbucket ajp://localhost:8009/gitbucket
</VirtualHost>
</IfModule>

設定を反映します。

a2ensite your-gitserver-ssl.conf
systemctl restart apache2.service

💡 なぜ http://localhost:8080 ではなく ajp://localhost:8009 なのか? HTTPプロキシ(http://)を使用した場合、ApacheがHTTPSで受け取った通信状態(SSL情報やスキーム)がTomcatへ正しく伝わらず、内部リンクの崩れや無限リダイレクトエラー(ERR_TOO_MANY_REDIRECTS)が発生することがあります。 AJP(ajp://)を使うことで、SSL通信の情報がTomcat/GitBucketへ完璧に引き継がれるため、Chromeでも「この接続は保護されています」と正常に表示されるようになります。

4. GitBucket(gitbucket.conf)の base_url 設定変更

GitBucket側にもHTTPSで動作していることを認識させるため、ベースURLを修正します。

/var/gitbucket/gitbucket.conf を編集します。

base_url=https\://your-gitserver/gitbucket

編集後、Tomcatを再起動します。

systemctl restart tomcat9.service

5. クライアントPC(Windows / Mac)の証明書設定

サーバー側で作成したルート証明書(rootCA.pem)をクライアントPCにインストールすることで、ブラウザの警告を完全に消去します。

  1. サーバー上で mkcert -CAROOT コマンドを実行し、rootCA.pem の場所を確認してクライアントPCへコピーします。
  2. Windowsの場合:
    • rootCA.pem を rootCA.cer にリネーム(またはそのまま)ダブルクリック。
    • 「証明書のインポートウィザード」を起動し、証明書ストアとして 「信頼されたルート証明機関」 を選択してインポートします。
  3. Macの場合:
    • rootCA.pem をダブルクリックし、「キーチェーンアクセス」で「常に信頼」に設定します。

これで Chrome 等のブラウザで https://your-gitserver/gitbucket/ にアクセスした際、鍵マークがつき「この接続は保護されています」と表示されます。

6. Gitクライアント(Visual Studio / Git CLI)のSSLエラー対策

git clone や git push を行う際、Gitコマンドは独自に証明書検証を行うため、そのままではSSL証明書エラー(SSL certificate problem)が発生します。

git config --global http.sslVerify false で検証を丸ごと無効化する方法もありますが、セキュリティ上推奨されないため、「特定のサーバー(your-gitserver)のみルート証明書を読み込む」 設定を行います。

クライアントPCの .gitconfig(例: C:\Users\your_user\.gitconfig)に以下を追記します。

[http "https://your-gitserver/"]
    sslCAInfo = C:/Users/your_user/Documents/rootCA.pem

これにより、GitHubなど他の外部リポジトリへの安全性を保ったまま、自作サーバー(your-gitserver)のみVisual StudioやGit Bashから正常にSSL通信(Clone/Push)が可能になります。

💡 トラブルシューティング & Tips

iPhoneやスマホからホスト名でアクセスできない場合

iPhoneなどのモバイル端末はローカルのホスト名(.local 以外の単一ホスト名)の名前解決ができません。 スマホからアクセスしたい場合は、MacやPCをプロキシサーバーとして稼働させるか、DNSサーバー(dnsmasq等)をローカルネットワーク内に建てることで回避可能です。

コメント

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