介绍
TLS,或运输层安全,及其前身 SSL,即安全接口层,是用于在受保护的加密包装中包装正常流量的Web协议。
使用这种技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性,证书系统还帮助用户验证他们正在连接的网站的身份。
在本指南中,我们将向您展示如何在 Debian 10 服务器上使用自签名的 SSL 证书。
<$>[note] 注: 一个自签名的证书将加密服务器和任何客户端之间的通信,但是,由于它不是由网络浏览器中包含的任何值得信赖的证书授权机构签署的,用户无法使用该证书自动验证您的服务器的身份。
如果您没有与您的服务器相关联的域名,并且加密的 Web 接口不针对用户,则可以使用自签名的证书。如果您有域名,在许多情况下最好使用 CA 签名的证书。 若要了解如何使用 Let's Encrypt 项目设置免费的可信证书,请参阅 How to Secure Nginx with Let's Encrypt on Debian 10。
前提条件
- 一个 Debian 10 服务器,一个具有
sudo
特权的非根用户和一个活跃的防火墙. 要设置这些东西,请遵循 Debian 10 的初始服务器设置教程。 - Nginx 安装在您的服务器上,然后是 如何在 Debian 10 上安装 Nginx。
步骤1:创建SSL证书
TLS/SSL通过使用公共证书和私钥的组合来工作. SSL 密钥在服务器上保密,用于加密发送给客户端的内容. SSL 证书与任何要求内容的人公开共享。
我们可以用OpenSSL在一个命令中创建一个自签名的密钥和证书对:
1sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
在我们谈论这一点之前,让我们看看我们发出的命令中发生了什么:
*开放 : 这是创建和管理 OpenSSL 证书、密钥和其他文件的基本命令行工具。
- req : 此子命令指定我们要使用 X. 509 证书签名请求( CSR) 管理 。 "X.509"是SSL和TLS为其密钥和证书管理所遵循的公钥基础设施标准. 我们要创建一个新的 X. 509 证书, 所以我们正在使用此子命令 。 {} ** -- -- x509** : 这进一步修改了上一个子命令,告诉了我们想要制作自签名的证书而不是像通常那样生成证书签名请求的效用. *-节点 :这告诉OpenSSL跳过一个选项,用密码句来保护我们的证书. 我们需要Nginx在服务器启动时能够读取文件而无需用户干预. 密码句可以防止这种情况发生, 因为每次重启后我们必须输入密码句 。
- - days 365 :此选项设定证书被视为有效的时间长度。 我们在这里定了一年。 它指定我们要同时生成新的证书和新的密钥 。 我们没有在前一个步骤中创建签名证书所需的密钥,所以我们需要与证书一起创建.
rsa: 2048
部分要求它制作一个长为 2048 位的 RSA 密钥。 - **- keyout ** : 此行告诉 OpenSSL 将我们创建的生成的私有密钥文件放置在哪里 。
- **-out ** : 这告诉 OpenSSL 将我们创建的证书放在哪里 。
如上所述,这些选项将创建一个密钥文件和一个证书,我们将被问到关于我们的服务器的几个问题,以便正确嵌入证书中的信息。
正确地填写提示。 ** 最重要的行是请求常用名称(例如服务器FQDN或您的名称)
的行。
整个提示将看起来像这样的东西:
1[secondary_label Output]
2Country Name (2 letter code) [AU]:US
3State or Province Name (full name) [Some-State]:New York
4Locality Name (eg, city) []:New York City
5Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
6Organizational Unit Name (eg, section) []:Ministry of Water Slides
7Common Name (e.g. server FQDN or YOUR name) []:your_domain_or_server_IP_address
8Email Address []:admin@your_domain.com
您创建的两个文件都将放置在 /etc/ssl
目录的相应子目录中。
虽然我们正在使用OpenSSL,但我们也应该创建一个强大的Diffie-Hellman集团,用于与客户商讨 完美向前保密。
我们可以通过键入这样做:
1sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
这将需要一段时间,但一旦完成,您将有一个强大的DH组在/etc/nginx/dhparam.pem
,您可以在您的配置中使用。
步骤 2 — 配置 Nginx 以使用 SSL
我们在/etc/ssl
目录下创建了我们的密钥和证书文件,现在我们只需要修改我们的 Nginx 配置以利用这些。
我们将对我们的配置做一些调整。
我们将创建一个包含我们的 SSL 密钥和证书文件位置的配置片段。 2 我们将创建一个包含强大的 SSL 设置的配置片段,可以在未来与任何证书一起使用。 3 我们将调整我们的 Nginx 服务器块来处理 SSL 请求,并使用上述两个片段。
这种配置 Nginx 的方法将使我们能够保持服务器块的清洁,并将常见的配置部分放入可重复使用的模块中。
创建指向 SSL 密钥和证书的配置片段
首先,让我们在/etc/nginx/snippets
目录中创建一个新的 Nginx 配置片段。
要正确区分这个文件的目的,让我们把它称为self-signed.conf
:
1sudo nano /etc/nginx/snippets/self-signed.conf
在此文件中,我们需要将ssl_certificate
指令设置为我们的证书文件,并将ssl_certificate_key
设置为相关密钥。
1[label /etc/nginx/snippets/self-signed.conf]
2ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
3ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
添加这些行后,保存并关闭文件。
使用强大的加密设置创建配置剪辑
接下来,我们将创建另一个片段,将定义一些SSL设置,这将为 Nginx设置一个强大的SSL加密套件,并允许一些先进的功能,这将有助于保持我们的服务器安全。
我们将设置的参数可以在未来的 Nginx 配置中重复使用,因此我们将给该文件一个通用名称:
1sudo nano /etc/nginx/snippets/ssl-params.conf
为了安全地设置 Nginx SSL,我们将使用 Remy van Elst 在 Cipherli.st 网站上的建议,该网站旨在为流行的软件提供易于使用的加密设置。
<$>[note] **注: ** Cipherli.st网站上的建议设置提供了强大的安全性,有时这会以更高的客户端兼容性为代价。如果您需要支持较旧的客户端,您可以通过点击标签的页面上的链接来访问一个替代列表。
您使用的配置选项将很大程度上取决于您需要支持的内容,这两者都将提供极好的安全性。
为了我们的目的,我们可以复制提供的设置全部. 我们只需要做一些小修改。
首先,我们将为上游请求添加我们的偏好DNS解析器,我们将使用Google的此指南。
其次,我们将评论设置严格运输安全标题的行。在不评论此行之前,您应该花一会儿时间阅读 HTTP 严格运输安全,或 HSTS,特别是其 重新加载
功能。
将下列内容复制到您的 ssl-params.conf 片段文件中:
1[label /etc/nginx/snippets/ssl-params.conf]
2ssl_protocols TLSv1.2;
3ssl_prefer_server_ciphers on;
4ssl_dhparam /etc/nginx/dhparam.pem;
5ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
6ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
7ssl_session_timeout 10m;
8ssl_session_cache shared:SSL:10m;
9ssl_session_tickets off; # Requires nginx >= 1.5.9
10ssl_stapling on; # Requires nginx >= 1.3.7
11ssl_stapling_verify on; # Requires nginx => 1.3.7
12resolver 8.8.8.8 8.8.4.4 valid=300s;
13resolver_timeout 5s;
14# Disable strict transport security for now. You can uncomment the following
15# line if you understand the implications.
16# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
17add_header X-Frame-Options DENY;
18add_header X-Content-Type-Options nosniff;
19add_header X-XSS-Protection "1; mode=block";
由于我们使用的是自签证书,所以不会使用SSL堆积。 Nginx会发出警告,但会继续正常运作。
保存并关闭文件,当你完成。
调整 Nginx 配置以使用 SSL
现在我们有我们的片段,我们可以调整我们的 Nginx 配置以启用 SSL。
在本指南中,我们将假设您正在使用/etc/nginx/sites-available
目录中的自定义服务器封锁配置文件,如在安装 Nginx 的先决条件教程的 步骤 5中所述。
在我们进一步前,让我们备份我们当前的配置文件:
1sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak
现在,打开配置文件以进行调整:
1sudo nano /etc/nginx/sites-available/your_domain
如果您遵循前提条件,您的服务器块将看起来像这样:
1[label /etc/nginx/sites-available/your_domain]
2server {
3 listen 80;
4 listen [::]:80;
5
6 root /var/www/your_domain/html;
7 index index.html index.htm index.nginx-debian.html;
8
9 server_name your_domain www.your_domain;
10
11 location / {
12 try_files $uri $uri/ =404;
13 }
14
15}
您的文件可能以不同的顺序,而不是根
和索引
指令,您可能有一些位置
,proxy_pass
或其他自定义配置声明。这很好,因为我们只需要更新倾听
指令并包括我们的SSL片段。我们将修改现有的服务器块来服务SSL流量在端口443
,然后创建一个新的服务器块来响应端口80
,并自动重定向流量到端口443
。
<$>[注] 注: 我们将使用302重定向,直到我们确认一切正常工作。
在现有的配置文件中,更新两个倾听
语句以使用端口443
和SSL,然后包括我们在上一步创建的两个片段文件:
1[label /etc/nginx/sites-available/your_domain]
2server {
3 listen 443 ssl;
4 listen [::]:443 ssl;
5 include snippets/self-signed.conf;
6 include snippets/ssl-params.conf;
7
8 root /var/www/your_domain/html;
9 index index.html index.htm index.nginx-debian.html;
10
11 server_name your_domain www.your_domain;
12
13 . . .
14}
接下来,将第二个服务器块粘贴到配置文件中,在第一个块的关闭支架(}
)后:
1[label /etc/nginx/sites-available/your_domain]
2. . .
3server {
4 listen 80;
5 listen [::]:80;
6
7 server_name your_domain www.your_domain;
8
9 return 302 https://$server_name$request_uri;
10}
这是一个裸体配置,在端口80
上倾听并执行重定向到HTTPS。
步骤三:调整防火墙
如果您已启用ufw
防火墙,根据前提指南的建议,您将需要调整设置以允许SSL流量。
我们可以通过键入查看可用的配置文件:
1sudo ufw app list
你应该看到这样的列表:
1[secondary_label Output]
2Available applications:
3. . .
4 Nginx Full
5 Nginx HTTP
6 Nginx HTTPS
7. . .
您可以通过键入查看当前设置:
1sudo ufw status
如果您遵循前提条件,它将看起来像这样,这意味着只有HTTP流量被允许到Web服务器:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
7Nginx HTTP ALLOW Anywhere
8OpenSSH (v6) ALLOW Anywhere (v6)
9Nginx HTTP (v6) ALLOW Anywhere (v6)
为了进一步允许HTTPS流量,我们可以允许Nginx Full
配置文件,然后删除余额的Nginx HTTP
配置文件允许:
1sudo ufw allow 'Nginx Full'
2sudo ufw delete allow 'Nginx HTTP'
你的状态现在应该是这样的:
1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
7Nginx Full ALLOW Anywhere
8OpenSSH (v6) ALLOW Anywhere (v6)
9Nginx Full (v6) ALLOW Anywhere (v6)
随着我们的防火墙正确配置,我们可以继续测试我们的 Nginx 配置。
步骤 4 – 启用 Nginx 中的更改
现在,我们已经进行了更改并调整了防火墙,我们可以重新启动 Nginx 来实施新的更改。
首先,我们应该检查,以确保我们的文件中没有语法错误,我们可以通过键入:
1sudo nginx -t
如果一切顺利,你会得到一个看起来像这样的结果:
1[secondary_label Output]
2nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
3nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
4nginx: configuration file /etc/nginx/nginx.conf test is successful
如前所述,这个特定的设置会发出警告,因为我们的自签证证书不能使用SSL堆栈,这是预期的,我们的服务器仍然可以正确加密连接。
如果您的输出匹配上述,您的配置文件没有语法错误. 我们可以安全地重新启动 Nginx 来实现我们的更改:
1sudo systemctl restart nginx
随着我们的 Nginx 配置进行了测试,我们可以继续测试我们的设置。
步骤5:测试加密
我们现在已经准备好测试我们的SSL服务器。
打开您的网页浏览器,然后输入https://
,然后输入您的服务器的域名或IP地址栏:
1https://your_domain_or_server_IP
由于我们创建的证书不是由您浏览器的可信证书机构之一签署的,您可能会看到一个看起来可怕的警告,如下面的警告(使用Google Chrome时会显示以下内容):
我们只对我们的证书的加密方面感兴趣,而不是我们主机的第三方验证。 点击ADVANCED
,然后提供的链接继续到您的主机:
你应该被带到你的网站. 如果你看浏览器地址栏,你会看到一个锁有x
在它上面. 在这种情况下,这只是意味着证书不能验证。
如果您配置了 Nginx 用两个服务器块,自动将 HTTP 内容重定向到 HTTPS,您还可以检查重定向是否正常工作:
1http://server_domain_or_IP
如果这导致相同的图标,这意味着您的重定向工作正确。
步骤 6 – 更改到永久重定向
如果您的重定向工作正确,并且您确信只希望允许加密流量,您应该修改 Nginx 配置以使重定向永久。
再次打开服务器封锁配置文件:
1sudo nano /etc/nginx/sites-available/your_domain^>
找到返回302
并将其更改为返回301
:
1[label /etc/nginx/sites-available/your_domain]
2 return 301 https://$server_name$request_uri;
保存并关闭文件。
检查您的配置语法错误:
1sudo nginx -t
当你准备好时,重新启动 Nginx 以使重定向永久:
1sudo systemctl restart nginx
结论
您已配置您的 Nginx 服务器以使用强大的加密为客户端连接,这将允许您安全地服务请求,并防止外部人员阅读您的流量。