FC2ブログ

PCで: SSLでGit、認証で発生したエラーに対処

 とあるソフトのソースの最新版を見ようと思ってGitHubにあるものにLinuxでアクセスしようとしたのですが、SSL使おうとしたらエラーが出ました。こんな感じ。証明書自体はいいんだけどそれを発行した人がわからない、というのですね。
$ git clone https://github.com/XXX/YYY.git
Cloning into ZZZ...
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://github.com/XXX/YYY.git/info/refs

fatal: HTTP request failed

 いや、これまでも出てたんですが、手抜きをしてhttp://...に変えてやっていました。
 ですが、折角なのでちゃんと証明書の問題をなんとかしようと思い、なんとかしました(笑)。

 具体的には、1.認証局を調べ、2.そこの証明書を入手し、3.gitに設定、の三段階です。
 以下、コマンドラインの実行例がある場合、書き方はbash風ってことで。

1. 認証局を調べる
 わかってる場合は、以下を飛ばして 2. へ。
 アクセスしたいサーバの証明書を発行してくれたのが誰なのかを調べます。今回の例では、github.comのを、ですね。

1.1 ページを表示
 手抜きをしてウェブブラウザを使ってしまいました。ブラウザで以下を表示します。証明書だけ表示することができればいいんですけど、やり方を調べるのが面倒だったので。

https://github.com/

1.2 証明書を表示
 私の場合はFirefoxを使っているので、

ツール → ページの情報 → セキュリティ → 証明書を表示

として表示された情報の中から、発行者の一般名称(CN)と部門(OU)をチェック。

一般名称(CN) DigiCert High Assurance EV CA-1
部門(OU) www.digicert.com

[追記:2012-09-04]
 opensslコマンド辺りにこういう機能ありそうだなーと思ってman pageを見てみたら見つかりました。
 こんな感じでOkですね。
$ openssl s_client -connect github.com:443 < /dev/null
[追記終わり]

2. ルート証明書を取得
 持っている場合は、以下を飛ばして 3. へ。
 CA、この場合はDigiCertが配布しているルート証明書をもらってきます。

2.1 発行者のウェブサイトを見に行く
 どのように配布しているかは発行者によるでしょうが、DigiCertの場合は、サイトのトップページから、

https://www.digicert.com
Support → Download a Root or Intermediate Certificate → DigiCert High Assurance EV Root CA → Download

と辿ると、以下の場所にあることがわかります。

https://www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt

2.2 ダウンロード
 そのままブラウザでダウンロードしてもいいし、好きな方法で。そして適当な場所に。
 私は今回、それ用のディレクトリを用意し、wgetで持ってきました。
$ mkdir ~/certs-other
$ wget -P ~/certs-other -x https://www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt

3. Gitの設定
 他にもあるでしょうが、基本的には以下の4つの内から一つ選んで設定を行います。私は(b)にしました。

(a) グローバル設定、ファイル指定
 gitコマンドが常に参照するようにし、設定ファイル中で今回ダウンロードしてきたファイルを指定します。
 2.2 の通りの場所にダウンロードしてあるとした場合、こんなコマンドを実行すると、設定ファイルが編集されます。まあ、エディタを使って手で編集しても別にかまいませんが。
$ git config --global http.sslCAInfo ~/certs-other/www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt
$ cat ~/.gitconfig
[http]
sslCAInfo = /home/(略)

(b) グローバル設定、ディレクトリ指定
 証明書を集めておくディレクトリを用意し、(a)と同じようにgitコマンドが常に参照するようにします。
 というか、私の場合既に ~/.certs というディレクトリを作ってそこに色々入れていたんで、そこに入れようとしたら、元々あったというオチ(笑)。変数$fを使っているのは、ただ単にコマンドラインが長くなるのが面倒だったからというだけです。
$ mkdir ~/.certs
$ f=~/certs-other/www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt
$ ln -s "$f" ~/.certs/`openssl x509 -hash -noout -in "$f"`.0
$ git config --global http.sslCAPath ~/.certs
$ cat ~/.gitconfig
[http]
sslCAPath = /home/(略)

(c) リポジトリ毎設定、ファイル指定
 (a) に似ています。ただ、持ってきた証明書が特定のリポジトリでのみ参照されるのが違います。
 本来はどんな感じでやるのかよく知りませんが、多分こんな感じでしょう。一度コマンドラインで指定して実行して、後でconfigしてみました。
$ git -c http.sslCAInfo="$HOME"/certs-other/www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt clone https://github.com/XXX/YYY.git
Cloning into ZZZ...
(略)
$ cd ZZZ
$ git config http.sslCAInfo ~/certs-other/www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt
$ cat .git/config
(略)
[http]
sslCAInfo = /home/(略)

(d) リポジトリ毎設定、ディレクトリ指定
 (c) と (b) を混ぜたみたいな感じです。
$ mkdir ~/.certs
$ f=~/certs-other/www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt
$ ln -s "$f" ~/.certs/`openssl x509 -hash -noout -in "$f"`.0
$ git -c http.sslCAPath="$HOME"/.certs clone https://github.com/XXX/YYY.git
Cloning into ZZZ...
(略)
$ cd ZZZ
$ git config http.sslCAPath ~/.certs
$ cat .git/config
(略)
[http]
sslCAPath = /home/(略)


 とまあこんな感じで、取り敢えずGitHubはSSLで参照できるようになりました。

コメント

非公開コメント

プロフィール

水響俊二

Author:水響俊二
水響 俊二 [MIZUKI Shunji]

暫定的に、18禁作品の感想などは裏サイトで書いています。
   

最新記事
最新コメント
カテゴリ
検索フォーム
リンク
RSSリンクの表示
月別アーカイブ
アクセス解析中