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

在平时的开发过程中,为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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 摘要 本文主要是在测试https服务时对搭建https服务器的一些实践总结。TLS协议的介绍部分来源于对RFC52...
    东方胖阅读 8,368评论 0 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,562评论 18 139
  • WWDC 16 中,Apple 表示将继续在 iOS 10 和 macOS 10.12 里收紧对普通 HTTP 的...
    小如99阅读 6,143评论 0 25
  • 转载:https://help.aliyun.com/knowledge_detail/5974693.html?...
    meng_philip123阅读 1,665评论 1 12
  • 找找以前写的一些文字, 发出来以后不用再找一次。 有些人, 一生注定只能见一次。 1、 人是人非,曾经的不忘。 人...
    天下醉丶阅读 173评论 0 0