openssl 版本

备注:本笔记所描述的问题的前提是机器上已安装成功git且通过配置ca证书支持以https方式获取远程仓库,如果使用git时碰到这篇文章描述的问题,那么按那篇文章给出的办法解决即可。

最近从github clone repo时,git clone命令报错如下(以vim代码补全插件youcompleteme为例):

[plain]view plaincopy

$ git clone https://github.com/Valloric/YouCompleteMe.git

Cloning into 'YouCompleteMe'...

fatal: unable to access 'https://github.com/Valloric/YouCompleteMe.git/': error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

由于git底层是用本机安装的curl去fetch远程repo的,所以我们可以打开curl调试选项查看具体的错误:

[plain]view plaincopy

$ export GIT_CURL_VERBOSE=1

$ git clone https://github.com/Valloric/YouCompleteMe.git

Cloning into 'YouCompleteMe'...

* Couldn't find host github.com in the .netrc file, using defaults

* About to connect() to github.com port 443

*   Trying 192.30.252.129... * connected

* Connected to github.com (192.30.252.129) port 443

* successfully set certificate verify locations:

*   CAfile: /home/slvher/tools/https-ca/github-ca/ca-bundle.crt

CApath: none

* error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

* Closing connection #0

fatal: unable to access 'https://github.com/Valloric/YouCompleteMe.git/': error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

从verbose输出可知,git已经借助curl成功连接上github.com,但以https方式clone remote repo时,由于本地配置的CAfile无法识别github提供的ssl认证算法,所以本次session失败退出。

从stackoverflow的这个帖子(Can not use “git pull” beacause of some error)得知,github在https的ssl认证中,采用的是sha256算法,而这个sha256算法是openssl从version 0.9.8o才引入的。

用下面的命令验证我机器(公司统一的开发环境)上openssl的版本,发现居然是0.9.7a,这个版本不支持github采用的sha256算法,真心蛋疼。。。

[python]view plaincopy

$ python -c'import ssl; print ssl.OPENSSL_VERSION'

OpenSSL0.9.7aFeb192003

既然git clone报错的原因已清楚,解决思路就明确了,可以执行下面的步骤进行修复。

1. 更新机器上的openssl库至v0.9.8o或更高版本

a. 从openssl官网下载合适的版本,例如我下载的是openssl-1.0.1j.tar.gz

b. 解压上步下载的压缩包,cd至解压目录

c. 在当前shell终端执行以下命令

[plain]view plaincopy

$ export CFLAGS="-fPIC"

$ ./config shared --openssldir=/home/slvher/tools/openssl-1.0.1j/  ## 无root权限,故由openssldir指定自定义安装路径

$ make depend

$ make all

$ make install

openssl源码编译/安装成功后,可在openssldir指定的目录下看到下面的目录结构

[plain]view plaincopy

$ ls

bin  certs  include  lib  man  misc  openssl.cnf  private

我们需要的共享库libssl.so文件在lib目录下。

备注1:更新版本时需注意曾在2014年4月爆发的针对openssl version 1.0.1的heartbleed漏洞,所以需要下载openssl ver 1.0.1g或更高版本。

备注2:这步安装openssl至非系统默认目录是由于我没有root权限,不能覆盖系统默认的openssl版本,而且冒然升级也可能影响到机器上其他用户。这也直接导致本文的解决方法还需要完成下面3个步骤。

2. 重新编译curl或替换curl依赖的openssl共享库

显然,相比于重新源码编译curl,直接替换curl依赖的libssl.so更方便,借助LD_PRELOAD即可实现目的:

[plain]view plaincopy

$ export LD_PRELOAD=/home/slvher/tools/openssl-1.0.1j/lib/libssl.so:/home/slvher/tools/openssl-1.0.1j/lib/libcrypto.so

$ python -c 'import ssl; print ssl.OPENSSL_VERSION' ## 验证是否替换成功,我机器的输出为OpenSSL 1.0.1j 15 Oct 2014,可见成功替换

3. 验证git clone是否能成功执行

[plain]view plaincopy

