关注小众语言,记录、分享技术点滴!

0%

import MySQLdb的时候报错“ImportError: libmysqlclient.so.20: cannot open shared object file: No such file or directory”

解决方法:
找到libmysqlclient.so.20,一般都在mysql安装目录/lib库里,做个软链接即可。

######64为系统

1
ln -s /usr/local/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20

######32位系统

1
ln -s /usr/local/mysql/lib/libmysqlclient.so.20 /usr/lib/libmysqlclient.so.20

https是一种超文本传输安全协议,主要是用SSL/TLS来加密数据包,以达到数据加密传输的作用,同时也能一定程度达到防劫持的效果。

隐藏不必要的信息
细心的朋友会发现,请求响应头,有这么一行 server: nginx,说明我用的是 Nginx 服务器,但并没有具体的版本号。由于某些 Nginx 漏洞只存在于特定的版本,隐藏版本号可以提高安全性。这只需要在配置里加上这个就可以了:

server_tokens off;

另外,一些 WEB 语言或框架默认输出的 x-powered-by 也会泄露网站信息,他们一般都提供了修改或移除的方法,可以自行查看手册。如果部署上用到了 Nginx 的反向代理,也可以通过 proxy_hide_header 指令隐藏它:

proxy_hide_header X-Powered-By;

禁用非必要的方法
一般情况下,只需要处理 GET、POST 两种请求方法,而 HTTP/1 协议还规定了 TRACE 这样的方法用于网络诊断,这也可能会暴露一些信息。所以我针对 GET、POST 以及 HEAD 之外的请求,直接返回了 444 状态码(444 是 Nginx 定义的响应状态码,会立即断开连接,没有响应正文)。具体配置是这样的:

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}

合理配置响应头

#####减少点击劫持
add_header X-Frame-Options DENY;

#####禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;

#####防XSS攻击
add_header X-XSS-Protection “1; mode=block”;

#####HSTS策略
add_header Strict-Transport-Security “max-age=31536000; includeSubDomains; preload” always;

X-Frame-Options 用来指定此网页是否允许被 iframe 嵌套,deny 就是不允许任何嵌套发生。这部分内容更多信息
X-Content-Type-Options 用来指定浏览器对未指定或错误指定 Content-Type 资源真正类型的猜测行为,nosniff 表示不允许任何猜测。这部分内容更多信息
X-XSS-Protection 这个响应头是用来防范XSS的。最早我是在介绍IE8的文章里看到这个,现在主流浏览器都支持,并且默认都开启了XSS保护,用这个header可以关闭它。它有几种配置:
0:禁用XSS保护;
1:启用XSS保护;
1; mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换);
浏览器提供的XSS保护机制并不完美,但是开启后仍然可以提升攻击难度,总之没有特别的理由,不要关闭它。
Strict-Transport-Security(简称为 HSTS)可以告诉浏览器,在指定的 max-age 内,始终通过 HTTPS 访问我的博客。即使用户自己输入 HTTP 的地址,或者点击了 HTTP 链接,浏览器也会在本地替换为 HTTPS 再发送请求。另外由于我的证书不支持多域名,我没有加上 includeSubDomains。关于 HSTS 更多信息。

HTTPS 安全配置
启用 HTTPS 并正确配置了证书,意味着数据传输过程中无法被第三者解密或修改。有了 HTTPS,也得合理配置好 Web Server,才能发挥最大价值。关于 HTTPS 这一块有以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
worker_processes auto;

http {

#配置会话超时时间
ssl_session_timeout 10m;

#配置共享会话缓存大小,视站点访问情况设定
ssl_session_cache shared:SSL:10m;

server {
listen 443 ssl;
server_name www.example.com;

#设置长连接
keepalive_timeout 70;

#开启HTTPS协议(推荐使用listen指令的ssl参数来代替这个指令)
#ssl on;

#证书文件
ssl_certificate www.example.com.crt;

#私钥文件
ssl_certificate_key www.example.com.key;

#使用DH文件
ssl_dhparam /etc/ssl/certs/dhparam.pem;

#版本选择
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

#定义算法
ssl_ciphers EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

#优先采取服务器算法
ssl_prefer_server_ciphers on;

#减少点击劫持
add_header X-Frame-Options DENY;

#禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;

#防XSS攻击
add_header X-XSS-Protection "1; mode=block";

#HSTS策略
add_header Strict-Transport-Security "max-age=31536000;" always;
}
}

最终效果在 ssllabs 中测试结果如下。

