专栏首页云计算教程系列使用腾讯云SSL证书保护你的Nginx服务器
原创

使用腾讯云SSL证书保护你的Nginx服务器

介绍

腾讯云SSL是一个新的证书颁发机构(CA),它提供了一种获取和安装免费TLS /SSL证书的简便方法,从而在Web服务器上启用加密的HTTPS。您可以在腾讯云Web页面轻松获取免费的SSL证书,无论您选择哪种Web服务器软件。

在本教程中,我们将向您展示如何使用腾讯云来获取免费的SSL证书,并将其与Debian 8上的Nginx一起使用。如果您正在运行其他Web服务器,只需按照Web服务器的文档了解如何在您的设置中使用证书。

准备

在学习本教程之前,您需要做一些事情。

  • 你应该有一个Debian 8服务器和一个拥有sudo权限的非root用户。我们建议您使用腾讯云免费开发者实验室进行试验,或点击这里购买服务器。
  • 您必须拥有您希望使用证书的注册域名。注册域名请点击这里
  • 请确保创建一个A记录,将您的域指向服务器的公共IP地址。我们的设置将使用example.comwww.example.com作为域名,因此需要两个DNS记录。您可以使用腾讯云的云解析服务做快速设置。

一旦您完成了所有准备项,我们将继续安装腾讯云SSL客户端软件。

第一步:获取SSL证书

注册帐号

腾讯云平台申请证书首先需要注册腾讯云帐号并且完成实名认证。

1) 新用户请单击腾讯云官网顶部的【注册】按钮,进入注册页面。

2) 填写资料完成注册。

3) 完成实名认证,方可继续申请证书。

申请免费证书

1) 进入SSL证书管理控制台,单击【申请证书】。

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

完成域名身份验证

提交申请后,需要完成域名身份验证方可获取证书,具体可参考域名验证指引

下载和部署

完成域名审核后,颁发的证书可下载到本地,或者部署到腾讯云相关云服务。

获取证书

下载获得证书后,您将拥有以下PEM编码文件:

Nginx文件夹内获得SSL证书文件1_www.domain.com_bundle.crt和私钥文件 2_www.domain.com.key,

1_www.domain.com_bundle.crt 文件包括两段证书代码 “-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----2_www.domain.com.key文件包括一段私钥代码“-----BEGIN RSA PRIVATE KEY-----”和“-----END RSA PRIVATE KEY-----”。

稍后,您将配置Web服务器以1_www.domain.com_bundle.crt用作证书文件和2_www.domain.com.key证书密钥文件。

第二步:在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流量。所需的过程取决于您使用的防火墙软件。如果您当前没有配置防火墙,请跳过本步骤。

UFW

如果您使用的是ufw,则可以通过输入以下内容来查看当前设置:

sudo ufw status

它可能看起来像这样,这意味着只允许HTTP流量进入Web服务器:

Status: active
​
To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW                        ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW (v6)                   ALLOW       Anywhere (v6)

为了进一步允许HTTPS流量,我们可以允许“WWW Full”配置文件,然后删除冗余的“WWW”配置文件:

sudo ufw allow 'WWW Full'
sudo ufw delete allow 'WWW'

您的状态现在应该如下所示:

sudo ufw status
Status: active
​
To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)

现在,您的服务器应接受HTTPS请求。

iptables

如果您正在使用iptables,可以通过输入以下内容来查看当前规则:

sudo iptables -S

如果您启用了任何规则,则会显示。示例配置可能如下所示:

-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

打开SSL流量所需的命令取决于您当前的规则。对于像上面那样的基本规则集,您可以通过输入以下内容来添加SSL访问:

sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

如果我们再次查看防火墙规则,我们应该可以看到新规则:

sudo iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

如果您使用iptables程序在引导时自动应用规则,则需要确保使用新规则更新配置。

第四步:启用Nginx中的更改

现在我们已经进行了更改并调整了防火墙,我们可以重新启动Nginx以实现我们的新更改。

首先,我们应该检查以确保我们的文件中没有语法错误。我们可以通过输入以下内容来执行

sudo nginx -t

如果一切顺利,您将得到如下结果:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果输出与上述内容匹配,则配置文件没有语法错误。我们可以安全地重启Nginx以实现我们的更改:

sudo systemctl restart nginx

腾讯云SSL的TLS /SSL证书现已到位,防火墙现在允许流量到端口80和443。此时,您应该通过在Web浏览器中通过HTTPS访问您的域来测试TLS/ SSL证书。

结论

现在,你已经学会如何使用腾讯云的SSL来配置您的Nginx服务器啦!赶快申请一台服务器进行尝试吧,更多Linux教程请前往腾讯云+社区学习。


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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在CentOS 7上使用Barman备份,恢复和迁移PostgreSQL数据库

    PostgreSQL是一个开源数据库平台,因其易于维护,成本效益以及与其他开源技术的简单集成而广受网络和移动应用程序开发人员的欢迎。

    你在哪里
  • 如何在Ubuntu 18.04上安装Apache Kafka

    Apache Kafka是一种流行的分布式消息代理,旨在有效处理大量实时数据。Kafka集群不仅具有高度可扩展性和容错性,而且与其他消息代理(如ActiveMQ...

    你在哪里
  • 如何在Ubuntu 14.04上使用Apache将www重定向到非www

    当你有你的网站或应用程序启动和运行一个域的背后,则是经常需要还允许用户通过简单的域名访问到它,并在WWW子域名。也就是说,他们应该可以使用或不使用“ www. ...

    你在哪里
  • Nginx负载均衡和HTTPS配置及集群搭建

    Session共享问题解决方案: 由于请求先通过Nginx代理服务器,再有nginx服务器分配请求到具体的应用服务器中间就会遇到Session共享问题:

    HUC思梦
  • nginx从http跳转到https

    项目前期使用http,后期为了安全方面的考虑,启用了https。 项目架构:前端使用nginx作为多个tomcat实例的反向代理和负载均衡。 实际上只需要在...

    2Simple
  • BraTS18——多模态MR图像脑肿瘤分割挑战赛续9

    今天将继续分享从网络结构上进行改进提出ETVNet模型来分割脑肿瘤。为了方便大家学习理解整个分割流程,我将整个流程步骤进行了整理,并给出每个步骤的结果,希望对大...

    用户7498388
  • 掌握运维必备技能--问题故障定位

    a. on-CPU:执行中,执行中的时间通常又分为用户态时间user和系统态时间sys。

    用户6543014
  • Linux问题故障定位,看这一篇就够了

    有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有...

    十四君
  • (一)Centos7下 Tengine安装和配置

    Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型...

    botkenni
  • logging模块学习笔记:logger 对象、日志等级

    logger:日志对象,logging模块中最基础的对象,用logging.getLogger(name)方法进行初始化,name可以不填。通常logger的名...

    于小勇

扫码关注云+社区

领取腾讯云代金券