如何在FreeBSD上使用SSL来保护Nginx

介绍

腾讯云SSL是腾讯云的证书颁发服务,SSL证书(SSL Certificates)提供了安全套接层(SSL)证书的一站式服务,包括证书申请、管理及部署功能,与顶级的数字证书授权(CA)机构和代理商合作,为您的网站、移动应用提供 HTTPS 解决方案。 我们将在本教程中使用默认的Nginx配置文件,而不是单独的服务器块文件。

准备

为了完成本教程,您需要:

  • 一台已经设置好可以使用sudo命令的非root账号的FreeBSD服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器
  • 要完成本教程,您必须已在服务器上设置Nginx,关于安装请参考在CVM上安装Nginx这篇文章。
  • SSL证书:如何设置此证书取决于你是否拥有可解析该服务器的域名。
  • 在您的服务器上启用防火墙,如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。

第一步、获取证书

申请入口

进入SSL证书管理控制台

单击【申请证书】

查看申请域名型证书型号,单击【确定】

填写申请

填写申请域名,例如qcloud.com,cloud.tencent.com,demo.test.qlcoud.com。

手动DNS验证方式

证书默认支持收到DNS验证,验证方法可查看详情

提交申请后验证身份

提交申请成功后弹窗提示如下,需要前往【证书详情页】获取CName记录添加解析:

获取CName记录如Tips中显示,需要尽快成功添加解析,方可通过CA机构审核:

第二步、设置防火墙并允许HTTPS访问

如果您已在服务器上设置防火墙,则应确保它允许HTTPS访问(通过443端口)。如果您尚未设置防火墙,则可以按照此步骤中列出的说明进行操作。

使用首选编辑器打开位于/etc/目录中的rc.conf文件。在这里我们将使用ee

sudo ee /etc/rc.conf

该文件用于通知FreeBSD应该在机器开启时启动哪些服务。在文件顶部附近,添加以下高亮显示的行:

. . .
nginx_enable="YES"
firewall_enable="YES"
firewall_type="workstation"
firewall_myservices="22 80 443"
firewall_allowservices="any"

以下是每个指令及其设置的作用:

  • firewall_enable="YES"——这使firewal能够在服务器启动时启动。
  • firewall_type="workstation"——FreeBSD提供了几种默认类型的防火墙,每种防火墙的配置略有不同。通过声明workstation类型,防火墙将仅使用有状态规则来保护此服务器。
  • firewall_myservices="22 80 443"——您可以在firewall_myservices指令中列出要通过防火墙允许的TCP端口。在此示例中,我们分别指定22端口,80以及443允许对服务器的SSH,HTTP和HTTPS访问。
  • firewall_allowservices="any"——这允许来自任何IP地址的机器通过firewall_myservices指令中指定的端口进行通信。

添加这些行后,保存文件并按CTRL + C,输入exit,然后按ENTER关闭编辑器。

然后,使用以下命令启动ipfw防火墙服务:

sudo service ipfw start

配置防火墙后,您现在可以安装腾讯云证书了。

第三步、在Web服务器上配置TLS / SSL

现在您已拥有SSL证书,您需要配置Nginx Web服务器以使用它。

我们将对配置进行一些调整:

  • 我们将创建一个包含SSL密钥和证书文件位置的配置代码段。
  • 我们将创建一个包含强SSL设置的配置代码段,可以在将来与任何证书一起使用。
  • 我们将调整nginx配置文件以处理SSL请求并使用上面的两个片段。

创建指向SSL密钥和证书的配置代码段

首先,让我们在/etc/nginx/snippets目录中创建一个新的Nginx配置代码段。

为了正确区分此文件的目的,我们将其命名ssl-为我们的域名:

sudo nano /etc/nginx/snippets/ssl-example.com.conf

在这个文件中,我们只需要将ssl_certificate设置为我们的证书文件和ssl_certificate_key相关的密钥。在我们的例子中,这将是这样的:

ssl_certificate /home/root/domain.com/1_www.domain.com_bundle.crt;
ssl_certificate_key /home/root/domain.com/2_www.domain.com.key;

添加这些行后,保存并关闭该文件。

使用强加密设置创建配置代码段

接下来,我们将创建另一个片段,用于定义一些SSL设置。这将使Nginx具有强大的SSL密码套件,并启用一些有助于保证我们的服务器安全的高级功能。

我们将为该文件指定一个通用名称:

sudo nano /etc/nginx/snippets/ssl-params.conf