如何配置 ssl_ciphers 可以参考这个网站。需要注意的是,这个网站默认提供的加密方式安全性较高,一些低版本客户端并不支持,例如 IE9-、Android2.2- 和 Java6-。如果需要支持这些老旧的客户端,需要点一下网站上的「Yes, give me a ciphersuite that works with legacy / old software」链接,同时也可以使用 Mozilla 基金会 来生成配置。

另外 ssl_ciphers 还支持 CHACHA20 加密套件,只要 Nginx 编译时增加了 CHACHA20_POLY1305 加密算法即可,这是由 Google 开发的新一代加密方式,它有两方面优势:更好的安全性和更好的性能(尤其是在移动和可穿戴设备上)。下面有一张移动平台上它与 AES-GCM 的加密速度对比图(via):

启用 CHACHA20_POLY1305 最简单的方法是在编译 Nginx 时,使用 LibreSSL 代替 OpenSSL。用 Chrome 访问网站时,点击地址栏小锁显示的信息,可以看到加密方式使用的是不是 CHACHA20_POLY1305。
关于 CHACHA20_POLY1305 安全性和性能的详细介绍可以查看本文

补充:
1.使用 CHACHA20_POLY1305 的最佳实践是「仅针对不支持 AES-NI 的终端使用 CHACHA20 算法,否则使用 AES-GCM」。

2.我们通过 openssl 工具看一下 ssl_ciphers 具体包含哪些 Cipher Suites 例如:

1
2
3
4
5
6
7
8
openssl ciphers -V 'EECDH+AES128' | column -t

0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256
0xC0,0x13 - ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1
0xC0,0x09 - ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1

加强 HTTPS 安全性
HTTPS 基础配置采取的默认加密算法是 SHA-1,这个算法非常脆弱,安全性在逐年降低,在 2014 年的时候, Google 官方博客就宣布在 Chrome 浏览器中逐渐降低 SHA-1 证书的安全指示,会从 2015 年起使用 SHA-2 签名的证书,可参阅 Rabbit_Run 在 2014 年发表的文章:《为什么Google急着杀死加密算法SHA-1》

为此,主流的 HTTPS 配置方案应该避免 SHA-1,可以使用 迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)方案。

首先在目录 /etc/ssl/certs 运行以下代码生成 dhparam.pem 文件:

1
openssl dhparam -out dhparam.pem 2048

关于 ssl_dhparam 的配置,可以参考这篇文章:Guide to Deploying Diffie-Hellman for TLS

SSLv3 已被证实不安全,所以在 ssl_protocols 指令中,我并没有包含它。
将 ssl_prefer_server_ciphers 配置为 on,可以确保在 TLSv1 握手时,使用服务端的配置项,以增强安全性。

有人说今年(2018年)是区块链技术元年,作为一种新兴的技术,它不仅弯道超车盖过了人工智能、大数据的风头,而且发展速度更是一日千里。各大厂商都相继推出区块链服务,你可能觉得难以置信。不管你信不信,当你还在熟睡时,有一群人还在挑灯夜战。

在周未闲来无事,虽然之前网上也有各版本的区块链代码,还是动手用golang写了一下,简单实现了区块链的原型。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main

import (
"crypto/sha256"
"encoding/json"
"fmt"
)

//Block 结构
type Block struct {
Index int
Timestamp string
Data string
PreviousHash string
Hash string
}

//CalculateHash 计算HASH
func (b *Block) CalculateHash() string {
s := fmt.Sprintf("%d%s%s%s", b.Index, b.PreviousHash, b.Timestamp, b.Data)
sum := sha256.Sum256([]byte(s))
return fmt.Sprintf("%x", sum)
}

//BlockChain 结构
type BlockChain struct {
Chain []*Block
}

//NewBlockChain 创建区块链
func NewBlockChain() *BlockChain {
bc := &BlockChain{}
bc.Chain = append(bc.Chain, bc.CreateGenesisBlock())
return bc
}

//CreateGenesisBlock 创建创世块
func (bc *BlockChain) CreateGenesisBlock() *Block {
b := &Block{
Index: 0,
Timestamp: "2018-01-01",
Data: "Genesis Block",
PreviousHash: "0",
}
b.Hash = b.CalculateHash()
return b
}

//GetLatestBlock 最新区块
func (bc *BlockChain) GetLatestBlock() *Block {
return bc.Chain[len(bc.Chain)-1]
}

//AddBlock 增加区块
func (bc *BlockChain) AddBlock(newBlock *Block) {
newBlock.Index = bc.GetLatestBlock().Index + 1
newBlock.PreviousHash = bc.GetLatestBlock().Hash
newBlock.Hash = newBlock.CalculateHash()
bc.Chain = append(bc.Chain, newBlock)
}

