前言
由于项目上用到小程序,而现在的小程序非常的严格,在开发的时候对接外部接口需要先添加审核,还得是https协议,而不是htpp协议,对于很多JAVA Web开发人员来说,服务端大多使用时下流行的tomcat(默认是http),并且在虚拟服务器使用nginx作请求转发操作。因此,为了实现https访问服务器,我们可以配置nginx监听htpps的默认端口,再进行转发操作。
http与https
概念
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
-
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
区别
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议的明文传输安全。
- http在网络速度上略快于https,https的缓存不是很好,开销比http多
- https在通信前会有一个证书认证的过程,类似与websocket的第一次握手。
感觉除了安全之外,没有啥子优势(安全本身就是一个很大优势)
生成ssl证书
# 1、首先,进入你想创建证书和私钥的目录,例如:
cd /etc/nginx/
# 2、创建服务器私钥,命令会让你输入一个口令:
openssl genrsa -des3 -out server.key 1024
# 3、创建签名请求的证书(CSR):
openssl req -new -key server.key -out server.csr
# 4、在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
# 5、最后标记证书使用上述私钥和CSR:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
nginx编译ssl模块(可选)
如果报错:nginx: [emerg] unknown directive “ssl”
需要重新编译nginx,并加上ssl模块,具体见我的这篇博客:http://blog.csdn.net/tengxing007/article/details/61615234
nginx配置ssl
#
# HTTPS server configuration
#
server {
listen 443;
server_name 本机的IP地址;
ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
location / {
#root html;
#index testssl.html index.html index.htm;
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_pass http://IP地址/ssl/;
}
}
http转https
if ($server_port = 80) {
return 301 https://$server_name$request_uri;
}
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
error_page 497 https://$server_name$request_uri;
#或者更直接点
server {
listen 80;
server_name www.xxx.com;
# 跳转到HTTPS
return 301 https://$server_name$request_uri;
}
#下面是对请求的路径进行定向
rewrite ^/test(.*)$ http://www.tiyee.net/home permanent;
rewrite指令的最后一项参数为flag标记,支持flag标记有:
1.last 相当于apache里面的[L]标记,表示rewrite。
2.break本条规则匹配完成后,终止匹配,不再匹配后面的规则。
3.redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
4.permanent 返回301永久重定向, 浏览器地址会显示跳转后的URL地址。
后记
- 使用301强制将https重定向到http在开发中用的非常多,但是我个人认为是不安全的,违背了https的规范。
- 推荐使用转发操作到http