Windows 環境下での ssh の設定には Linux のものとは多少異なる操作があります。忘れた時の為にこの記事を残すことにしました。
自分しか使わない前提の GitLab サーバを構築(自己証明書で運用)しましたが、アップデートを重ねていくうちに git pull/push 時に次の警告が出るようになってしまいました。
warning: ----------------- SECURITY WARNING ----------------
warning: | TLS certificate verification has been disabled! |
warning: ---------------------------------------------------
warning: HTTPS connections may not be secure. See https://aka.ms/gcmcore-tlsverify for more information.
これは次のコマンドが実行され、サーバー証明書のチェックを回避する設定が選択されている場合に表示されます。
git config --global http.sslverify true
因みに http.sslverify false が設定されている場合だと、次のエラーが発生して git pull/push 操作自体に失敗します。
fatal: unable to access 'https://接続先/オーナー名/リポジトリ名.git/': SSL certificate problem: self signed certificate
この時、リモート・リポジトリの設定は次のようなものでした。https で始まる点に注目して下さい。
git remote -v
origin https://接続先/オーナー名/リポジトリ名.git (fetch)
origin https://接続先/オーナー名/リポジトリ名.git (push)
Git リポジトリへの接続には ssh を使うやり方も選べるので切り替えることにしました。それにより、目障りな警告メッセージを見なくて済むようになる事を目論んだからです。
まずは ssh-keygen コマンドを使って公開鍵とプライベート鍵のペアを作ります。作り方は簡単にググれるので省きます。鍵のファイル名はそれぞれ id_rsa.pub と id_rsa とします。
公開鍵(id_rsa.pub)の方を GitLab の Preferences – SSH 鍵の画面で登録します。
次に、ユーザのホームディレクトリ下に .ssh というフォルダを作成します。PowerShell を表示させて次のコマンドを入力します。
mkdir ${env:UserProfile}/.ssh
上記のコマンドで作成された ${env:UserProfile}/.ssh というフォルダの下に config というファイルを作成します。中身は次の内容とします。
Host エリアス
HostName ホスト名.ドメイン名
User git
IdentityFile ~/.ssh/id_rsa
Port ポート番号
TCPKeepAlive yes
IdentitiesOnly yes
ssh では通常ポート番号 22 を使いますが、Docker コンテナとして GitLab を運用する場合は、publish スイッチを伴う docker run コマンドを使い、ホスト側の22番との競合を回避させるのが通例です。上記の設定例にあるポート番号は回避させる為に与えた番号を記述します。
config ファイルを作成したら、同じフォルダへ公開鍵とプライベート鍵を保存します。
続いて、所有者以外に書き換えられないようアクセス権を剥奪します。Linux の場合だと chmod 700 を実行する操作に該当します。
icacls $env:UserProfile/.ssh/config /inheritance:r
icacls $env:UserProfile/.ssh/config /grant "${env:UserDomain}\${env:UserName}:F"
icacls $env:UserProfile/.ssh/id_rsa /inheritance:r
icacls $env:UserProfile/.ssh/id_rsa /grant "${env:UserDomain}\${env:UserName}:F"
icacls $env:UserProfile/.ssh/id_rsa.pub /inheritance:r
icacls $env:UserProfile/.ssh/id_rsa.pub /grant "${env:UserDomain}\${env:UserName}:F"
フォルダのアクセス権も同様に剥奪します。
icacls $env:UserProfile/.ssh /inheritance:r
icacls $env:UserProfile/.ssh /grant "${env:UserDomain}\${env:UserName}:F"
ssh を使ってGitLabサーバーへアクセスできるか確認します。’v’ オプションはデバッグ用で、接続障害が発生した時に役立つ診断情報を画面に表示させることが出来ます。
ssh -v エリアス
接続を無事確認することが出来たら、このエリアスを使ってgit の構成を変更します。
git remote set-url origin git@エリアス:オーナー名/リポジトリ名.git
もはや https 接続を使いませんので不要な設定を取り除きます。
git config --global --unset http.sslverify
git config --global --unset http.sslcainfo
あとは、git pull コマンドなどを実行して問題が無いことを確認します。