如何在Debian 8上为Nginx创建自签名SSL证书

TLS或传输层安全性,而其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装器中的Web协议。使用此技术,服务器可以在服务器和客户端之间安全地发送流量...

介绍

TLS或传输层安全,它的前身SSL,它代表安全套接字层,是Web协议用来包裹在一个受保护,加密封装正常通行。 使用此技术,服务器可以在服务器和客户端之间安全地发送流量,而不会有外部各方拦截消息的可能性。证书系统还帮助用户验证他们正在连接的站点的身份。 在本指南中,我们将向您展示如何设置一个自签名SSL证书,以便与Debian 8服务器上的Nginx Web服务器配合使用。 注:自签名证书将在您的服务器和所有客户端之间的通信进行加密。但是,由于它未由Web浏览器中包含的任何受信任的证书颁发机构签名,因此用户无法使用该证书自动验证服务器的身份。 如果您没有与服务器关联的域名,并且对于加密的Web界面不是面向用户的情况,自签名证书可能是适当的。如果您有一个域名,在很多情况下,最好使用CA签发的证书。 你可以了解如何建立与咱们加密项目的自由受信任的证书这里

先决条件

在开始之前,你应该有一个配置非root用户sudo权限。 你可以学习如何按照我们建立这样一个用户帐户为Debian 8初始服务器设置 。 您还需要安装Nginx Web服务器。如果你想在服务器上安装一个完整的LEMP(Linux的,Nginx的,MySQL和PHP)栈,你可以按照我们的指导Debian 8 设置LEMP 。 如果你只是想Nginx的网络服务器,可以改为遵循我们的指南在Debian安装8 Nginx的 。 完成先决条件后,请继续下面。

第1步:创建SSL证书

TLS / SSL通过使用公共证书和私钥的组合工作。 SSL密钥在服务器上保密。它用于加密发送到客户端的内容。 SSL证书与请求内容的任何人公开共享。它可以用于解密由关联的SSL密钥签名的内容。 我们可以在单个命令中使用OpenSSL创建自签名密钥和证书对:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
你会被问到一系列的问题。在我们讨论之前,让我们来看看我们发出的命令发生了什么:
  • OpenSSL的 :这是用于创建和管理OpenSSL的证书,密钥和其他文件的基本命令行工具。
  • REQ:此子命令指定我们要使用X.509证书签名请求(CSR)的管理。 “X.509”是SSL和TLS遵循的用于其密钥和证书管理的公钥基础结构标准。我们要创建一个新的X.509证书,所以我们使用这个子命令。
  • -x509:这进一步告诉我们要进行的,而不是生成一个证书签名请求的自签名证书的工具修改以前的子命令,因为通常会发生。
  • -nodes:这告诉OpenSSL的跳到使用密码保护我们的证书的选项。我们需要Nginx能够在服务器启动时读取文件,无需用户干预。口令将防止这种情况发生,因为我们必须在每次重新启动后输入。
  • -days 365:此选项设置的证书将被视为有效的时间长度。我们在这里设置了一年。
  • -newkey RSA:2048:指定我们要生成新的证书,并在同一时间一个新的密钥。 我们没有创建在上一步中签署证书所需的密钥,因此我们需要与证书一起创建。 在rsa:2048部分告诉它做的RSA密钥是2048位。
  • -keyout:这行告诉OpenSSL的在什么地方,我们正在创建的生成私钥文件。
  • 退房手续 :这告诉OpenSSL的在什么地方,我们正在创建的证书。
如上所述,这些选项将创建密钥文件和证书。我们将被问到关于我们的服务器的几个问题,以便将信息正确地嵌入到证书中。 适当填写提示。最重要的线是要求一个Common Name (eg server FQDN or YOUR name) 您需要输入与您的服务器关联的域名,或更可能输入您的服务器的公共IP地址。 整个提示将如下所示:
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com
两者所创建的文件将被放置在适当的子目录/etc/ssl目录。 当我们使用OpenSSL,我们也应该建立一个强大的Diffie-Hellman组,这是在谈判中使用完全正向保密与客户。 我们可以通过键入:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
这可能需要几分钟,但是当它这样做,你将有一个强大的DH组/etc/ssl/certs/dhparam.pem ,我们可以在我们的配置中使用。

