一.阻止IP访问
在很多时候,为了安全起见,我们不希望服务器的ip泄露,也不希望其他人能通过ip访问我们的服务器。此时,我们需要在nginx.conf配置文件中server块下添加如下代码(注意空格):
if ($host != 'your.site.name'){
return 403;
}
这行代码的作用是,将向不是通过域名访问网站的流量发送403 forbidden错误。如果不希望损失这部分流量,还可以将这部分流量重定向到网站上(具体代码待补充)。
二.申请SSL
如果网站没有SSL,浏览器往往会提示:与该网站的通信没有加密,可能存在安全风险。为了让我们的博客不仅是一个正经网站,也看起来像一个正经网站,我们需要为网站申请SSL。
这里,我们使用acme.sh申请免费的SSL证书。acme.sh的详细说明请参考这里,中文安装方法也请以上面的链接为准。
虽然acme.sh不推荐使用root安装,但是为了方便以及规避一些可能的技术问题,这里还是使用root权限进行安装。和之前一样,在命令提示行中输入
sudo su
登录root用户。然后输入
curl https://get.acme.sh | sh
下载安装acme.sh。然后输入下列代码生成证书:
acme.sh --issue -d your.site.name --nginx
有时acme.sh无法获取到nginx的配置文件,此时在命令提示行中会有警告。此时请输入:
acme.sh --issue -d your.site.name --nginx /usr/local/nginx/conf/nginx.conf
--nginx后的路径请替换为nginx.conf所在的路径。这样就能正常生成证书了。需要注意的是,acme.sh在letsencrypt申请证书,该网站对SSL证书的发放有限制,其他的还好,但每小时最多只能申请失败5次,如果超出了就只能等下一个小时再申请了。因此在申请过程中注意不要失败超过5次。
然后,我们需要在nginx目录下新建一个存放SSL证书的文件夹,使用命令:
cd /usr/local/nginx
进入nginx文件夹,然后使用:
mkdir SSL
新建一个名为SSL的文件夹。然后然后再利用如下代码将证书复制安装到相应位置:
acme.sh --intallcert -d your.site.name \
--key-file /usr/local/nginx/SSL/key.pem \
--fullchain-file /usr/local/nginx/SSL/cert.pem \
--reloadcmd "service nginx force-reload"
其中的key.pem和cert.pem请替换为之前生成的证书文件中对应的文件。有时会提示找不到force-reload命令,此时将该命令替换为restart命令后重新输入上述代码。
由于acme在频繁的更新,因此嫌麻烦的话可以开启自动更新:
acme.sh --upgrade --auto-upgrade
然后生成密钥,密钥的存放位置为刚才新建的ssl文件夹:
openssl dhparam -out /usr/local/nginx/ssl/dhparam.pem 2048
上述配置完成后,打开nginx.conf配置文件,在http块中输入
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
在server块中输入:
listen 443 ssl;
ssl_certificate /usr/local/nginx/ssl/fullchain.cer;
ssl_certificate_key /usr/local/nginx/ssl/your.site.name.key;
ssl_dhparam /usr/local/nginx/ssl/dhparam.pem;
检验无误后重启nginx,此时SSL应该能正常工作了,再次访问网站就能看见连接已被加密的信息。如果想设置只能通过https访问,可以在server块中添加如下代码:
if ($server_port !~ 443){
rewrite ^(/.*)$https://$host$1 permanent;
}
此时通过http访问的会被重定向到https。
Comments 1 条评论
如果网站页面中使用了含有http的资源或链接,浏览器同样会警告网站不安全hhhh