预加载HSTS可提高安全性,但如果意外启用或启用错误,可能会产生深远的影响。在本教程中,我们不会预加载该设置,但如果您确定了解其含义,则可以对其进行修改:

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
​
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

完成后保存并关闭文件。

调整Nginx配置以使用SSL

现在我们已经有了我们的代码片段,我们可以调整我们的Nginx配置来启用SSL。

我们将在本指南中假设您正在使用/etc/nginx/sites-available目录中的defaultnginx配置文件。如果您使用的是其他nginx配置文件,请在以下命令中替换其名称。

在我们继续之前,让我们备份当前的nginx配置文件:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

现在,打开nginx配置文件进行调整:

sudo nano /etc/nginx/sites-available/default

您的nginx配置文件可能像这样:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
​
    # SSL configuration
​
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
​
    . . .

我们将修改此配置,以便将未加密的HTTP请求自动重定向到加密的HTTPS。这为我们的网站提供了最佳安全性。如果要同时允许HTTP和HTTPS流量,请使用后面的备用配置。

我们将把配置分成两个独立的块。在第一个listen指令之后,我们将添加一个server_name指令,设置为服务器的域名。然后,我们将设置重定向到我们将要创建的第二个nginx配置文件。之后,我们将关闭这个配置:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}
​
    # SSL configuration
​
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
​
    . . .

接下来,我们需要在下面启动一个新的nginx配置文件以。我们可以取消注释listen使用端口443的两个指令。之后,我们只需要在里面包含我们设置的两个片段文件:

注意:您可能只有一个listen指令,其中包含default_server每个IP版本和端口组合的修饰符。如果为已设置default_server的这些端口启用了其他nginx配置文件,则必须从其中一个块中删除修改器。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}
​
server {
​
    # SSL configuration
​
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;
​
    . . .

完成后保存并关闭文件。

(备用配置)允许HTTP和HTTPS流量

如果您想要或需要同时允许加密和未加密内容,则必须以不同方式配置Nginx。我们只是将两个单独的nginx配置文件压缩为一个块并删除重定向:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
​
    server_name example.com www.example.com;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;
​
    . . .

完成后保存并关闭文件。

结论

在本教程中,我们安装了腾讯云的加密SSL证书,配置了Nginx以使用这些证书,赶快申请一台服务器进行尝试吧,更多Linux教程请前往腾讯云+社区学习。


参考文献:《How To Secure Nginx with Let's Encrypt on FreeBSD》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Django Scrapy

python3 邮箱相关邮箱的服务

邮箱的服务 POP 协议 邮局协议(Post Office Protocol,简称POP),POP是第一个用于下载邮件的协议,POP 协议的最新版本是第三版,也...

437110
来自专栏主机笔记

把linux设置成使用密钥登录

平常使用服务器,因为是在互联网中,只要知道端口密码和ip就可以登录,方便的同时也带来了一定的安全隐患,今天就介绍一个把密码禁用,使用密钥登录的方法,这样就实现了...

48960
来自专栏Esofar 开发日记

快速签发Let's Encrypt证书指南

本文仅记录给自己的网站添加“小绿锁”的动手操作过程,不涉及HTTPS工作原理等内容的讲解,感兴趣的同学可以参考篇尾的文章自行了解。

15050
来自专栏王二麻子IT技术交流园地

Oracle的Recyclebin策略

1、从oracle10g开始删除数据库表的时候并不是真正删除,而是放到了recyclebin中,这个过程类似 windows里面删除的文件会被临时放到回收站中。...

21060
来自专栏程序员宝库

SSH 登录流程分析

本文首发于 https://jaychen.cc 作者:jaychen(https://segmentfault.com/u/chenjiayao) 写一篇短文...

56180
来自专栏Java学习123

windows环境下 curl 安装和使用

41160
来自专栏Laoqi's Linux运维专列

设置grub密码

15030
来自专栏清风

反向代理 nginx 配置 原

11040
来自专栏虚拟化云计算

qemu-libvirt-磁盘加密

# qemu-img convert -f qcow2 -O qcow2 -o encryption template.img encry.qcow2

53280
来自专栏主机笔记

腾讯云解封25端口

在使用腾讯云的服务器的时候,有时候需要发送邮件,但是默认是不开放25端口的,需要去官网控制台手动解除,这里记录下方法。 首先在控制台右上角找到自己的名字,鼠标悬...

5.4K140

扫码关注云+社区

领取腾讯云代金券