给自己网站升级为https与http2.0吧~

2,464 阅读7分钟

升级为HTTPS进行通信

前言

为什么升级成https呢?现在网站基本都在用,不是https的chrome还给标记成不安全的。相比http明文传输,Https采用密文传输使用SSL+HTTP 协议构建更加安全可以避免网站被劫持到不可描述的地方去.
证书的类型大致分为域名验证型(DV)SSL证书, 组织验证型(OV)SSL证书, 扩展验证型(EV)SSL证书,免费的证书还是去咱阿里爸爸那里去领取吧,权威一些。

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…