nginx使用ssl模块配置https

时间:2022-04-26 19:59:17

前言

由于项目上用到小程序,而现在的小程序非常的严格,在开发的时候对接外部接口需要先添加审核,还得是https协议,而不是htpp协议,对于很多JAVA Web开发人员来说,服务端大多使用时下流行的tomcat(默认是http),并且在虚拟服务器使用nginx作请求转发操作。因此,为了实现https访问服务器,我们可以配置nginx监听htpps的默认端口,再进行转发操作。

http与https

概念

  • HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

  • HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

      HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

区别

  1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议的明文传输安全。
  5. http在网络速度上略快于https,https的缓存不是很好,开销比http多
  6. 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地址。

后记

  1. 使用301强制将https重定向到http在开发中用的非常多,但是我个人认为是不安全的,违背了https的规范。
  2. 推荐使用转发操作到http

参考文章