美文网首页Java Web架构设计程序员
Nginx https反向代理web应用服务器

Nginx https反向代理web应用服务器

作者: Mr_Puff | 来源:发表于2017-09-29 14:21 被阅读158次

    在平时的开发过程中,为web应用添加https访问能提高一定的安全性。Https是http的安全版本,即在http协议中加入SSL认证,主要区别有以下几点:

    • https协议需要引入CA申请证书(测试时可以自认证),一般免费证书很少,需要交费。
    • http是超文本传输协议,信息是明文传输,https 则是具有安全性的加密传输协议。
    • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    • http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    关于SSL安全认证的详细概念,参考SSL 与 数字证书 的基本概念和工作原理

    SSL证书生成

    申请SSL证书的时候,发行机构会要求你提供一个CSR(Certificate Signing Request)文件,这个文件包含了发行机构需要的所有信息。在生成CSR之前,我们必须先创建密钥对,这个过程可以使用多种工具完成,例如Jdk自带的keytool或者openssl:

    openssl req -new -newkey rsa:2048 -sha256 -nodes -out myan.csr -keyout myan.key
    

    以上命令通过openssl生成csr和key文件,其中csr用于证书申请,key文件用于证书认证。具体参数含义:

    1. RSA算法加密强度是2048位
    2. 证书的数字摘要算法使用Sha2
    3. 这个命令还有一个subj参数,不加这个参数的情况下会使用交互命令的形式提示输入机构的基本信息:
    Generating a 2048 bit RSA private key
    ................................................................................  
    ........................................+++
    .....................................+++
    writing new private key to 'myan.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:CN
    State or Province Name (full name) [Some-State]:XA
    Locality Name (eg, city) []:XA
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:myan Org
    Organizational Unit Name (eg, section) []:myan
    Common Name (e.g. server FQDN or YOUR name) []:myan.org
    Email Address []:myanzhcn@gmail.com
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:******
    An optional company name []:
    

    challenge password是一个二次认证密码,不是加密证书的密码,需要证书发行厂商支持。
    现在我们持有了csr和key文件,有两种方式获得可用的安全证书:提交给CA厂商认证,或者自己认证。测试情况下,使用openssl自认证即可:

     openssl req -x509 -days 1024 -key myan.key -in myan.csr > myan.crt
    

    这个crt文件即可用于Nginx服务器进行SSL认证。

    Nginx基本配置

    Nginx是一个高性能的http和反向代理服务器,由于我们的应用一般部署在web服务器上,nginx不支持直接执行应用程序,因此需要启用nginx的反向代理。这样,只需要nginx启用https即可,应用服务器与nginx之间的通讯使用普通http协议即可。
    假设我们的web应用在8080端口启动,则nginx需要监听443端口来反向代理8080端口,使用的版本是1.10.3,核心配置如下:

    server {
            listen 443 ssl;
            ssl on;
            listen [::]:443 ssl;
            server_name  www.example.com;
    
            ssl_certificate D:/myan.crt;
            ssl_certificate_key D:/myan.key;
           
            location / {
                proxy_pass http://localhost:8080;
    
                #ssl settings
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port $server_port;
    
                #settings
                proxy_redirect     off;
                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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
                proxy_max_temp_file_size 0;
                proxy_connect_timeout      90;
                proxy_send_timeout         90;
                proxy_read_timeout         90;
                proxy_buffer_size          4k;
                proxy_buffers              4 32k;
                proxy_busy_buffers_size    64k;
                proxy_temp_file_write_size 64k;
            }
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    

    值得注意的是,nginx将https请求转为http请求发送给web应用服务器,因此需要指定特殊的头消息来告诉应用服务器已经被https代理。

    Web应用服务器配置

    本文使用Spring boot的内嵌tomcat作为应用服务器,由于已经被nginx代理,因此协议基本信息需要从http头信息中去获取,而不是解析HttpServletRequest。在application.properties文件中添加配置:

    server.tomcat.remote_ip_header=x-forwarded-for
    server.use-forward-headers=true
    

    需要注意的是, Spring boot在启动应用服务器时如果不指定server.address属性,则默认使用0.0.0.0,此时外部客户端还是可以通过8080端口访问web应用。因此,需要额外指定这个属性,禁掉外部访问:

    server.address=127.0.0.1
    
    https.png

    在访问网站时,会提示安全证书不受信任(证书是自己认证的,浏览器当然不认识)。导入这个证书到受新任的安全证书列表中,再访问网站就不会有红色标记提示了。


    import.png

    相关文章

      网友评论

        本文标题:Nginx https反向代理web应用服务器

        本文链接:https://www.haomeiwen.com/subject/uddiextx.html