//IsChainValid 区块是否有效
func (bc *BlockChain) IsChainValid() bool {
for i := 1; i < len(bc.Chain); i++ {
currentBlock := bc.Chain[i]
previousBlock := bc.Chain[i-1]

if currentBlock.Hash != currentBlock.CalculateHash() {
return false
}

if currentBlock.PreviousHash != previousBlock.Hash {
return false
}
}
return true
}

func main() {
bc := NewBlockChain()
bc.AddBlock(&Block{Timestamp: "2018-02-01", Data: `{"amout":10}`})
bc.AddBlock(&Block{Timestamp: "2018-03-01", Data: `{"amout":20}`})
bc.AddBlock(&Block{Timestamp: "2018-04-01", Data: `{"amout":30}`})

blockchain, _ := json.MarshalIndent(bc, "", "\t")
fmt.Println(string(blockchain))

fmt.Println("is BlockChain valid ", bc.IsChainValid())
}

一、安装Rust
1、如果你之前使用了一个有Windows下GUI安装向导的.msi文件安装了Rust,请到控制面板->程序与功能(添加/删除程序)里卸载。

2、设置安装路径。默认它会把Rust装到你的/.rustup 里,依赖库下载到/.cargo 里。需要修改的话,设置环境变量RUSTUP_HOME 和 CARGO_HOME 分别修改这两个值(例如D:.rustup和D:.cargo)。

1
2
RUSTUP_HOME=D:\.rustup
CARGO_HOME=D:\.cargo

4、配置代理#1:国内有些地区访问Rustup的服务器不太顺畅,可以配置中科大的Rustup镜像:设置环境变量

1
2
RUSTUP_DIST_SERVER=http://mirrors.ustc.edu.cn/rust-static
RUSTUP_UPDATE_ROOT=http://mirrors.ustc.edu.cn/rust-static/rustup

安装过程中出现以下选项
Proceed with installation (default)
Customize installation
Cancel installation
选(Customize installation)进行自定义安装 会一步一步问你
1)个问你是否用 default host tripe 我选的是 x86_64-pc-windows-gnu(https://github.com/rust-lang-nursery/rustup.rs/#other-installation-methods) 下面有一大堆版本可以选。
假设你是Windows环境,打算编译64位程序,你应该用的是:

x86_64-pc-windows-msvc

x86_64-pc-windows-gnu

这两个各有优缺点:
x86_64-pc-windows-msvc是基于微软的链接器的,稳定性比较好,缺点是依赖的第三方库比较难弄,而且安装时你还需要再装一个微软的Visual C++ Build Tools(含Windows SDK;如果你机器上有Visual Studio就不用装Build Tools了);到这里去下载 http://landinghub.visualstudio.com/visual-cpp-build-tools ,装2015的。(2017的用起来会有点麻烦,Rust团队会在2017年8月解决。如果你看到这篇文章晚于那个时候了,装2017也可以)
x86_64-pc-windows-gnu是基于gnu开发工具的windows移植版本的,潜在的bug会多一些,但是第三方库反而容易弄(MSYS2的问题回头再说)
如果需要的话,可以两个都装的,这里你选一个版本就好。
2)个会问你 用哪个版本(stable/beta/nightly/none)我输入 stable
3)个会问你是否 默认修改环境变量 (这个无所谓了可以后期改) 我选是

5、在. cargo 文件夹根目录下创建一个 config 文件 没有任何文件后缀, 内容为:

[registry]
index = “https://mirrors.ustc.edu.cn/crates.io-index/"
[source.crates-io]
registry = “https://github.com/rust-lang/crates.io-index"
replace-with = ‘ustc’
[source.ustc]
registry = “https://mirrors.ustc.edu.cn/crates.io-index/"

6、将 cargo 加入 path 环境变量:

%CARGO_HOME%\bin

前期工作就可以了 那么打开 cmd 输入
检查 rustup 有无安装成功

1
2
rustup -v
cargo -v

二、安装工具链
因为RLS必须使用nightly版本,所以需要同时安装以下两个工具链

stable-x86_64-pc-windows-gnu
nightly-x86_64-pc-windows-gnu

三、安装相关工具

1
2
3
cargo install rustfmt
cargo install rustsym
cargo install racer

四、项目管理
Rust中一般使用cargo管理项目,比如:
创建项目

cargo new hellorust --bin

编译项目

cargo build --release

运行项目

cargo run --release

清理项目

cargo clean

五、给vscode安装rust插件
1、打开vscode,然后按CRTL+P打开面板,然后安装以下两个插件

ext install vscode-rust
ext install rust

