Gitクックブック  

GitとかGitHubで気がついたことをメモしておきます。

GitHubにHTTPSでアクセスする時の設定  

2012-01-17 : 追加

GitHubにSSHでアクセスする時はid_rsaの設定ぐらいですが、HTTPSを使う場合はgit configで設定する必要があるみたいです。

% git config user.name "Dobuo"
% git config user.email "dobuo@foo.com"
% git config github.user username
% git config github.token 0123456789abcdef0123456789abcdef

ここでのgithub.tokenはAccount Settings->Account AdminのAPI Tokenを指定します。Keep it secret!だそうです(そりゃそうか)。
この設定と、以下に示すSSL証明書のインストールをすればHTTPSでpushしたりできます。まあ、ファイアウォールでブロックされてなければ敢えてHTTPSを使う意味はないと思いますが・・・

GitHubにHTTPSでアクセスするとSSL証明書の検証に失敗する  

2012-01-17 : 追加

GitHubにHTTPSでアクセスすると以下のようなエラーが出ます。

% git clone https://username@github.com/username/project.git
error: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://...

これはOpenSSLによる証明書の検証に失敗することで起こります。GitHubはDigiCertのHigh Assurance EVの認証を受けているようですが、システムによっては標準でそれらのRootおよび中間証明書がインストールされていないために検証に失敗するようです(検証したのはVine6およびWindowsのUTF8パッチ版git-1.7.6)。
この場合、以下の証明書をインストールすれば解決します。

これらはDigiCertのRoot Certificatesのページからダウンロードできます。この場合のように新たな証明書をOpenSSLへインストールする方法について解説したページが見つからなかったのでメモしておきます。ここではca-bundle.crtに直接追加する以外の方法で行います。

OpenSSLへの証明書のインストール  

ここでは、/usr/share/ssl/certsがOpenSSLの証明書ディレクトリだとします(ca-bundle.crtがあるところ)。

  1. インストールする証明書を/usr/share/ssl/certsにコピーします。
  2. 以下のコマンドでそれぞれの証明書にリンクを張ります。インストールする証明書をNewCA.crtとします。
    # ln -s NewCA.crt `openssl x509 -hash -noout -in NewCA.crt`.0
    このようにするとハッシュ値で求められた名前のリンクが張られます。GitHubで使うDigiCert社の証明書の場合は以下の追記に従ってください。

DigiCert社の証明書のフォーマットがDER形式でエンコードされていました。そのままだとgitがDER形式を読めず、証明書認証に失敗するようなのでまずPEM形式に変換します。

# openssl x509 -inform der -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
# openssl x509 -inform der -in DigiCertHighAssuranceEVCA-1.crt -out DigiCertHighAssuranceEVCA-1.pem

続いて上記と同様にリンクを張ります。

# ln -s DigiCertHighAssuranceEVRootCA.pem `openssl x509 -hash -noout -in DigiCertHighAssuranceEVRootCA.pem`.0
# ln -s DigiCertHighAssuranceEVCA-1.pem `openssl x509 -hash -noout -in DigiCertHighAssuranceEVCA-1.pem`.0

今回ダウンロードしたファイルでは以下のようになりました。

244b5494.0 -> DigiCertHighAssuranceEVRootCA.pem
774ba9af.0 -> DigiCertHighAssuranceEVCA-1.pem

これでインストールは完了です。ダウンロードしたDER形式のファイルは不要なので削除しておきます。続いてgitの設定を行います。

環境によると思いますがLinux版とWindows版(OpenSSLのバージョンの差?)でOpenSSLで求めたハッシュの値が異なることがあるようです。ハッシュを求めて名前を付けたのに認証されない!と言う場合は、使っているシステム上でハッシュを求めてみて下さい。
私の環境では同じ自己認証CAをVine6.1上で求めた時は4f561f0f(OpenSSL 1.0.0j 10 May 2012)、Win7上で求めた時はf12d5f94(OpenSSL 0.9.8e 23 Feb 2007)でした。結構これでいつもはまってる気がします…
お気を付け下さい [smile]

gitの設定  

gitが証明書ディレクトリを参照するようにします。

% git config --global http.sslCAPath /usr/share/ssl/certs             <-- Linux
% git config --global http.sslCAPath "C:\Program Files\Git\ssl\certs" <-- Windows

これでHTTPSでGitHubを使えるようになるはずです。その他、プライベートCAなどもこのようにすればHTTPSで使えるようになります。http.sslVerify=Falseで回避することも可能ですが、せっかくのSSLが無意味になってしまうのでやめたほうがいいでしょう。

Windowsの場合  

Windowsの場合はリンクが張れないので名前を変更します。証明書ディレクトリは標準ではC:\Program Files\Git\ssl\certsなので、そのディレクトリにファイルをコピーして、

  • DigiCertHighAssuranceEVRootCA.crt -> 81b9768f.0
  • DigiCertHighAssuranceEVCA-1.crt -> 829a1002.0

にそれぞれ変更します(拡張子は付けない)。