某个项目在客户对接中,对JDK有要求,因与服务器的通信支持TLS1.1,且只有JDK1.7及以上版本支持TLS1.1,对于客户旧原有的系统不支持TLS1.1的JDK1.6的,存在不兼容问题。为了满足客户接入需求及不更改产品服务通信安全的前提下,引入了代理服务器作为转发节点,解决http->https的转变。从而衍生出,适应于所有接入服务中需要将http->https的转发请求的模式。
前言
本教程通过安装Nginx软件、新建Nginx需要的.crt
、.key
、.pem
格式的证书,再修改默认的Nginx的配置文件Nginx.conf
。如果已经准备好Nginx所需环境及证书,则可直接查看Nginx.conf
,具体步骤如下:
- Nginx安装
- 安装Zlib
- 安装Pcre库
- 安装Openssl
- 安装Nginx
- Nginx配置https所需证书
- Nginx.conf配置文件
- 解决http->https转化
- 解决https->http转化
Nginx安装
Nginx依赖以下模块,因此先安装一下依赖库,再最后安装Nginx:
gzip
模块需要zlib
库rewrite
模块需要pcre
库ssl
功能需要openssl
库
安装Zlib
- 获取
zlib
编译安装包,在http://www.zlib.net/
上可以获取当前最新的版本。 - 解压缩
zlib-xx.tar.gz
包。 - 进入解压缩目录,执行
./configure
。 make & make install
安装Pcre库
- 获取
pcre
编译安装包,在http://www.pcre.org/
上可以获取当前最新的版本 - 解压缩
pcre-xx.tar.gz
包。 - 进入解压缩目录,执行
./configure
。 make & make install
安装Openssl
- 获取
openssl
编译安装包,在http://www.openssl.org/source/
上可以获取当前最新的版本。 - 解压缩
openssl-xx.tar.gz
包。 - 进入解压缩目录,执行
./config
。 make & make install
安装Nginx
- 获取
Nginx,在http://nginx.org/en/download.html
上可以获取当前最新的版本。 - 解压缩
nginx-xx.tar.gz
包。 - 进入解压缩目录,执行
./configure
make & make install
若安装时找不到上述依赖模块,使用--with-openssl=<openssl_dir>、--with-pcre=<pcre_dir>、--with-zlib=<zlib_dir>
指定依赖的模块目录。如已安装过,此处的路径为安装目录;若未安装,则此路径为编译安装包路径,nginx将执行模块的默认编译安装。
./configure --with-openssl=../openssl-1.0.1t --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 –with-http_ssl_module
安装完毕后,最后的路径为:/usr/local/nginx/sbin
。
- 进入
cd /usr/local/nginx/sbin
- 启动nginx:
./nginx
- 验证nginx配置文件是否正确
./nginx -t
- 重启nginx服务
./nginx -s reload
浏览器中输入http://localhost
可以验证是否安装启动成功。
Nginx配置https所需证书
默认已经安装了Openssl,若没有请自行转换为目标格式。正常情况下,运行中心提供的通信证书为pfx
格式,但是Nginx使用的是.key
和.crt
。因此需要使用OpenSSL将pfx
的文件转化为密钥文件.key
和公钥文件.crt
。将pfx
文件放在OpenSSL的目录下(假定运行中心提供的文件为sslcerttest.pfx
,打开OpenSSL执行以下命令:
openssl pkcs12 -in sslcerttest.pfx -nodes -out sslcerttest.pem
openssl rsa -in sslcerttest.pem -out sslcerttest.key
openssl x509 -in sslcerttest.pem -out sslcerttest.crt
得到的sslcerttest.key
、sslcerttest.pem
、sslcerttest.crt
将作为Nginx.conf
的配置文件所需证书文件的参数输入。
Nginx.conf配置文件
这里可以通过配置文件解决从http、https协议互换的问题。通常在运营中有以下对应背景:
http->https即,内部系统向外部系统进行报文请求时,统一走http协议,但是目标系统只支持https的协议,因此需要通过Nginx正向代理转发,则是http->nginx->https
https->http即,外部系统访问内部系统时,统一走https协议,在进行访问者身份确认后,通过Nginx反向代理转发到内部系统,则是https->nginx->http
。
综上,通过在Nginx代理服务做为负载均衡,统一为内部系统配置验证身份的服务器证书。
解决http->https转化
在已经安装好的Nginx服务条件下,仅需修改Nginx.conf
的配置文件,完美解决http->https
。以下是经测试后的配置文件,供参考
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 9090; ##监听9090端口,可修改具体值
server_name 127.0.0.1; ##监听本机IP,可修改具体值
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_ssl_certificate sslcerttest.crt; ##服务器证书
proxy_ssl_certificate_key sslcerttest.key; ##服务器证书私钥
proxy_pass https://210.74.42.33:9443/FEP$request_uri; ##产品服务URL 210.74.42.33:9443
proxy_ssl_verify off;
proxy_ssl_protocols TLSv1.1; ##支持TLS1.1的协议
proxy_ssl_trusted_certificate sslcerttest.pem; ##证书链路径
proxy_ssl_verify_depth 10;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
解决https->http转化
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 88 ssl;
server_name 127.0.0.1;
ssl_certificate localhost.crt;
ssl_certificate_key localhost.key;
ssl_client_certificate cfca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
error_log logs/ssslerror.log debug;
location / {
proxy_pass http://127.0.0.1:8080;
# proxy_set_header X-Real-IP $remote_addr;
proxy_set_header ssl_client_cert $ssl_client_cert;
proxy_set_header ssl_client_serial $ssl_client_serial;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
广州分公司技术部敬上
2017-12-16