SEARCH

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体现了苹果一贯的隐私保护态度。


Nginx环境下正确配置SSL安全加密证书


融网科技小编经常收到客户要求开启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://rongkeji.cn/$1 permanent;
    }
	
server
    {
        listen 80;
        server_name www.rongkeji.cn;
		rewrite ^/(.*) https://rongkeji.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://rongkeji.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 ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;


2.开启 HSTS 功能,max-age建议是15768000,或者是63072000

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";


设置完成后,提示信任状态为可信!

Contact

大同市城区西环路168号

致力于做服务最好的网站建设公司

将 " 策划+创意+体验+技术 " 完美融合 !

Wechat