$ git clone https://github.com/Valloric/YouCompleteMe.git

Cloning into 'YouCompleteMe'...

remote: Counting objects: 29685, done.

remote: Compressing objects: 100% (3/3), done.

remote: Total 29685 (delta 0), reused 0 (delta 0)

Receiving objects: 100% (29685/29685), 28.81 MiB | 5.77 MiB/s, done.

Resolving deltas: 100% (9501/9501), done.

Checking connectivity... done.

至此,目的达成。世界真美妙 ^_^

4. 将替换openssl库的过程自动化

第2步通过设置环境变量LD_PRELOAD实现了更新curl依赖的libssl.so共享库版本的目的。但这个替换动作只对当前终端的session有效,当该session窗口关闭或切换到其它窗口时,执行git clone还是会出错。

将这种替换操作自动化的一个方法是在~/.bash_profile中将LD_PRELOAD设置为新版libssl.so的路径并export该变量。但这种方式可能会影响当前用户下的所有模块。

这里我借助bash的alias命令对git clone的动作做改写:

1) 打开~/.bashrc文件

2) 给git命令设置alias

[plain]view plaincopy

alias git='export LD_PRELOAD=/home/slvher/tools/openssl-1.0.1j/lib/libssl.so:/home/slvher/tools/openssl-1.0.1j/lib/libcrypto.so; git'

3) 保存退出

4) 在其他终端窗口执行source ~/.bashrc

5) 在该窗口验证git clone是否正常,可以验证,alias设置是成功的

至此,终于大功告成。

【参考资料】

1. stackoverflow:Can not use “git pull” beacause of some error

2. OpenSSL Doc:Compilation and Installation

3. wikipedia:Heartbleed

========================= EOF =========================备注:本笔记所描述的问题的前提是机器上已安装成功git且通过配置ca证书支持以https方式获取远程仓库,如果使用git时碰到这篇文章描述的问题,那么按那篇文章给出的办法解决即可。

最近从github clone repo时,git clone命令报错如下(以vim代码补全插件youcompleteme为例):

[plain]view plaincopy

$ git clone https://github.com/Valloric/YouCompleteMe.git

Cloning into 'YouCompleteMe'...

fatal: unable to access 'https://github.com/Valloric/YouCompleteMe.git/': error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

由于git底层是用本机安装的curl去fetch远程repo的,所以我们可以打开curl调试选项查看具体的错误:

[plain]view plaincopy

$ export GIT_CURL_VERBOSE=1

$ git clone https://github.com/Valloric/YouCompleteMe.git

Cloning into 'YouCompleteMe'...

* Couldn't find host github.com in the .netrc file, using defaults

* About to connect() to github.com port 443

*   Trying 192.30.252.129... * connected

* Connected to github.com (192.30.252.129) port 443

* successfully set certificate verify locations:

*   CAfile: /home/slvher/tools/https-ca/github-ca/ca-bundle.crt

CApath: none

* error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

* Closing connection #0

fatal: unable to access 'https://github.com/Valloric/YouCompleteMe.git/': error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

从verbose输出可知,git已经借助curl成功连接上github.com,但以https方式clone remote repo时,由于本地配置的CAfile无法识别github提供的ssl认证算法,所以本次session失败退出。

从stackoverflow的这个帖子(Can not use “git pull” beacause of some error)得知,github在https的ssl认证中,采用的是sha256算法,而这个sha256算法是openssl从version 0.9.8o才引入的。

用下面的命令验证我机器(公司统一的开发环境)上openssl的版本,发现居然是0.9.7a,这个版本不支持github采用的sha256算法,真心蛋疼。。。

[python]view plaincopy

$ python -c'import ssl; print ssl.OPENSSL_VERSION'

OpenSSL0.9.7aFeb192003

既然git clone报错的原因已清楚,解决思路就明确了,可以执行下面的步骤进行修复。

1. 更新机器上的openssl库至v0.9.8o或更高版本

a. 从openssl官网下载合适的版本,例如我下载的是openssl-1.0.1j.tar.gz

