git clone が公開鍵のエラーで失敗する場合の対処方法

git clone が公開鍵のエラーで失敗する場合の対処方法

以下は Debian 9 Stretch の amd64 版のはなし。
以前 github から clone する際に以下のような公開鍵のエラーが発生してclone に失敗することがあった。

gnutls_handshake() failed: Public key signature verification has failed.

その時はこちらのページを参考にして、

https://nyacom.net/?p=480

git の Debian パッケージが依存している libcurl4-gnutls-dev を libcurl4-openssl-dev に変更してパッケージをビルドして解決していた。

だが、パッケージを hold 設定するのを忘れていて、apt-get upgrade したらオリジナルの gnutls 版の git がインストールされてしまい、再び clone できなくなってしまった。(できる場合もあった)

再度手動でパッケージを作成するのは面倒だなぁと思っていたところ、 reddit でビルドスクリプトの紹介があったのでこれを使用して、再び openssl 版 git のパッケージを作成する。

https://www.reddit.com/r/linuxquestions/comments/6ttzio/problem_with_git_on_debian_91_strech/

https://gist.github.com/pescobar/6ae5634f92d75d23c36a

ビルドスクリプトのダウンロードと、openssl 版 git のビルド

$ wget https://gist.githubusercontent.com/pescobar/6ae5634f92d75d23c36a/raw/829004bf2a2893a2cbc34f6a7b39bfd8b997d4be/build-git.sh
$ bash build-git.sh

ビルドしたパッケージのインストール(Ubuntu の場合はスクリプト内でインストールしてる)

$ cd soure-git
$ sudo dpkg -i ./*.deb

いくつかのパッケージがインストールに失敗したが、使用する予定がないので完全に削除する。

$ sudo apt-get --purge remove git-mediawiki git-svn git-all

残りのパッケージを hold するにあたり、まずはパッケージリストを作成。

$ dpkg -l | grep git | grep 2.14.2 | awk '{printf $2 " "}' > git_hold.list
$ cat git_hold.list
git git-core git-cvs git-daemon-run git-dbgsym git-doc git-el git-email git-gui git-man gitk gitweb

root になり、パッケージリスト内のパッケージを hold する。

$ su
# for i in $(cat ./git_hold.list); do echo $i hold | dpkg --set-selections ; done

hold されたはずのパッケージを確認する。これらのパッケージは今後 apt-get upgrade してもアップグレードされない。

# dpkg -l | grep git | grep 2.14.2 | awk '{print $2}'
git
git-core
git-cvs
git-daemon-run
git-dbgsym
git-doc
git-el
git-email
git-gui
git-man
gitk
gitweb

hold の確認はこっちが確実。先頭が hi なら hold 済み。(ii なら hold されていない)

$ dpkg -l | grep git | grep 2.14.2  | awk '{print $1 " " $2}'
hi git
hi git-core
hi git-cvs
hi git-daemon-run
hi git-dbgsym
hi git-doc
hi git-el
hi git-email
hi git-gui
hi git-man
hi gitk
hi gitweb

適当なリポジトリを clone できるかテストして完了。

$ git clone https://github.com/nkon/rust_blinky.git
Cloning into 'rust_blinky'...
remote: Counting objects: 226, done.
remote: Total 226 (delta 0), reused 0 (delta 0), pack-reused 226
Receiving objects: 100% (226/226), 575.37 KiB | 554.00 KiB/s, done.
Resolving deltas: 100% (93/93), done.
$