使用nghttpx 架设 http/2 代理

在搜索web vpn时搜到SPDY实现然后才搜到更新版本的基于nghttpx的HTTP/2代理实现,这个实现的一个显著特点就是在chrome firefox最新版本无需借助第三方客户端。

这篇文档定义为安装向导,基于pki证书认证太过专业还是别乱说为妙,记录一下避免以后遗忘。

安装环境为Debian8系统

1,安装编绎nghttpx必要的包
sudo apt-get install g++ make binutils autoconf automake autotools-dev libtool pkg-config \
zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev \
libjemalloc-dev cython python3-dev python-setuptools

2,获得安装包
cd /tmp
wget https://github.com/tatsuhiro-t/nghttp2/releases/download/v1.4.0/nghttp2-1.4.0.tar.gz
tar zvfx nghttp2-1.4.0.tar.gz
cd nghttp2-1.4.0
./configure
make

3,最小配置文件 nghttpx.conf
frontend=0.0.0.0,443
backend=127.0.0.1,8123
private-key-file=/path/to/nghttpx.key
certificate-file=/path/to/nghttpx.cer
http2-proxy=yes

4,生成相应证书

#生成CA私钥
openssl genrsa -des3 -out nghttpxca.key 2048 #需要输入密码对私钥加密
#备份私钥
cp nghttpxca.key nghttpxca.bak.key
#去除私钥密码
openssl rsa -in nghttpxca.key -out nghttpxca.key.unsecure
mv nghttpxca.key.unsecure nghttpxca.key
#生成CA证书
openssl req -new -x509 -days 3650 -key nghttpxca.key -out nghttpxca.cer -subj “/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 EV SSL CA – G3”

#生成服务器端证书,注意 CN 要替换成服务器对应的IP(111.111.111.111)或者域名。
openssl genrsa -out nghttpx.key 2048
openssl req -new -key nghttpx.key -out nghttpx.csr -subj “/C=US/ST=California/L=Mountain View/O=Symantec Corporation/OU=Corp Mktg & Comms – Online Exp/CN=111.111.111.111/SN=2158113”

#对服务器证书签名
openssl x509 -req -in nghttpx.csr -CA nghttpxca.cer -CAkey nghttpxca.key -CAcreateserial -out nghttpx.cer

#生成客户端证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj “/C=US/ST=California/L=Mountain View/O=Symantec Corporation/OU=Corp Mktg & Comms – Online Exp/CN=www.symantec.com/SN=2158113”

#对客户端证书签名
openssl x509 -req -in client.csr -CA nghttpxca.cer -CAkey nghttpxca.key -CAcreateserial -out client.cer

#生成客户端p12格式证书
openssl pkcs12 -export -inkey client.key -in client.cer -out client.pfx

#生成dh文件
openssl gendh 2048 >>/path/to/ngdh.pem

5,测试
killall nghttpx
./nghttpx -s -D –conf=./nghttpx.conf -o -L INFO –backend-no-tls -k

windows下面导入证书
Chrome/设置/显示高级设置/HTTPS/SSL/管理证书
在 受信任的根证书颁发机构 导入nghttpxca.cer
在 个人 导入client.pfx

也可以直接双击文件导入到证书存储具体的物理存储区就可以了。

客户端调用pac文件
function FindProxyForURL(url, host) {
return “HTTPS 111.111.111.111:443”;
}

6,关于polipo设置
由于nghttpx的后端必须是 http/https 代理,在尝试了privoxy 3proxy以后又转到了polipo,不喜欢polipo的原因很简单它有缓存系统,似乎按下面的设置就不存在缓存生成

修改/etc/polipo/config
proxyAddress = “::1”
#proxyPort=8123
diskCacheRoot = “”
#socksParentProxy = “127.0.0.1:1080”
#socksProxyType = socks5