b. 解压上步下载的压缩包,cd至解压目录

c. 在当前shell终端执行以下命令

[plain]view plaincopy

$ export CFLAGS="-fPIC"

$ ./config shared --openssldir=/home/slvher/tools/openssl-1.0.1j/  ## 无root权限,故由openssldir指定自定义安装路径

$ make depend

$ make all

$ make install

openssl源码编译/安装成功后,可在openssldir指定的目录下看到下面的目录结构

[plain]view plaincopy

$ ls

bin  certs  include  lib  man  misc  openssl.cnf  private

我们需要的共享库libssl.so文件在lib目录下。

备注1:更新版本时需注意曾在2014年4月爆发的针对openssl version 1.0.1的heartbleed漏洞,所以需要下载openssl ver 1.0.1g或更高版本。

备注2:这步安装openssl至非系统默认目录是由于我没有root权限,不能覆盖系统默认的openssl版本,而且冒然升级也可能影响到机器上其他用户。这也直接导致本文的解决方法还需要完成下面3个步骤。

2. 重新编译curl或替换curl依赖的openssl共享库

显然,相比于重新源码编译curl,直接替换curl依赖的libssl.so更方便,借助LD_PRELOAD即可实现目的:

[plain]view plaincopy

$ export LD_PRELOAD=/home/slvher/tools/openssl-1.0.1j/lib/libssl.so:/home/slvher/tools/openssl-1.0.1j/lib/libcrypto.so

$ python -c 'import ssl; print ssl.OPENSSL_VERSION' ## 验证是否替换成功,我机器的输出为OpenSSL 1.0.1j 15 Oct 2014,可见成功替换

3. 验证git clone是否能成功执行

[plain]view plaincopy

$ git clone https://github.com/Valloric/YouCompleteMe.git

Cloning into 'YouCompleteMe'...

remote: Counting objects: 29685, done.

remote: Compressing objects: 100% (3/3), done.

remote: Total 29685 (delta 0), reused 0 (delta 0)

Receiving objects: 100% (29685/29685), 28.81 MiB | 5.77 MiB/s, done.

Resolving deltas: 100% (9501/9501), done.

Checking connectivity... done.

至此,目的达成。世界真美妙 ^_^

4. 将替换openssl库的过程自动化

第2步通过设置环境变量LD_PRELOAD实现了更新curl依赖的libssl.so共享库版本的目的。但这个替换动作只对当前终端的session有效,当该session窗口关闭或切换到其它窗口时,执行git clone还是会出错。

将这种替换操作自动化的一个方法是在~/.bash_profile中将LD_PRELOAD设置为新版libssl.so的路径并export该变量。但这种方式可能会影响当前用户下的所有模块。

这里我借助bash的alias命令对git clone的动作做改写:

1) 打开~/.bashrc文件

2) 给git命令设置alias

[plain]view plaincopy

alias git='export LD_PRELOAD=/home/slvher/tools/openssl-1.0.1j/lib/libssl.so:/home/slvher/tools/openssl-1.0.1j/lib/libcrypto.so; git'

3) 保存退出

4) 在其他终端窗口执行source ~/.bashrc

5) 在该窗口验证git clone是否正常,可以验证,alias设置是成功的

至此,终于大功告成。

【参考资料】

1. stackoverflow:Can not use “git pull” beacause of some error

2. OpenSSL Doc:Compilation and Installation

3. wikipedia:Heartbleed

========================= EOF =========================

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • 一、为什么要升级openSSL? 因为当前的版本太低的话有安全漏洞啊。 二、升级openSSL 首先,你可以查看你...
    阿敏其人阅读 16,626评论 1 0
  • 有次在使用Python(使用自带的urllib2库)去调用一个HTTPS的API时一直报错error 54, 'C...
    猴子精h阅读 5,754评论 1 1
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,385评论 2 44
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 企业发展的过程中,就会在摸索中探索,寻找生存的机遇 这样的企业就会出现一群与众不同的团队,这种团队同样在未来也会与...
    阳光创客敖伟伟阅读 118评论 0 0