Nginx反向代理解决产品不支持JDK1.6版本的解决方案 | 程序小兵

Nginx反向代理解决产品不支持JDK1.6版本的解决方案

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

  1. 获取zlib编译安装包,在http://www.zlib.net/上可以获取当前最新的版本。
  2. 解压缩zlib-xx.tar.gz包。
  3. 进入解压缩目录,执行./configure
  4. make & make install

安装Pcre库

  1. 获取pcre编译安装包,在http://www.pcre.org/上可以获取当前最新的版本
  2. 解压缩pcre-xx.tar.gz包。
  3. 进入解压缩目录,执行./configure
  4. make & make install

安装Openssl

  1. 获取openssl编译安装包,在http://www.openssl.org/source/上可以获取当前最新的版本。
  2. 解压缩openssl-xx.tar.gz包。
  3. 进入解压缩目录,执行./config
  4. make & make install

安装Nginx

  1. 获取Nginx,在http://nginx.org/en/download.html上可以获取当前最新的版本。
  2. 解压缩nginx-xx.tar.gz包。
  3. 进入解压缩目录,执行./configure
  4. 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

  1. 进入cd /usr/local/nginx/sbin
  2. 启动nginx./nginx
  3. 验证nginx配置文件是否正确./nginx -t
  4. 重启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.keysslcerttest.pemsslcerttest.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

文章目录
  1. 1. 前言
  2. 2. Nginx安装
    1. 2.1. 安装Zlib
    2. 2.2. 安装Pcre库
    3. 2.3. 安装Openssl
    4. 2.4. 安装Nginx
  3. 3. Nginx配置https所需证书
  4. 4. Nginx.conf配置文件
    1. 4.1. 解决http->https转化
    2. 4.2. 解决https->http转化
,