网上提供的另外一种处理
kill -USR2 $(cat /var/run/polipo.pid);
rm -rf /var/cache/polipo/*;
kill -USR2 $(cat /var/run/polipo.pid)
4,完整配置文件 nghttpx.conf
frontend=*,443
#backend-ipv6=yes
backend=*,8123
#openssl pkcs12 -in client.p12 -nodes -out client.pem
private-key-file=/path/to/nghttpx.key
certificate-file=/path/to/nghttpx.cer
#openssl gendh 2048 >>/path/to/ngdh.pem
dh-param-file=/path/to/ngdh.pem
http2-proxy=yes

#定义可使用的加密算法,去除ECDHE-RSA-AES128-GCM-SHA256会导致证书无法握手
ciphers=ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256

tls-ticket-key-cipher=aes-256-cbc
#tls-ticket-key-file=/tmp/ngkey
#dd if=/dev/zero of=/tmp/ngkey bs=80 count=1

#系统超时时间
frontend-http2-read-timeout=3m
frontend-read-timeout=1m
frontend-write-timeout=30s
stream-read-timeout=0
stream-write-timeout=0
backend-read-timeout=1m
backend-write-timeout=30s
backend-keep-alive-timeout=5m
listener-disable-timeout=0

# 使用四个 worker,请根据自己服务器的 CPU 合理调整,太小性能差,太大机器挂
workers=4
# 开启客户端 TLS 认证
verify-client=yes
verify-client-cacert=/path/to/nghttpxca.cer
# 不添加 X-Forwarded-For 头
add-x-forwarded-for=no
# 不添加 Via 头
no-via=yes
# 不查询 OCSP 服务器
no-ocsp=yes
# 指定 NPN / ALPN 的顺序
#npn-list=spdy/3.1,h2 →这一行已经不用加了,见下
# 只使用 TLS 1.2
tls-proto-list=TLSv1.2

# 开启日志功能
#accesslog-file=/tmp/ng.log
#accesslog-format=$remote_addr [$time_iso8601] “$request” $status $body_bytes_sent $alpn “$http_referer” “$http_user_agent”

问与答
1,问:如何编绎单独的nghttpx静态版本?
答:https://github.com/tatsuhiro-t/nghttp2/issues/392
——————————————————-
diff –git a/src/Makefile.am b/src/Makefile.am
index 627a944..2e5f246 100644
— a/src/Makefile.am
+++ b/src/Makefile.am
@@ -150,7 +150,8 @@ libnghttpx_a_CPPFLAGS = ${AM_CPPFLAGS}

nghttpx_SOURCES = shrpx.cc shrpx.h
nghttpx_CPPFLAGS = ${libnghttpx_a_CPPFLAGS}
-nghttpx_LDADD = libnghttpx.a ${LDADD}
+nghttpx_LDADD = libnghttpx.a ${LDADD} -ldl
+nghttpx_LDFLAGS = -all-static

if HAVE_MRUBY
libnghttpx_a_CPPFLAGS += \
——————————————————-
修改nghttp2-1.4.0/src/Makefile.am 152行处
然后
autoreconf
./configure –without-jemalloc.

2,问:如何减小nghttpx静态版本的体积?
答:编绎出来的版本竟然15MB这么大,可以通过apt-get install upx,然后用upx –best nghttpx 进行压缩,最后只有5MB大小。

3,问:如何转换p12证书?
答:openssl pkcs12 -in client.p12 -nodes -out client.pem
openssl pkcs12 -in client.p12 -out client.cer
openssl pkcs12 -in client.p12 -nodes -out client.key
openssl pkcs12 -export -out Cert.p12 -in client.cer -inkey client.key

4,问:如何转换p12证书?

The TLS defaults for Nghttpx are:

Protocol version: TLSv1.2, TLSv1.1
The default cipher suites are:
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:
ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:
kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:
ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:
ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:
DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:
!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK

https://github.com/tatsuhiro-t/nghttp2/blob/90bcdb0dda83212ac83f2dbd4abfdf90926ce3cb/src/ssl.cc#L42-L50
https://wiki.mozilla.org/Security/Server_Side_TLS
参考文档
使用 nghttpx 搭建 HTTP/2 代理
https://wzyboy.im/post/1052.html

https://github.com/tatsuhiro-t/nghttp2

* 2015年11月05日星期四
– 生成文档

About: dato


发表评论

邮箱地址不会被公开。 必填项已用*标注