我们系统大部分是部署在公司机房,原本以为在内部服务器nginx上面配置ssl,不会生效,所以一直没有配置ssl,最近实在看不下去了,决定实验一下,按说外网跟内网只是一个映射,ssl还是需要配置在内网机房服务器上面。

查看nginx版本,检查是否已安装了ssl模块

/usr/local/nginx/sbin/nginx -V
如果没有出现http_ssl_module,说明没有安装
nginx version: nginx/1.13.3
built by gcc 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module

从上面可以看出,我的nginx版本是1.13.3,没有安装ssl模块

查看nginx解压目录

注意:就是你当初安装nginx时的源码目录,不是安装后的目录
如果你的解压目录没了,就去nginx官网下载相同版本,放到服务器解压出来

编译ssl模块

找到configure 文件所在目录,进入此目录,执行如下命令

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

接下来执行,切记不要执行make install,否则会重新安装nginx

make

执行过程中可能会报错,我碰到如下错误

src/http/ngx_http_script.c:1296:18: error: cast between incompatible

此时需要vim进入/home/nginx/nginx-1.13.3/objs/Makefile,把下面这行中的-Werror去掉,就不会把警告当做错误了,然后重新make

CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g

将编译好的nginx执行文件,替换掉之前安装的nginx,注意先备份

备份:cp -rf /usr/local/nginx/sbin/nginx /home/nginx/sbin-bak/
替换:cp /home/nginx/nginx-1.13.3/objs/nginx /usr/local/nginx/sbin/

重启Nginx

/usr/local/nginx/sbin/ -s reload

配置ssl

一般在server块,配置ssl on;ssl_certificate指定pem文件路径,ssl_certificate_key指定key文件路径

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  server {
    listen 9088 ssl;
    #域名
    server_name test.com;
    ssl on;
    #ssl证书的pem文件路径
    ssl_certificate  /home/nginx/ssl/test.com.pem;
    #ssl证书的key文件路径
    ssl_certificate_key /home/nginx/ssl/test.com.key;
    location / {
     proxy_pass  http://ip:port;
    }
}
server {
    listen 80;
    server_name test.com;
    #将请求转成https
    rewrite ^(.*)$ https://$host$1 permanent;
}

http自动跳转到https

默认的80端口跳转433端口的,见上面的配置,这里说一下非80端口,比如我的是3100端口,添加如下配置:
error_page 497 =307 https://NGINX ssl crt 加密 nginx添加ssl_NGINX ssl crt 加密server_port$request_uri;
代码 497,是 nginx 在遇到 HTTP 请求发到 HTTPS 时会产生的内部错误代码,因此我们将返回一个 307 的回复(307 Temporary Redirect是HTTP协议中的一个状态码(Status Code)。可以理解为一个临时的重定向。但该响应代码与302重定向有所区别的地方在于,收到307响应码后,客户端应保持请求方法不变向新的地址发出请求

server {
        listen       3100;

        server_name  localhost test.com;

        ssl on;
        ssl_certificate /home/nginx/ssl/test.com;.pem;
        ssl_certificate_key /home/nginx/ssl/test.com;.key;
        
        root   /home/test/test-webapp;
        index  index.html index.htm;
        
        # 获取远程IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 300;
        
        location / {
            proxy_pass http://192.168.0.100:8080/;
        }
        
        #注意这里的关键配置
        error_page 497 =307 https://$host:$server_port$request_uri;
    }