第2步:配置Nginx使用SSL

我们已经创建了我们的下密钥和证书文件/etc/ssl目录。现在我们只需要修改我们的Nginx配置以利用这些。 我们将对我们的配置进行一些调整。
  1. 我们将创建一个包含我们的SSL密钥和证书文件位置的配置片段。
  2. 我们将创建一个配置代码段,其中包含可用于将来的任何证书的强SSL设置。
  3. 我们将调整我们的Nginx服务器块来处理SSL请求,并使用上面的两个片段。
这种配置Nginx的方法将允许我们保持干净的服务器块,并将公共配置段放入可重用的模块。

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

首先,让我们创建了一个新的Nginx的配置片段/etc/nginx/snippets目录。 要正确区分这个文件的目的,让我们把它叫做self-signed.conf
sudo nano /etc/nginx/snippets/self-signed.conf
在这个文件中,我们只需要在设置ssl_certificate指令对我们的证书文件和ssl_certificate_key到相关的关键。在我们的例子中,这将是这样的:
/etc/nginx/snippets/self-signed.conf
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
添加这些行后,保存并关闭文件。

创建具有强加密设置的配置代码段

接下来,我们将创建另一个代码段,定义一些SSL设置。这将设置Nginx与一个强大的SSL加密套件,并启用一些高级功能,将有助于保持我们的服务器安全。 我们将设置的参数可以在将来的Nginx配置中重用,因此我们将给文件一个通用名称:
sudo nano /etc/nginx/snippets/ssl-params.conf
要设置Nginx的SSL安全,我们将利用这些建议Remi面包车埃尔斯特Cipherli.st网站。 此网站旨在为流行软件提供易于使用的加密设置。 你可以阅读更多关于他对Nginx的选择,决定在这里 。 与上述链接的网站上的建议设置提供了强大的安全性。有时,这是以增加客户端兼容性为代价的。如果您需要支持较旧的客户端,还有一个备用列表,可以通过单击页面上标记为“是,给我一个与旧版软件一起使用的密码集”的链接来访问。该列表可以替代以下复制的项目。 选择使用哪个配置很大程度上取决于您需要支持哪些配置。他们都将提供很大的安全性。 为了我们的目的,我们可以全部复制提供的设置。我们只需要做一些小的修改。 首先,我们将为上游请求添加我们首选的DNS解析器。我们将使用Google的本指南。我们也将继续,并设置ssl_dhparam设置为指向我们先前所产生的的Diffie-Hellman文件。 最后,你应该花点时间读上了HTTP严格传输安全,或HSTS ,特别是有关“预紧力”的功能 。预加载HSTS提供了更高的安全性,但如果意外启用或启用不正确,可能会产生深远的影响。在本指南中,我们不会预加载设置,但如果您确定您了解其含义,则可以修改此设置:
/etc/nginx/snippets/ssl-params.conf
# 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;

ssl_dhparam /etc/ssl/certs/dhparam.pem;
因为我们使用自签名证书,所以不会使用SSLStapling。 Nginx将简单地输出警告,禁用我们的自签名证书的Stapling,并继续正确操作。 保存并在完成后关闭文件。

将Nginx配置调整为使用SSL

现在我们有了我们的代码片段,我们可以调整我们的Nginx配置以启用SSL。 我们将本指南所使用的假设中default服务器模块文件中/etc/nginx/sites-available目录。如果使用不同的服务器块文件,请在以下命令中替换其名称。 在我们继续进行之前,让我们备份我们当前的服务器块文件:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
现在,打开服务器块文件进行调整:
sudo nano /etc/nginx/sites-available/default
在里面,你的服务器块可能开始像这样:
/ etc / nginx / sites-available / default
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指令,设置为您的服务器的域名,或者更可能的是,IP地址。然后我们将设置一个重定向到我们将要创建的第二个服务器块。之后,我们将关闭这个短块: 注意:我们将使用302重定向,直到我们已经验证,一切工作正常。之后,我们可以将其更改为永久301重定向。
/ etc / nginx / sites-available / default
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 302 https://$server_name$request_uri;
}

    # SSL configuration

    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;

    . . .
