某个项目在客户对接中,对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