* Gitクックブック [#afc3094e]
 GitとかGitHubで気がついたことをメモしておきます。
 
 ** GitHubにHTTPSでアクセスする時の設定 [#xe1b945b]
 #anno2(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証明書の検証に失敗する [#meb4f88a]
 #anno2(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 High Assurance EV Root CA
 - DigiCert High Assurance EV CA-1
 
 これらは[[DigiCertのRoot Certificatesのページ>https://www.digicert.com/digicert-root-certificates.htm]]からダウンロードできます。この場合のように新たな証明書をOpenSSLへインストールする方法について解説したページが見つからなかったのでメモしておきます。ここではca-bundle.crtに直接追加する以外の方法で行います。
 
 *** OpenSSLへの証明書のインストール [#k94f4e0d]
 - 参考 -- [[Certificate Installation with OpenSSL - Other Poeple's Certificates>http://gagravarr.org/writing/openssl-certs/others.shtml]]
 
 ここでは、''/usr/share/ssl/certs''がOpenSSLの証明書ディレクトリだとします(ca-bundle.crtがあるところ)。
 + インストールする証明書を/usr/share/ssl/certsにコピーします。
 + 以下のコマンドでそれぞれの証明書にリンクを張ります。インストールする証明書を'''NewCA.crt'''とします。
  # ln -s '''NewCA.crt''' `openssl x509 -hash -noout -in '''NewCA.crt'''`.0
 このようにするとハッシュ値で求められた名前のリンクが張られます。GitHubで使うDigiCert社の証明書の場合は以下の追記に従ってください。
 
 - 2013-05-10追記
 
 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 DighCertHighAssuranceEVCA-1.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の設定を行います。
 
 - 2013-11-03追記
 
 環境によると思いますが&color(red){Linux版とWindows版(OpenSSLのバージョンの差?)でOpenSSLで求めたハッシュの値が異なることがあるようです};。ハッシュを求めて名前を付けたのに認証されない!と言う場合は、'''使っているシステム上で'''ハッシュを求めてみて下さい。~
 私の環境では同じ自己認証CAをVine6.1上で求めた時は4f561f0f(OpenSSL 1.0.0j 10 May 2012)、Win7上で求めた時はf12d5f94(OpenSSL 0.9.8e 23 Feb 2007)でした。結構これでいつもはまってる気がします…~
 お気を付け下さい⌣
 
 *** gitの設定 [#o0104007]
 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が無意味になってしまうのでやめたほうがいいでしょう。
 
 #classdiv(box-yellow)
 *** &color(red){''Windowsの場合''}; [#ub6e7083]
 Windowsの場合はリンクが張れないので名前を変更します。証明書ディレクトリは標準ではC:\Program Files\Git\ssl\certsなので、そのディレクトリにファイルをコピーして、
 - DigiCertHighAssuranceEVRootCA.crt -> 81b9768f.0
 - DigiCertHighAssuranceEVCA-1.crt -> 829a1002.0
 
 にそれぞれ変更します(拡張子は付けない)。
 #classdiv(end)