然后按提示进行安装即可

2、vscode-rust安装过程中,提示如下错误(没有报错略过)
toolchain ‘nightly-x86_64-pc-windows-gnu’ does not contain component ‘rls’ for target ‘x86_64-pc-windows-gnu’
需要添加rustup的工具链如下,打开cmd工具输入以下命令

rustup component add rls-preview –toolchain nightly

3、设置vscode其中toolchain必须为nightly版本

1
2
3
4
5
6
7
8
"rust.mode": "rls",
"rust.rls": {
"useRustfmt": true
},
"rust.rustup": {
"toolchain": "nightly-x86_64-pc-windows-gnu",
"nightlyToolchain": "nightly-x86_64-pc-windows-gnu"
}

一般情况下,go build 可以直接编译程序,无需额外的参数设定。
但在编译生产环境下使用的可执行程序时候,go build 的一些参数还是很有用的。

减小编译后可执行程序的大小

1
go build -ldflags '-w -s'

说明:
-w 禁止生成debug信息,注意使用该选项后,无法使用 gdb 进行调试
-s 禁用符号表
可以使用 go tool link –help 查看 ldflags 各参数含义

禁止gc优化和内联

1
go build -gcflags '-N -l'

说明:
-N 禁止编译优化
-l 禁止内联,禁止内联也可以一定程度上减小可执行程序大小
可以使用 go tool compile –help 查看 gcflags 各参数含义

由于限制问题,国内使用 go get 安装 golang 官方包可能会失败,如我自己在安装golint时,出现了以下报错:

1
2
3
$ go get -u -v golang.org/x/lint/golint
Fetching https://golang.org/x/lint/golint?go-get=1
https fetch failed: Get https://golang.org/x/lint/golint?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

不翻墙的情况下怎么解决这个问题?其实 golang 在 github 上建立了一个镜像库,如 https://github.com/golang/lint 即是 https://golang.org/x/lint 的镜像库
获取 golang.org/x/lint 包,其实只需要以下步骤:

1
2
3
4
5
6
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/lint.git

#执行go install
go install golang.org/x/lint/golint

ps
go get实际是从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。所以上面的步骤需要手动go install一下代码包。
go get常用的辅助参数。

-insecure 允许非安全下载,主要是针对没有HTTPS的HTTP路径。
-u 这个很常见,有更新的话会覆盖本地的package,默认不会覆盖的。
-v 显示Log,即verbose.
-t 同时下载需要运行测试的package.
-d 只下载,但不安装package.

  1. 下载并安装 Visual Studio Code
    微软官网:https://code.visualstudio.com/
    插件库:https://marketplace.visualstudio.com/#VSCode

  2. 在Windows 10环境下安装PHP

  3. 1 下载自己中意的PHP版本(我选的是php-7.2.0-Win32-VC15-x64):
    PHP官网:http://windows.php.net/download

2.2 将php-7.2.0-Win32-VC15-x64.zip 解压到D盘根目录(注:也可以解压到C盘),并将php-7.2.0-Win32-VC15-x64文件夹重命名为php,最终php路径如下(注意这个很关键,会影响到后面PHP_CodeSniffer组件的安装):

D:\php\

2.3 设置环境变量,允许执行PHP
打开高级系统设置(Win+R,然后输入sysdm.cpl打开即可进入,找到Path环境变量,把”D:\php”这个路径加到里面)

2.4 检查PHP环境是否正常(Win+R,然后输入CMD运行,然后执行php -h命令)如下

php -h

2.5 重命名 php.ini ,在php根目录会找到以下两个文件:
php.ini-development 开发测试用
php.ini-production 安全性高,适合线上

这里我选择将php.ini-production重命名为php.ini

  1. 安装pear库(您也可以另外用composer库,直接看第4步)
  2. 1 下载http://pear.php.net/go-pear.phar
  3. 2 复制go-pear.phar文件到C:\php目录
  4. 3 继续运行CMD然后确保已经cd到了C:\php>,执行以下命令

D:\php>php go-pear.phar

遇到:
Are you installing a system-wide PEAR or a local copy?
(system|local) [system] :
输入local继续(什么都不输直接回车,那么表示默认选择system,但这可能存在权限问题而终止)
后面就是yes,Y,回车,一步步按提示进行下去。

3.4 检查php.ini里面已经配置好,结尾会看到:

include_path=".;D:\php\pear"

(如果是PHP7可能默认已经做了路径指向,因此pear装完后不会有这句代码)

