Web项目快速HTTPS改造简要方案(Nginx+openssl)

552 阅读3分钟

目标

将原有的http服务(windows环境)改造为https服务,以提高安全性。

开始之前

开始动手之前有几点需要弄明白:

  1. 改造为https后,原来站点内所有的http引用的静态资源都要改为https,如果不支持则需要想办法解决,比如把对应资源爬下来放到nginx下。
  2. 自己生成的证书浏览器是不认的,会出现一个不安全的提示,若是连接外网的话可以采用let’s encrypt+脚本的自动化获取证书的方案。具体内容以后在讨论。
  3. https需要配合防火墙等策略来以进一步提高安全性

技术路线

通过增加Nginx反向代理,将https转为后端的http请求,从而实现快速的站点https改造
主要步骤:

  1. openssl安装
  2. 生成认证的证书
  3. 修改nginx配置文件,配置代理+修改原有站点直接对于http资源的请求改为https
  4. 处理静态资源, 调整站点服务,将静态资源(http)转移到nginx下作为静态资源(http)

详细步骤

默认准好了nginx

openssl安装

  1. 在http://slproweb.com/products/Win32OpenSSL.html 下选择合适操作系统的版本
  2. 安装可执行程序
  3. 将对应目录的bin路径加到path环境变量中,增加 OPENSSL_HOME,变量值为openssl安装位置

生成证书

进入到nginx路径创建ssl文件夹,进去其中,打开命令行或PS

  1. 生成对应的私钥,openssl genrsa -des3 -out server.key 1024
  2. 去掉密码,openssl rsa -in server.key -out server.key
  3. 创建csr证书,openssl req -new -key server.key -out server.csr
  4. 创建ca,openssl req -new -x509 -key server.key -out ca.crt -days 3650
  5. 创建crt证书,openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt

配置nginx

#user  www www;
worker_processes 2;
worker_rlimit_nofile 65535;

events
{
  worker_connections 65535;
}

http
{
 include      mime.types;
  default_type application/octet-stream;

  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;

  sendfile on;
 tcp_nopush    on;
  keepalive_timeout 0;
  tcp_nodelay on;

  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;


  ##cache##
  proxy_connect_timeout 5;
  proxy_read_timeout 60;
  proxy_send_timeout 5;
  proxy_buffer_size 16k;
  proxy_buffers 4 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
    ##end##

  gzip   on;
  gzip_min_length   1k;
  gzip_buffers  4 8k;
  gzip_http_version 1.1;
  gzip_types  text/plain application/x-JavaScript text/css application/xml;
  gzip_disable "MSIE [1-6]\.";

  log_format access  '$remote_addr - $remote_user [$time_local]"$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" $http_x_forwarded_for';
  

  upstream server_backend { 
       server ip1:9000;
  }
  upstream map_backend  { 
       server ip2:8082;
  }
  upstream gis_layer_backend  { 
       server ip3:6080;
  }
  server {
       listen      443 default ssl;
        server_name ip1;  
        ssl_certificate     ../ssl/server.crt;
        ssl_certificate_key ../ssl/server.key;	
		location ~arcgis_js_api* {
             root D://software/nginx-1.13.1-https/data;
       }
	   location ~arcgis/rest/services* {
             proxy_pass http://gis_layer_backend ;
       }	
	   location ~WebMapTileServer/map* {
             proxy_pass http://map_backend ;
       }	   
        #其他管理后端服务
       location / {
             proxy_pass http://server_backend ;
       }
	 
  
  }
}

处理静态资源

  1. 将系统中全部的直接http的静态资源url改为nginx下对应的路径
  2. 将静态资源复制到nginx目录的data路径下,这个要与上面的配置对应

PS:地图图片由于是rest的形式采用转发处理,不需要手动调整。但地图api的js和css必须要处理。

总结

https能够有效的提升系统面对嗅探攻击和各种劫持攻击的抵抗力,降低风险,当然文章中海油没有详尽的地方,比如目前实际上还是混合的模式最好还是能转为纯https,但如果时间很紧张也可作为临时解决方案。