目标
将原有的http服务(windows环境)改造为https服务,以提高安全性。
开始之前
开始动手之前有几点需要弄明白:
- 改造为https后,原来站点内所有的http引用的静态资源都要改为https,如果不支持则需要想办法解决,比如把对应资源爬下来放到nginx下。
- 自己生成的证书浏览器是不认的,会出现一个不安全的提示,若是连接外网的话可以采用let’s encrypt+脚本的自动化获取证书的方案。具体内容以后在讨论。
- https需要配合防火墙等策略来以进一步提高安全性
技术路线
通过增加Nginx反向代理,将https转为后端的http请求,从而实现快速的站点https改造
主要步骤:
- openssl安装
- 生成认证的证书
- 修改nginx配置文件,配置代理+修改原有站点直接对于http资源的请求改为https
- 处理静态资源, 调整站点服务,将静态资源(http)转移到nginx下作为静态资源(http)
详细步骤
默认准好了nginx
openssl安装
- 在http://slproweb.com/products/Win32OpenSSL.html 下选择合适操作系统的版本
- 安装可执行程序
- 将对应目录的bin路径加到path环境变量中,增加 OPENSSL_HOME,变量值为openssl安装位置
生成证书
进入到nginx路径创建ssl文件夹,进去其中,打开命令行或PS
- 生成对应的私钥,
openssl genrsa -des3 -out server.key 1024 - 去掉密码,
openssl rsa -in server.key -out server.key - 创建csr证书,
openssl req -new -key server.key -out server.csr - 创建ca,
openssl req -new -x509 -key server.key -out ca.crt -days 3650 - 创建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 ;
}
}
}
处理静态资源
- 将系统中全部的直接http的静态资源url改为nginx下对应的路径
- 将静态资源复制到nginx目录的data路径下,这个要与上面的配置对应
PS:地图图片由于是rest的形式采用转发处理,不需要手动调整。但地图api的js和css必须要处理。
总结
https能够有效的提升系统面对嗅探攻击和各种劫持攻击的抵抗力,降低风险,当然文章中海油没有详尽的地方,比如目前实际上还是混合的模式最好还是能转为纯https,但如果时间很紧张也可作为临时解决方案。