kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Gitで独自の証明書を使用する(Git for Windows 2.12.1で不要に)

TFSを組織内で運用している場合、証明書を購入せず、Windows Serverの認証局で運用することもあると思います。Active Directoryを使用している場合、追加コストなく、安全に証明書の配布ができるので、使っているところも多いと思います。

WindowsのAPIを使って証明書の検証を行う場合、証明書ストアに入っていれば自動的に使用されるので問題ありません。しかし、Windowsの証明書ストアを使用しないツールでは検証できず、エラーになります。

例えば、Gitはhttpsでcloneすることができますが、独自の証明書*1を使っている場合、ビルドエージェントが以下のエラーを表示します。

fatal: unable to access ‘https://hoge.local/DefaultCollection/private/_git/PrivateGit/’: SSL certificate problem: unable to get local issuer certificate
[error]Git fetch failed with exit code: 128

回避するには以下の方法があります。

  • Gitに証明書の検証をさせない
  • Gitに信頼された証明書を追加する

前者は特定のリポジトリだけであればともかく、すべての認証局の検証をさせない設定をしてしまうと、不正な証明書も受け入れてしまうので避けるべきです。ということで、信頼された証明書を追加します。

f:id:kkamegawa:20161023075531p:plain

簡単なのはIEのインターネットオプションにある「コンテンツ」から「証明書」ボタンをクリックして表示し、対象の「信頼されたルート証明書」タブの該当の認証局を選択して「エクスポート」をクリックします。

f:id:kkamegawa:20161023075532p:plain

Base 64 encoded X.509を選択します。

f:id:kkamegawa:20161023075533p:plain

保存するファイル名を指定します。

f:id:kkamegawa:20161023075534p:plain

「完了」をクリックして終了です。

f:id:kkamegawa:20161023075535p:plain

コマンドプロンプトから以下のコマンドを実行します。

git config –global http.sslcainfo 保存したファイル名

これで独自の証明書であっても問題なく暗号化通信が行われます。このコマンドではcerファイルは単に場所を指定しているだけのようです。恒久的に変更するには%programfiles%\Git\mingw64\ssl\certs にある、ca-bundle.trust.crtに追記します。
(追記) Git for Windowsの2.10では複数のhttp.sslcainfoを指定すると、明示的に追加した証明書しか検証しないようです。外部のサイトとhttpsでcloneする場合、ca-bundle.trust.crtに追加してください。

Windowsのcerファイルは改行コードが\r\nなので、適当なツールで\r\nから\nに変換してからファイルに追加してください。お好きな方法でどうぞ。

(2017/3/23追記)
f:id:kkamegawa:20170323055254p:plain

Git for Windows 2.12.1でインストール時にOpenSSLではなく、WindowsのSecure Channelを使うことができるようになりました。これは.gitconfigでは変更できないインストール時のみの設定なので、WindowsユーザーはWindows Secure Channel Libraryを使うことをお勧めします。

これを選択すれば上記の設定は不要です(OpenSSLを選んでしまった場合は変わらず必要になります)。要望出そうと思っていたけど、sshでいいんじゃね?って言われるかなあと思ってたら入ったw。

*1:オレオレ証明書