Nginx环境下正确配置SSL安全加密证书
发布日期:2017年12月20日,网站分类:网站新闻
如今的网站和应用都已开启https,绝大部分网民也对https有所了解,苹果公司2017年1月1日要求强制开启ATS和HTTPS加密,HTTP是非常不安全的明文传输协议,任何通过HTTP协议传输的数据都以明文形式在网络中“裸奔”,任何数据都处在被窃听、篡改、冒充这三大风险之中。HTTP不提供任何方式的数据加密,如果攻击者劫持了HTTP流量,就可以直接读懂其中的信息;而且HTTP并不验证服务器身份的真实性,服务器返回的请求容易被篡改或者假冒,而用户根本无法察觉。因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
HTTPS协议是Http Over SSL,简单来说就是HTTP的安全版本,在HTTP的基础上增加SSL/TLS加密传输协议,通过HTTPS加密传输和身份认证保证了传输过程的安全性。在登录网银和电子邮箱时,你会常常看到地址栏的网址显示HTTPS前缀,从而轻松判断这个网页是否采用了HTTPS加密连接。但是在移动应用上,网络连接的安全性就没有那么透明了,用户很难知道App连接网络时使用的是HTTP还是HTTPS。
ATS就是因此而诞生的,ATS要求服务器必须支持传输层安全(TLS)协议1.2以上版本;证书必须使用SHA256或更高的哈希算法签名;必须使用2048位以上RSA密钥或256位以上ECC算法等等,不满足条件的证书,ATS都会拒绝连接。强制开启ATS体现了苹果一贯的隐私保护态度。
融网科技小编经常收到客户要求开启https的要求,今天我们会在nginx环境下安装SSL以及部署我们的站点是通过HTTPS访问的。
1、部署HTTPS基础工作
申请SLL证书,这里推荐使用腾讯云或者阿里云,我不是马屁精,就是单单感觉阿里云和腾讯云简单方便易存储证书,到期可自动续费。
申请成功后下载解压修改.pem,.key的前缀,如rongkeji.key,rongkeji.pem,当然有的证书是.crt,而不是.pem,这里就不多做解释,不懂度娘去。
2、上传和部署SSL证书
在root下新建一个ssl文件夹,当然你自己看的去其他地方建,小编的习惯,完整路径/root/ssl
解密私钥和设置权限,登录SSH,执行下面命令,解密私钥和授权。
openssl rsa -in rongkeji.key -out /root/ronghkeji.key chmod 600 /root/rongkeji.key
3、NGINX环境部署站点SSL
这里需要在nginx新添加一个站点,如果有站点就修改conf文件设置就可以。
conf文件具体位置在"/usr/local/nginx/conf/vhost/"目录文件中,找到对应站点的conf文件,然后修改设置如下:
server { listen 443 ssl http2; #listen [::]:443 ssl http2; server_name rongkeji.cn www.rongkeji.cn; index index.html index.htm index.php default.html default.htm default.php; root /rongkeji.cn; ssl on; ssl_certificate /root/ssl/rongkeji.pem; ssl_certificate_key /root/ssl/rongkeji.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_session_cache builtin:1000 shared:SSL:10m; include rongwang.conf; #error_page 404 /404.html; # Deny access to PHP files in specific directory #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } include enable-php.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /.well-known { allow all; } location ~ /\. { deny all; } access_log off; }
最后,我们重启nginx,可以看到SSL证书生效,且HTTPS可以访问站点,但有一个问题是,http不自动跳转https,那么下面我们在说如何设置301。
4、设置http、https 301跳转
分为https www 跳转 顶级域名(https://www.rongkeji.cn 301 https://rongkeji.cn),http www 跳转 https 顶级域名(http://www.rongkeji.cn 301 https://rongkeji.cn)
代码如下:
server { listen 80; server_name rongkeji.cn; rewrite ^/(.*) https://www.kufan.cn/$1 permanent; } server { listen 80; server_name www.rongkeji.cn; rewrite ^/(.*) https://www.kufan.cn/$1 permanent; }
server { listen 443 ssl http2; server_name www.rongkeji.cn; root /rongkeji.cn; ssl on; ssl_certificate /root/ssl/rongkeji.pem; ssl_certificate_key /root/ssl/rongkeji.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_session_cache builtin:1000 shared:SSL:10m; # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048 ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem; rewrite ^/(.*) https://www.kufan.cn/$1 permanent; }
以上都可以直接添加到conf文件内,重启服务器后正常跳转,百度301跳转验证正常通过。
补充内容:
如果使用https加密检查提示下面内容,可对应修改;
1.服务器支持弱Diffie-Hellman(DH)密钥交换参数,修改后后支持http/2
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
修改为:
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
2.开启 HSTS 功能,max-age建议是15768000,或者是63072000
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
详细内容解说:
1.添加add_header
#减少点击劫持 add_header X-Frame-Options DENY; #禁止服务器自动解析资源类型 add_header X-Content-Type-Options nosniff; #防XSS攻击 add_header X-Xss-Protection 1;
2.配置ssl_session_cache,配置共享会话缓存大小,视站点访问情况设定
ssl_session_cache builtin:1000 shared:SSL:10m;
3.关闭TLS 1.0,开启支持TLS 1.3(暂时不建议关闭TLS1.0,因为毕竟要考虑到IE用户)
ssl_protocols TLSv1.2 TLSv1.1 TLSv1.3;
4.OCSP Stapling开启
ssl_stapling on;
5.关闭IPV6监听(在不支持IPV6情况下,不建议大家开启)
#listen [::]:80; #listen [::]:443 ssl http2;
设置完成后,提示信任状态为可信!如果大家有需要了解阿里云IPV6升级改造,可以查看《lnmp网站环境架设ipv6访问配置教程》。
转载请注明来自:https://www.kufan.cn/news/32.html