升级为HTTPS进行通信
前言
为什么升级成https呢?现在网站基本都在用,不是https的chrome还给标记成不安全的。相比http明文传输,Https采用密文传输使用SSL+HTTP 协议构建更加安全可以避免网站被劫持到不可描述的地方去.证书的类型大致分为域名验证型(DV)SSL证书, 组织验证型(OV)SSL证书, 扩展验证型(EV)SSL证书,免费的证书还是去咱阿里爸爸那里去领取吧,权威一些。
第一种方式
浏览器、nginx、tomcat三者之间都走https协议,省事儿搭建起来快,但Nginx跟tomcat打交道用https协议除了tcp的三次握手还有和ssl的握手。配置tomcat8.5使用https协议
第一步:将tomcat的证书下载下来并放置centos的/usr/local/tomcat/cert目录下,cert目录没有需要自己创建第二步:修改tomcat的server.xml配置文件(tomcat版本不同,配置方式会有所不同),贴出主要代码
<!--注释符修对HTTPS默认端口进行配置,将redirectPort8443修改为https默认端口443-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" />
<!--在server.xml中去掉该处注释,将Tomcat中默认的HTTPS端口Connector port 8443修改为443。8443端口不可通过域名直接访问、
需要在域名后加上端口号;443端口是HTTPS的默认端口,可通过域名直接访问,无需在域名后加端口号。 -->
<Connector port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true">
<SSLHostConfig>
<Certificate
certificateKeystoreFile="/usr/local/tomcat/cert/证书域名.pfx"
certificateKeystorePassword="证书密码"
certificateKeystoreType="PKCS12" />
</SSLHostConfig>
</Connector>
<!--在server.xml中去掉该处注释,将redirectPort修改为443,让HTTPS请求转发到443端口。-->
<Connector port="8009" protocol="AJP/1.3" redirectPort="443" />
配置nginx使用https协议
第一步:下载Nginx的认证证书,将其放在/usr/local/nginx/cert目录下第二步,配置nginx.conf,我使用的nginx版本是1.8.0,1.x的版本应该都差不多,该处我未配置全站都使用https,此处即支持http也支持https访问自己的网站,在第二种方式将采用全站都使用https
server {
listen 80; #http默认端口号
listen 443 ssl; #https默认端口号
server_name www.yourdomain.xyz; #监听的ip地址或域名
ssl_certificate /usr/local/nginx/cert/3631326_www.yourdomain.pem; # 这个是证书的crt文件所在目录
ssl_certificate_key /usr/local/nginx/cert/3631326_www.yourdomain.xyz.key; # 这个是证书key文件所在目录
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
#访问日志、错误日志
access_log /usr/local/nginx/logs/access.log;
error_log /usr/local/nginx/logs/error.log;
location / {
proxy_pass http://xxxx自己的ip地址:8080;
}
#拦截静态资源
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
#配置nginx去哪里找静态资源
root /usr/local/tomcat/apache-tomcat-8.5.51/webapps/ROOT;
#配客户端置缓存时间为2天
expires 2d;
proxy_redirect off;
proxy_set_header Host $host;
add_header wall "hey!I am zcc";
}
}
踩坑记录
因为自己之前安装nginx的时候没有安装ssl支持,导致在启动nginx的时候报错 > Failed to start SYSV: Nginx is an HTTP(S) server, HTTP(S) reverse ... >解决方式:https://blog.csdn.net/long690276759/article/details/81507873
第二种方式
采用浏览器和nginx之间使用Https通信,nginx和tomcat之间使用http通信,并配置哪怕用户直接访问的http://www.abcd.com也直接重定向为https://www.abcd.com配置nginx
#负载均衡配置
upstream linuxTom {
ip_hash;
server 101.37.171.85:8080 ;
server 101.37.171.85:8081 ;
}
#将http请求重定向为https请求
server {
listen 80;
server_name www.zengcc.xyz;
rewrite ^(.*)$ https://www.zengcc.xyz$1 permanent;
}
#https设置
server {
listen 443 ssl; #https默认端口号
server_name www.zengcc.xyz; #监听的ip地址或域名
ssl_certificate /usr/local/nginx/cert/3631326_www.zengcc.xyz.pem; # 这个是证书的crt文件所在目录
ssl_certificate_key /usr/local/nginx/cert/3631326_www.zengcc.xyz.key; # 这个是证书key文件所在目录
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
#强制绑定www,提高SEO
if ( $host != 'www.zengcc.xyz' ) {
rewrite ^(.*)$ https://www.zengcc.xyz$1 permanent;
}
#访问日志、错误日志
access_log /usr/local/nginx/logs/access.log;
error_log /usr/local/nginx/logs/error.log;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host "www.zengcc.xyz";
# 把 https 的协议告知 Tomcat,否则 Tomcat 可能认为是 http 的请求
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
proxy_connect_timeout 240;
proxy_send_timeout 240;
proxy_read_timeout 240;
proxy_pass http://linuxTom;
}
#拦截静态资源
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
#配置nginx去哪里找静态资源
root /usr/local/tomcat/apache-tomcat-8.5.51/webapps/ROOT;
#配客户端置缓存时间为2天
expires 2d;
proxy_redirect off;
proxy_set_header Host $host;
add_header wall "hey!I am zcc";
}
配置tomcat
<!--第一处修改:注释符修对HTTPS默认端口进行配置,将redirectPort8443修改为https默认端口443-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" />
<!--第二处修改-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"
/>
</Host>
踩坑记录
一:我看网上说第一处修改要加上 proxyPort="443",我加了之后,直接访问https://域名 会直接报错为https://域名:443,将其去掉后便无事。二:我试着将nginx的代理处即proxy_pass http://linuxTom 修改成https://linuxTom ,想着别人一访问我的域名直接进入的就是https而不是http,不过之后访问报502的错误,网上方法都试验了下,后来还是老老实实改成http,通过重定向在变为https
升级为HTTP2
升级为http2花了好几个小时,对linux还是玩不六,查阅资料后网上大部分人都说和nginx的版本以及nginx使用的openssl的版本有关。nginx一定要确保>1.9.5,openssl版本请一定要确保在>=1.0.2的版本。前言
为什么升级成h2呢?原因有很多,我印象比较深刻的就是http1.1采用持有连接的方式,一个chrome浏览器最多持有六个tcp连接,每个tcp连接可以向服务器发起若干次http请求,但同一时刻只能发起一次。h2我对它印象深刻的在于它的二进制帧,不在像http1.1一样发送的是文本格式,http2传输的是二进制格式速度更快;另外还有它的多路复用,单域名下只用建立一个tcp连接进行通信,该连接可以承载任意数量的双向数据流,减轻服务器压力,可以并行发起若干个http请求,所以咱们有了服务器后得折腾一下子。
升级openssl版本
查看现有openssl版本:openssl version可见版本太低了,网上资料参差不齐加上自己对openssl的不了解,升级openssl花费我不少时间,在此小计
#下载并解压openssl1.0.2版本
cd /usr/local
wget --no-check-certificate https://www.openssl.org/source/openssl-1.0.2j.tar.gz
tar -zxvf openssl-1.0.2j.tar.gz
cd openssl-1.0.2j
#安装自己下载的openssl版本,指定安装目录为/usr/local/openssl
./config shared zlib --prefix=/usr/local/openssl && make && make install
#安装结束后执行下列命令
./config -t
make depend
#进入/usr/local目录下,执行以下命令 关于ln的用法 https://www.cnblogs.com/peida/archive/2012/12/11/2812294.html
ln -s openssl ssl
#在/etc/ld.so.conf文件的最后面,添加如下内容:/usr/local/openssl/lib
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
#刷新配置
ldconfig
#添加OPESSL的环境变量,在etc/的profile的最后一行
export OPENSSL=/usr/local/openssl/bin
export PATH=$OPENSSL:$PATH:$HOME/bin
之后退出登陆界面,重新登录并查看openssl版本的信息,可看到已经更新。
升级nginx版本
查看之前nginx对应的openssl版本,可见低了 升级nginx相对来说没有升级openssl折腾人,只要openssl正确升级好了便轻松许多。#查看之前nginx的编译参数,将编译参数复制下来,后头要用
cd /usr/local/nginx/sbin
./nginx -V
#停掉原来的nginx
./nginx -s quit
mv nginx nginx.old
#下载nginx1.9.7版本,解压缩
cd /usr/local
wget http://nginx.org/download/nginx-1.9.7.tar.gz
tar -zxvf nginx-1.9.7.tar.gz
cd nginx-1.9.7
#在之前的参数基础上加上--with-openssl=/usr/local/openssl,我的参数如下
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_v2_module \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-openssl=/usr/local/openssl
#生成新的可执行文件,make就行,千万不要后来又make install,不然会覆盖自己之前的nginx的配置文件
#make的时候会报错Nginx在编译时默认在/usr/local/ssl/.openssl/ 这个目录找到对应的文件,我们需要去修改,参照
#修改参照该链接:https://blog.csdn.net/zhangge3663/article/details/84647077
make
#新的可执行文件在/usr/local/nginx-1.9.7/objs
cd /usr/local/nginx-1.9.7/objs
cp nginx /usr/local/nginx/sbin
升级之后我们在查看nginx的openssl版本是不是built with OpenSSL 1.0.2j 26 Sep 2016 之后修改nginx.conf的配置文件,在原先基础上加一个http2 default_server即可
#https设置
server {
listen 443 ssl http2 default_server; #https默认端口号
server_name www.zengcc.xyz; #监听的ip地址或域名
....
....
}
最后重新加载配置并访问网站即可。
参考链接
http强跳https,域名不带 www 跳转到www:zhuanlan.zhihu.com/p/51673748
Nginx编译参数详解:blog.51cto.com/blief/17098…
升级openssl:blog.csdn.net/shiyong1949…
nging配置http2不起作用
blog.csdn.net/a454213722/… blog.csdn.net/zhangge3663…