torutkのブログ

ソフトウェア・エンジニアのブログ

CentOS 6.xのgitコマンドはhttpアクセスで認証が必要なときにプロンプトを出さずに401エラーを出す?

先日、RedmineとGitを連携させる(認証統合) - torutkの日記 でGitリポジトリをHTTP経由でアクセスする設定を書きました。その設定で、新たにGitリポジトリを構築したサーバーにアクセスすると、次のようにエラーとなります。

OSのバージョンとgitのバージョン
$ cat /etc/redhat-release
CentOS release 6.3 (Final)
$ git --version
git version 1.7.1
HTTP経由でリポジトリのクローンを試みる
$ git clone http://gito.example.org/git/basicauthen.git
Initialized empty Git repository in /home/hogehoge/work/basicauthen/.git/
error: The requested URL returned error: 401 while accessing http://gito.example.org/git/basicauthen.git/info/refs

fatal: HTTP request failed
$
このときのHTTPサーバー側のログ(access_log)
192.168.1.10 - - [27/Jan/2013:16:15:07 +0900] "GET /git/basicauthen.git/info/refs?service=git-upload-pack HTTP/1.1" 401 475 "-" "git/1.7.1"
192.168.1.10 - - [27/Jan/2013:16:15:07 +0900] "GET /git/basicauthen.git/info/refs HTTP/1.1" 401 475 "-" "git/1.7.1"

git cloneコマンド実行時、Basic認証ではユーザー/パスワード入力を促すと思っていましたが、上述のとおり入力を求めることなく401エラーとしてしまいます。

ずっとHTTPサーバー側の設定が原因と思って調べまわってましたが、たまたまWindowsCygwin上で同じリポジトリに対してクローンしてみたところ、

$ git clone http://gito.example.org/git/basicauthen.git
Cloning into 'basicauthen'...
Username for 'http://gito.example.org': hogehoge 
Password for 'http://hogehoge@gito.example.org': fugafuga 
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

と、すんなりアクセスできるではないですか・・・。

次は、Fedora 17を立ち上げて、アクセスを試みてみました。

$ git --version
git version 1.7.11.7
$ git clone http://gito.example.org/git/basicauthen.git
Cloning into 'basicauthen'...
Username for 'http://gito.example.org': hogehoge
Password for 'http://hogehoge@gito.example.org': fugafuga 
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

と、こちらもすんなりアクセスできました。

うーん、3日間、Apacheの設定、GitのCGI設定を調べ回り、KVM仮想化ゲストをいくつか立てて試したりとしていましたが、落ちがCentOS 6のgitコマンドがhttpでBasic認証を要求されてもコマンドプロンプトでユーザーに入力を促すことなくサーバーへリクエストを送って401エラーを喰らって終了という、なんともな結果でした。

CentOS 6のgit 1.7.1での回避策

リポジトリURLにユーザー名を追加
$ git clone http://hogehoge@gito.example.org/git/basicauthen.git
Initialized empty Git repository in /home/hogehoge/work/git_http/basicauthen/.git/
Password: fugafuga
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

URLにユーザー名を入れると、パスワード入力が促されるので、認証アクセスが可能になります。

リポジトリURLにユーザー名とパスワードを追加
$ git clone http://hogehoge:fugafuga@gito.example.org/git/basic
authen.git
Initialized empty Git repository in /home/hogehoge/work/git_http/basicauthen/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.

URLにユーザー名とパスワードを入れると、認証アクセスが可能になります。

~/.netrcに接続先ホスト、ユーザー名、パスワードを記載

~/.netrcに以下のようにホスト名、ユーザー名、パスワードを記載します。

machine gito.example.org
login hogehoge
password fugafuga

すると、リポジトリURLに前にエラーになっていた記載の方法でアクセスするとエラーにならずコマンドが実行可能になります。

$ git clone http://gito.example.org/git/basicauthen.git
Initialized empty Git repository in /home/hogehoge/work/git_http/basicauthen/.git/
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

参考サイト

.netrcの設定、URLへのユーザー名、パスワード埋め込みについての説明があります。