debian update openssl 1.1.1 Nginx 1.15 开启 Tls 1.3

最近看见Tls 1.3 标准定稿发布了正式版本,就试着自己动手搞搞实验

环境是瓦工的 debian 9

网上google了一圈后下面搬砖记录一下升级过程

安装openssl

# tar -zxvf openssl-1.1.1-pre8.tar.gz
# cd openssl-1.1.1-pre8

#指定安装目录、配置文件目录
# ./config shared zlib --prefix=/usr/local/openssl-1.1.1-pre8 --openssldir=/usr/local/openssl-1.1.1-pre8/ssl

#显示安装信息
# perl configdata.pm --dump

# make
# make test 
# make install

备份并添加新的符号链接

# mv /usr/bin/openssl /usr/bin/openssl.20180814
# ln -s /usr/local/openssl-1.1.1-pre8/bin/openssl openssl

查看版本 时应该会有 libssl.so.1.1 => not found libcrypto.so.1.1 => not found 2个动态链接库 找不到

openssl version -a
  1. 关联新的库文件
# cd /etc/ld.so.conf.d/
# vi openssl-1.1.1-pre8.conf
/usr/local/openssl-1.1.1-pre8/lib

刷新上面的配置

ldconfig -v

这时 openssl version -a  已经能正常显示了

接着 升级 Nginx 并编译开启 tls1.3

$ wget http://nginx.org/download/nginx-1.15.2.tar.gz
$ tar zxvf nginx-1.15.2.tar.gz
$ cd nginx-1.15.2

OpenSSL 打补丁

cd openssl-1.1.1-pre8
wget https://raw.githubusercontent.com/hakasenyang/openssl-patch/master/openssl-equal-pre8_ciphers.patch

patch -p1 < openssl-equal-pre8_ciphers.patch

接着进入 nginx-1.15.2 目录 配置 编译参数

./configure --with-openssl=/root/openssl-1.1.1-pre8 --with-openssl-opt=enable-tls1_3 --with-http_v2_module --with-http_ssl_module

make 编译

先备份旧版Nginx。

$ mv /path/to/nginx/sbin/nginx /path/to/nginx/sbin/nginx.old

再把编译好的版本拷过去。

$cp objs/nginx /path/to/nginx/sbin/

然后编辑Nginx配置文件。在  nginx.conf 也可以加载站点的.conf上

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256 :EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:!3DES:!MD5;


重启Nginx

/etc/init.d/nginx restart

/etc/init.d/nginx reload

最后chrome 开启TLS 1.3 draft28支持

chrome://flags/#tls13-variant

这里我的chrome 68 默认协商并匹配不到 TLS 1.3 draft28

开启 draft28 支持后访问 Nginx 网站已经走了TLS 1.3

Debian9 搭建ngrok服务器

Debian9 搭建ngrok服务器

准备工作

  • 一台vps 这里使用了 gcp debian9
  • 一个泛解析的域名(在阿里上买了个 .xyz 6-9数字域名 65rmb 10年)

安装 GO环境 和 Git

网上 很多 这里先省略配置记录了

安装Ngrok

下载源码

mkdir ~/go/src/github.com/inconshreveable
cd ~/go/src/github.com/inconshreveable
git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=~/go/src/github.com/inconshreveable/ngrok
cd ngrok

编译ngrokd

  • 编译服务器端

$ make release-server

  • 编译客户端
$ GOOS=linux GOARCH=amd64 make release-client
$ GOOS=windows GOARCH=amd64 make release-client
$ GOOS=linux GOARCH=arm make release-client

使用 Systemd 编写启动服务

在 /lib/systemd/system 目录下新建 ngrokd.service 文件

/lib/systemd/system/ngrokd.service

文件内容

[Unit]
Description=ngrok
After=network.target

