Introduction

忘備録。

企業内では、自社のイントラネット内の HTTPS 通信を監視するために、SSL インスペクションを導入しているところがある。
Zscaler も SSL インスペクションを提供しており、端末内に Zscalerにより署名されたサーバー証明書をインストールさせ、プロキシサーバーを経由させることで通信内容をチェックすることが可能になる。

が、この仕組みのせいか、SSL を使用した通信が上手くいかないことがある。
前提として、Zscalerにより署名されたサーバー証明書は自動なり手動なりでインストール済みで、外部への接続に問題はない。

遭遇したのが、git clonegit submodule によるリポジトリのダウンロード。

1
2
3
4
5
6
7
8
9
10
$ git submodule add https://github.com/tensorflow/models models
Cloning into '/home/t-takeuchi/docker/home/test/engine'...
remote: Enumerating objects: 86202, done.
remote: Counting objects: 100% (1801/1801), done.
remote: Compressing objects: 100% (757/757), done.
remote: Total 86202 (delta 1154), reused 1635 (delta 1025), pack-reused 84401
Receiving objects: 100% (86202/86202), 598.87 MiB | 2.29 MiB/s, done.
error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
Resolving deltas: 100% (61656/61656), done.
fatal: clone of 'https://github.com/tensorflow/models' into submodule path '/home/t-takeuchi/models' failed

このエラーの解決策として

  • git config --global http.postBuffer 524288000git config --global https.postBuffer 524288000 によってバッファを増やす
  • git config --global core.compression -1 により zlib での圧縮を有効化

等が提案されているが意味をなさない。

さらに問題をややこしくしているのが、問題が起きるのが Linux 端末のみで、最近遭遇することが増えてきた印象。
Ubuntu のみで遭遇しているが、他のディストリビューションでは試していない。

How to resolve?

遭遇している人は多く、これだと言う解決策がないが、私が試した限り、効果覿面だったのが下記。

docker 環境でもこの問題に遭遇していたため、困り果てていたのだが、本当に感謝。

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt-get install build-essential fakeroot dpkg-dev -y
sudo apt-get build-dep git -y
sudo apt-get install libcurl4-openssl-dev -y
cd ~
mkdir source-git
cd source-git/
apt-get source git
cd git-2.*.*/
sed -i -- 's/libcurl4-gnutls-dev/libcurl4-openssl-dev/' ./debian/control
sed -i -- '/TEST\s*=\s*test/d' ./debian/rules
dpkg-buildpackage -rfakeroot -b -uc -us
sudo dpkg -i ../git_*ubuntu*.deb

git をソースで取得し、ssl を有効にしてから、 dpkg-buildpackage でビルドしてインストールしている。

dockerfile で使用する場合、 cd git-2.*.* のようにワイルドカードがダメみたいなので、ここは明示的に指定する必要がある。
下記は Ubuntu のバージョン毎に取得できる git のバージョン。

Ubuntu git
16.04 2.7.4
18.04 2.17.1
20.04 2.25.1
22.04 2.34.1
24.04 2.43.0

下記は Dockerfile の一例。
最初に git もインストールしているが、後半に git をビルドする際に依存パッケージの解決が面倒なのでこうしている。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FROM ubuntu:20.04

ENV GIT_VERSION 2.25.1

RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
fakeroot \
dpkg-dev \
git
RUN sed -i '/deb-src/s/^# //' /etc/apt/sources.list && apt update
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get build-dep -y \
git
RUN apt-get update && apt-get install -y --no-install-recommends \
libcurl4-openssl-dev
WORKDIR /opt/git/source-git
RUN apt-get update && apt-get source -y \
git \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /opt/git/source-git/git-${GIT_VERSION}/
RUN sed -i -- 's/libcurl4-gnutls-dev/libcurl4-openssl-dev/' ./debian/control \
&& sed -i -- '/TEST\s*=\s*test/d' ./debian/rules \
&& dpkg-buildpackage -rfakeroot -b -uc -us \
&& dpkg -i ../git_*ubuntu*.deb

ただし、Ubuntu 23.10 以降、リポジトリソースの設定に deb822形式 が採用されたため、 sed で変更する設定の場所と書式が変わってしまったため、24.04 以降の場合は下記になる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FROM ubuntu:24.04

ENV GIT_VERSION 2.43.0

RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
fakeroot \
dpkg-dev \
git
RUN sed 's/Types: deb *$/Types: deb deb-src/' -i /etc/apt/sources.list.d/ubuntu.sources && apt update
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get build-dep -y \
git
RUN apt-get update && apt-get install -y --no-install-recommends \
libcurl4-openssl-dev
WORKDIR /opt/git/source-git
RUN apt-get update && apt-get source -y \
git \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /opt/git/source-git/git-${GIT_VERSION}/
RUN sed -i -- 's/libcurl4-gnutls-dev/libcurl4-openssl-dev/' ./debian/control \
&& sed -i -- '/TEST\s*=\s*test/d' ./debian/rules \
&& dpkg-buildpackage -rfakeroot -b -uc -us \
&& dpkg -i ../git_*ubuntu*.deb