之前一直只是使用http协议给项目通信,但是由于谷歌大力推行https,https相比http来说也有着很多优点,比如说通信加密,抓包是抓不到具体通信信息的,而且在传统的http协议下,浏览器访问并发数有限,比如谷歌浏览器默认是开启6个信道并发访问,而https则不一样,它采用了信道复用,传输效率大大提升。这也是现今业内推荐的通信协议。
这里带来nginx采用https协议反向代理tomcat容器教程,因为自己的博客应用是java编写,部署在tomcat中,通过nginx反向代理,这次就顺便换成https吧。
首先https是需要ssl证书的,ssl证书通俗来讲就是一种公认的凭证,ssl证书通过在客户端浏览器和Web服务器之间建立一条ssl安全通道,证书讲道理是客户端和服务端双向的,但是现今主流的浏览器都集成了证书,也就是说,我们只需要在服务端部署ssl证书就行了。
ssl证书其实可以自己制作,也可以在知名的证书机构注册购买,两者的区分是自己制作的浏览器可能不认可,毕竟自己制作的公信力不够。
1.证书制作或购买
证书制作一般是使用openssl,可以在服务端中直接生成证书,具体不做概述。
这里推荐在知名机构中注册购买,如腾讯云的TrustAsia TLS RSA CA就能免费注册一年期的证书,还是很美丽的。
腾讯云的产品列表有ssl证书申请入口,注册选择TrustAsia TLS RSA CA免费的,过程很简单,注册完成后,还需要解析验证才能通过,其实过程也很简单,只需要在绑定的域名解析中,增加一条给定的解析信息,待600秒后机构扫描到解析成功,这个证书也就通过啦。
通过后如图显示:
现在我们就有了自己的证书啦。
2.部署证书(nginx端)
直接点击下载,下载证书到本机,下载后的文件如下:
因为我们需要部署nginx,所以需要nginx文件夹里的证书。
这里面分别是
SSL证书文件:1_www.domain.com_bundle.crt 和
私钥文件 :2_www.domain.com.key
这便是核心的东西,将两个文件拷贝至nginx的配置文件文件夹中,接下来就是部署至nginx中了。
接下来就是nginx的配置了,证书主要是配置在nginx配置文件nginx.conf中。配置文件是在conf文件夹内,配置如下:
server { #此配置段将HTTP请求全部重定向为HTTPS请求
listen 80;
server_name www.listenlife.cn listenlife.cn;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl; #由80改成443
#listen [::]:80 default_server;
#listen [::]:443 ssl http2 www.listenlife.cn;
server_name www.listenlife.cn;
#ssl证书配置开始
ssl on;
ssl_certificate 1_www.listenlife.cn_bundle.crt;
ssl_certificate_key 2_www.listenlife.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
#ssl证书配置结束
#rewrite ^(.*) https://$host$1 permanent; #http自动跳转https
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /{
proxy_pass http://127.0.0.1:8080;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
要注意三点:
一是端口需要由80改成443,这是ssl的固定端口,而且还需要注意的是安全组需要开放443入站规则;二是配置在server中配置以下:
ssl on;
ssl_certificate 1_www.listenlife.cn_bundle.crt;
ssl_certificate_key 2_www.listenlife.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
然后再项目location中还需要配置以下:
proxy_set_header X-Real-Ip $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_set_header X-Forwarded-Proto $scheme;
最后是配置中的第一个server,目的在于将HTTP请求全部重定向为HTTPS请求。这样输入http也能跳转至https。
3.tomcat端配置
还需要在tomcat的server.xml文件中做两处配置:
增加:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="conf/www.listenlife.cn.jks"
keystorePass="xxxxxxx"
clientAuth="false" sslProtocol="TLS" />
此处的keystoreFile和keystorePass来自于之前证书文件中的tomcat文件夹,如下:
将keystoreFile拷贝至tomcat的conf目录下,然后引入,此处的keystorePass里只需要填写keystorePass.txt中的字符即可。
注意此处的8443端口是来自于8080端口的跳转:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
需要对应。
然后需要配置一处,在末尾HOST节点中加入:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
4.结语
重启项目,重启nginx,访问项目->
然后就是喜闻乐见的https和浏览器标识的“安全”啦。
版权属于:Jolly
本文链接:http://totoro.site/index.php/archives/49/
关于转载:原创文章,禁止转载