最近一台服务器上执行更新的时候,突然发现之前好好的git突然不能用了,git clone和pull等操作会报错。
命令行下执行命令时候会报错:
error: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version while accessing
fatal: unable to access: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
在gitlab qq群中也常有吃瓜群众抱怨为啥git用不了,报错了。

典型截图(TortoiseGit小乌龟的报错):

目前https 用的SSL版本主要包括SSL1~3,以及TSL1.0~1.2,除了最新的TSL1.2以外,其它老的版本都基本上存在安全隐患。为此各大公司纷纷把线上环境的协议都升级为TSL 1.2了,1.3的协议也在起草中,估计马上会出来。
说到这就的吐槽一下freebuf了,好歹一个最大安全平台把,自己本身还不是全站https,带了个不好的头。不知道兄弟们遇到过,访问freebuf被帮忙领支付宝红包事情么?真是很体贴的。freebuf安全和运维同学要加紧哦

大红字的不安全可很刺眼哦。
一些公司会对老的版本提示为不安全版本(比如firfox,chrome等浏览器),而且有些公司做的更绝一点。比如Github就宣布从2018 年2月1日对老版本的SSL协议不再支持。github的公告见:

同时基于SSH协议的版本也不不再支持:
diffie-hellman-group1-sha1,diffie-hellman-group14-sha1。所以老版本的git,ssh客户端(仅仅支持sha1哈希算法的客户端)都需要升级。
这样就出现开头我们提到的,各种问题。所以遇到这种问题,除了骂骂人外,能做的就是乖乖升级。

关于centos6,centos7等高版本的升级,可以用yum升级,升级比较容易,不在多提。本文主要说下老版本的centos 5.8等老版本os的升级,由于版本较老,需要通过源码升级。
源码升级openssl
在linux下基本上所有加密算法的应用都是基于openssl的,所以升级curl、git、openssh对算法的升级都需要先升级OpenSSL。
1、创建源码目录
我们新建一个目录src存放openSSL源码,由于OpenSSL升级可能影响很多软件,我们先不支持升级,而生成一个新版本的OpenSSL在/usr/local/ssl目录,这样不影响既有版本的其他软件。
mkdir src
cd src
2、下载openssl源码,我们用1.0.2m版本
笔者没有用最新的1.1.x版本的主要原因是,是之前升级openssh 7.6的时候,发现不兼容,所以不能用最新版本。现在不知道解决没有?没再试了。
wget https://www.openssl.org/source/ openssl-1.0.2m.tar.gz
tar -zxvf openssl-*.tar.gz
3、编译安装:
cd openssl-*
./config -fpic shared && make && make install
4、添加一个动态库路径,并执行使其生效:
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig
升级cUrl版本
不光是github还有很多网站都是仅仅支持了TLS 1.2 ,这时候curl版本为老版本的话,也是下载不了任何东西的。而且git的https操作也是要curl的库,所以我们先升级curl。
1、创建源码目录
mkdir src
cd src
2、下载curl源码
wget http://curl.haxx.se/download/curl-7.59.0.tar.gz
tar -xzvf curl*.tar.gz
3、编译并安装
cd curl*
./configure --with-ssl=/usr/local/ssl --disable-ldap
注意编译时候指定ssl类库为我们上一步的安装目录。

确保已经支持Tsl然后直接安装:
make && make install
gpg文件签名校验
下载的源码为了确保安全,要校验下文件签名(哈希指纹),curl用的gpg校验。笔者在以前的文章中也说过为了安全对任何官方文件下载后都要做文件校验,关于md5和shaX类校验过程可能大家都了解,笔者在此就不赘述。
这儿以curl源码为例子说明下gpg文件签名的校验。gpg签名不光需要源码文件的签名,还要需要发行者的公钥,两者配合才可以校验,相对复杂一点,但是更安全可靠。
1、下载源码和文件签名:

源码:
wget http://curl.haxx.se/download/ curl-7.59.0.tar.gz
文件签名
https://curl.haxx.se/download/curl-7.59.0.tar.gz.asc
2、下载gpg公钥
wget https://daniel.haxx.se/mykey.asc
3、导入公钥
gpg --import mykey.asc
4、文件校验
gpg --verify curl-7.59.0.tar.gz.asc

上面第二行中,已经说明签名玩好,校验没问题,至于下面第三行和第四行的警告,由于我们下载公钥是直接从官方下载的,没有通过证书机构认证,所以会有警告,可以忽略。
升级git
1、下载git源码,我们选择新版本2.16.2
wget https://www.kernel.org/pub/software/scm/git git-2.16.2.tar.gz
tar xzf git-2.1.2.tar.gz
2、编译安装git
make configure
./configure --prefix=/usr/local/git --with-lib=/usr/local/ssl/
make && make install
3、做下链接加入到用户环境中
echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
使得配置生效
source /etc/bashrc
4、查看git版本
git version
结果已经为最新版本,版本信息如下。
git version 2.16.2
window下客户端升级
关于window下的git客户端,window下客户端,请先升级git客户端。

设置各个git 图形客户端:
小乌龟TortoiseGit设置
设置为升级后的git for windows的路径。

Android Studio、IntelliJ IDEA和Visual Studio Code配置
配置类似的,修改新版本的git执行路径。