[Service]
ExecStart=/usr/local/src/ngrok/bin/ngrokd  
-tlsKey=/usr/local/src/ngrok/assets/server/tls/*.123456.xyz.key 
-tlsCrt=/usr/local/src/ngrok/assets/server/tls/*.123456.xyz.crt 
-domain="ngrok.123456.xyz"
-httpAddr=":80" 
-httpsAddr=":443" 
-tunnelAddr=":4000"

[Install]
WantedBy=multi-user.target

主要是 ExecStart 命令中的启动 参数
tlsKey tlsCrt 分别是 下面使用 Let’s Encrypt 申请的 泛域名证书
domain 服务主域名
httpAddr httpsAddr tunnelAddr 服务端口 和 传输端口

获得单元文件后,即可测试该服务:

sudo systemctl start ngrokd
检查服务的状态:

sudo systemctl status ngrokd

win客户端

复制 服务器上 编译的 ngrok.exe 到客户端文件夹中,新建一个客户端配置ngrok.cfg

server_addr: ngrok.123456.xyz:4000
trust_host_root_certs: true

在 cmd 中 输入命令 启动 客户端

http
ngrok.exe -subdomain demo -config=ngrok.cfg -log=log.txt   -proto=http 8080

https
ngrok.exe -subdomain demo -config=ngrok.cfg -log=log.txt   -proto=https 8080

tcp
ngrok.exe -subdomain demo -config=ngrok.cfg -log=log.txt   -proto=tcp 8080

然后会在黑屏中 显示相关连接信息

如果 我们本地内网 有一个 8080 端口的web 服务
当我们输入 https://demo.ngrok.123456.xyz 这个网址就会穿透到我们 本地 8080 服务上

在阿里云配置域名解析

我们这里
* ngrok.123456.xyz 配置了条a 记录 对应 gcp vps ip
* *.ngrok.123456.xyz 配置了条CNAME 指向上面的 ngrok.123456.xyz 域名

为 ngrok 申请一个 泛解析域名

  • 使用 acme.sh 申请 Let’s Encrypt 免费泛域名证书
  • 配置 acme dns 插件 ali dns api 接口方式 申请证书

在阿里云 后台 配置一个 有完全dns解析 接口权限的 用户并获取
1. export Ali_Key=”xxxxxxxxx”
2. export Ali_Secret=”xxxxxxxxxxx”

wget -O – https://get.acme.sh | sh

更新脚本

acme.sh –upgrade –auto-upgrade

申请证书

./acme.sh –issue –dns dns_ali -d *.123456.xyz -d *.ngrok.123456.xyz

脚本里面的 阿里dns 插件会 通过api 在阿里dns 解析记录里面天机2条 TXT 的记录
等待 120秒 等待 解析记录生效后 会签发类似 下面4条证书记录

-----END CERTIFICATE-----
[Tue Jan 22 03:26:59 UTC 2019] Your cert is in  /root/.acme.sh/*.123456.xyz/*.123456.xyz.cer 
[Tue Jan 22 03:26:59 UTC 2019] Your cert key is in  /root/.acme.sh/*.123456.xyz/*.123456.xyz.key 
[Tue Jan 22 03:26:59 UTC 2019] The intermediate CA cert is in  /root/.acme.sh/*.123456.xyz/ca.cer 
[Tue Jan 22 03:26:59 UTC 2019] And the full chain certs is there:  /root/.acme.sh/*.123456.xyz/fullchain.cer

安装证书 到 ngrok 目录

./acme.sh --install-cert -d *.123456.xyz  /
--cert-file /usr/local/src/ngrok/assets/server/tls/*.123456.xyz.crt /
--key-file  /usr/local/src/ngrok/assets/server/tls/*.123456.xyz.key /
--fullchain-file /usr/local/src/ngrok/assets/client/tls/*.123456.xyz.crt \

参考文章

VPS自搭建Ngrok内网穿透服务

CentOS7搭建ngrok服务器

acme.sh

Linux 下使用 acme.sh 配置 Let’s Encrypt 免费 SSL 证书 + 通配符证书

使用systemd在Boot上启动Linux服务

内网穿透 ngrok 服务器和客户端配置