3.5 CMD里面执行pear,如果返回相应内容即表示pear安装成功:

  1. 安装PHPcs
    以下是最关键一步,运行CMD,执行以下命令:
    1
    2
    3
    4
    5
    6
    7
    8
    D:\php>pear install PHP_CodeSniffer
    WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-upd
    ate pear.php.net" to update
    downloading PHP_CodeSniffer-2.0.0.tgz ...
    Starting to download PHP_CodeSniffer-2.0.0.tgz (448,559 bytes)
    ................................................................................
    ..........done: 448,559 bytes
    ERROR: failed to mkdir C:\php\pear\tests\PHP_CodeSniffer\CodeSniffer\Core\File
    如果出现以下错误:
    ERROR: failed to mkdir C:\php\pear\tests\PHP_CodeSniffer\CodeSniffer\Core\File

需要设置如下配置,以管理员身份支行cmd分别输入以下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
D:\php>pear config-set php_dir D:\php\pear
config-set succeeded

D:\php>pear config-set doc_dir D:\php\pear
config-set succeeded

D:\php>pear config-set cfg_dir D:\php\pear
config-set succeeded

D:\php>pear config-set data_dir D:\php\pear
config-set succeeded

D:\php>pear config-set test_dir D:\php\pear
config-set succeeded

D:\php>pear config-set www_dir D:\php\pear
config-set succeeded

D:\php>pear install PHP_CodeSniffer
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-upd
ate pear.php.net" to update
downloading PHP_CodeSniffer-2.0.0.tgz ...
Starting to download PHP_CodeSniffer-2.0.0.tgz (448,559 bytes)
.............................done: 448,559 bytes
install ok: channel://pear.php.net/PHP_CodeSniffer-2.0.0
  1. 安装PHP CodeSniffer for Visual Studio Code插件(英文介绍)
  2. 1 打开 Visual Studio Code;
  3. 2 在Windows下面按快捷键 Ctrl+P 或者 Mac下面 Cmd+P 来快捷打开对话框;
  4. 3 键入 ext install phpcs 找到插件:
  5. 4 直接回车或者点那个云图标来下载和安装此插件;
  6. 5 重启 Visual Studio Code 就可以享用此强大IDE了。

我们并不需要升级系统自带的 openssl,因为随便升级 openssl 会带来安全风险。我们只下载 openssl 1.0.2 源码包,借助它来重新编译(相当于重新安装)服务器上的 NginX 即可。一旦成了 built with OpenSSL 1.0.2,就意味着能够支持 http/2 了。

1、下载并解压 OpenSSL

1
2
3
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
tar -zxf openssl-1.0.2-latest.tar.gz

2、修改编译参数

#####指定opensll包位置
--with-openssl=/usr/local/src/openssl-1.0.2m

#####开启ssl模块
--with-http_ssl_module

#####开启http/2模块
--with-http_v2_module

#####编译报错是“collect2: ld returned 1 exit status”需要指定pcre8.36及以上版本
--with-pcre=/usr/local/src/pcre-8.40

3、开启ssl 修改配置

1
2
3
4
5
server {
listen 443 ssl;
server_name localhost;
....
}

4、开启http/2 修改配置

1
2
3
4
5
server {
listen 443 ssl http2;
server_name localhost;
....
}

附:
pcre下载:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

CentOS 6.x(7.x) 的 OpenSSL 软件版本实在是低,2017 年了还在用人家 2013 年的版本,而且 1.0.1 版本对 ALPN 不支持,已经没法跟上大环境的节奏了
可以看一下默认自带的版本

1
2
$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

所以我们有必要升级 OpenSSL 到 1.0.2 版本
以下所有操作均需在 root 用户下进行
1、安装必要软件

1
yum install gcc gcc-c++ autoconf automake zlib zlib-devel pcre-devel

2、下载并解压 OpenSSL

1
2
3
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
tar -zxf openssl-1.0.2-latest.tar.gz

3、编译安装 OpenSSL

1
2
3
cd openssl-1.0.2*
./config
make && make install

4、移除旧版本 OpenSSL

1
2
mv /usr/bin/openssl /tmp/
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

好了,大功告成,查看一下现在的版本

1
2
$ openssl version
OpenSSL 1.0.2m 26 Jan 2017

今天在git push origin master时,竟然出现了错误 (gnome-ssh-askpass:32737): Gtk-WARNING : cannot open display: error: unable to read askpass response from ‘/usr/libexec/openssh/gnome-ssh-askpass’根本原因是执行了该脚本

1
2
$ cat /etc/profile.d/gnome-ssh-askpass.sh
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass

解决方式

1
$ unset SSH_ASKPASS

再次执行git

1
$ git push origin master

不再提示错误。