接下来,我们需要在下面直接启动一个新的服务器块来包含剩余的配置。我们可以取消这两个listen使用端口443之后,我们只需要包含我们设置了两个代码片段文件指令: 注意:您可能只有一个 listen指令,其中包括default_server每个IP的版本和端口组合修改。如果您对具有这些端口上启用其他的服务器块default_server设置,必须从块之一删除修改。
/ etc / nginx / sites-available / default
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 302 https://$server_name$request_uri;
}

server {

    # SSL configuration

    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

    . . .
保存并在完成后关闭文件。

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

如果你想要或需要允许加密和未加密的内容,你将不得不配置Nginx一点不同。这通常不推荐,如果它可以避免,但在某些情况下可能是必要的。基本上,我们只是将两个独立的服务器块压缩成一个块,并删除重定向:
/ etc / nginx / sites-available / default
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    server_name server_domain_or_IP;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

    . . .
保存并在完成后关闭文件。

第3步:调整防火墙

如果您启用了防火墙,则需要调整设置以允许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在开机的规则,你将要确保你的新规则更新配置。

第4步:启用Nginx中的更改

现在我们已经进行了更改并调整了防火墙,我们可以重新启动Nginx来实现我们的新更改。 首先,我们应该检查以确保我们的文件中没有语法错误。我们可以通过键入:
sudo nginx -t
如果一切都成功,你会得到一个如下所示的结果:
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
请注意开始时的警告。如前所述,此特定设置会发出警告,因为我们的自签名证书不能使用SSLStapling。这是预期的,我们的服务器仍然可以正确加密连接。 如果您的输出与上述匹配,则您的配置文件没有语法错误。我们可以安全地重新启动Nginx来实现我们的更改:
sudo systemctl restart nginx
我们的服务器现在应该可以通过HTTPS访问。

第5步:测试加密

现在,我们准备测试我们的SSL服务器。 打开Web浏览器并输入https:// ,后跟服务器的域名或IP到地址栏:
https://server_domain_or_IP
因为我们创建的证书不是由您的浏览器的可信证书颁发机构签名的,因此您可能会看到类似下面的警告: Nginx自签名证书警告 这是预期和正常的。我们只对我们的证书的加密方面感兴趣,而不是第三方验证我们的主机的真实性。点击“ADVANCED”,然后提供的链接继续到你的主机: Nginx自签名重写 您应该被带到您的网站。如果您在浏览器地址栏中看到,您将看到一些部分安全的指示。这可能是一个带有“x”的锁,或带有感叹号的三角形。在这种情况下,这只是意味着无法验证证书。它仍在加密您的连接。 如果您配置Nginx有两个服务器块,自动将HTTP内容重定向到HTTPS,您还可以检查重定向功能是否正确:
http://server_domain_or_IP
如果这导致相同的图标,这意味着您的重定向工作正常。

第6步:更改为永久重定向

如果您的重定向工作正常,并且您确定要仅允许加密流量,您应该修改Nginx配置以使重定向永久。 再次打开服务器块配置文件:
sudo nano /etc/nginx/sites-available/default
找到return 302并将其更改为return 301
/ etc / nginx / sites-available / default
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 301 https://$server_name$request_uri;
}

. . .
保存并关闭文件。 检查您的配置是否有语法错误:
sudo nginx -t
当你准备好,重新启动Nginx使重定向永久:
sudo systemctl restart nginx
您的网站现在应通过HTTP访问时发出永久重定向。

结论

您已将Nginx服务器配置为对客户端连接使用强加密。这将允许您安全地提供请求,并防止外部各方读取您的流量。