此教程的早期版本是由 Justin Ellingwood_
介绍
TLS(Transport Layer Security)和其前身 SSL(Secure Sockets Layer)是用于将正常流量包装到受保护的加密包装中使用的网络协议。
使用这种技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性,证书系统还帮助用户验证他们正在连接的网站的身份。
在本指南中,我们将向您展示如何在 Debian 9 服务器上使用自签名的 SSL 证书。
注: 一个自签证书将加密服务器和任何客户端之间的通信,但是,由于它不是由包含在 Web 浏览器中的任何一个受信任的证书机构签署的,用户无法使用该证书自动验证您的服务器的身份。
如果您没有与您的服务器相关联的域名,并且加密的 Web 接口不针对用户,则可以使用自签名的证书。如果您有域名,在许多情况下最好使用 CA 签名的证书。
前提条件
在你开始之前,你应该有一个非根用户配置了sudo
权限,你可以通过遵循我们的 Debian 9 的初始服务器设置来学习如何设置这样的用户帐户。
如果你想在你的服务器上安装一个完整的LEMP(Linux, Nginx,MySQL,PHP)堆栈,你可以遵循我们的指南在 Debian 9上设置LEMP。
如果您只想使用 Nginx 網頁伺服器,您可以按照我們的指南在 Debian 9 上安裝 Nginx執行。
完成前提条件后,继续下方。
第1步:创建SSL证书
TLS/SSL通过使用公共证书和私钥的组合工作 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在服务器启动时能够读取文件,而无需用户干预. 密码句可以防止这种情况发生,因为我们必须在每次重启后输入。
- ** 天数 365** :此选项设定证书被视为有效的时间长度。 我们在这里定了一年 *-新ersa:2048 : 它指定我们要同时生成新的证书和新的密钥 。 我们没有在前一个步骤中创建签名证书所需的密钥,所以我们需要与证书一起创建证书. `rsa:2048'部分要求它制作长为2048比特的RSA密钥。
- **- keyout ** :此行告诉 OpenSSL 将生成的私有密钥文件放置在哪里 。
- 联合国 ** 退出** : 这告诉 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) []: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网站上的建议,该网站旨在为流行的软件提供易于使用的加密设置。
<$>[注意]上面的网站上的建议设置提供强大的安全性。有时,这会以更大的客户端兼容性为代价。如果您需要支持较旧的客户端,有一个替代列表可以通过点击页面上的链接来访问,标签为`是的,给我一个与传统 / 旧软件工作的加密套件。
您使用的配置选项将很大程度上取决于您需要支持的内容,这两者都将提供极好的安全性。
为了我们的目的,我们可以复制提供的设置全部. 我们只需要做一些小修改。
首先,我们将为上游请求添加我们的偏好DNS解析器,我们将使用Google的此指南。
其次,我们将评论设置严格运输安全标题的行。在不评论此行之前,您应该花一会儿时间阅读有关HTTP严格运输安全(或HSTS)(https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security),特别是关于重新加载
功能(https://hstspreload.appspot.com/)。
将下列内容复制到您的 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
目录中的自定义服务器封锁配置文件,我们将为此示例使用/etc/nginx/sites-available/example.com
。
在我们进一步前,让我们备份我们当前的配置文件:
1sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com.bak
现在,打开配置文件以进行调整:
1sudo nano /etc/nginx/sites-available/example.com
内部,您的服务器封锁可能开始类似于此:
1[label /etc/nginx/sites-available/example.com]
2server {
3 listen 80;
4 listen [::]:80;
5
6 server_name example.com www.example.com;
7
8 root /var/www/example.com/html;
9 index index.html index.htm index.nginx-debian.html;
10
11 . . .
12}
您的文件可能以不同的顺序,而不是根
和索引
指令,您可能有一些位置
,proxy_pass
或其他自定义配置声明。这很好,因为我们只需要更新倾听
指令并包括我们的SSL片段。我们将修改现有的服务器块来服务SSL流量在端口443,然后创建一个新的服务器块来响应端口80并自动重定向流量到端口443。
注意:我们将使用302重定向,直到我们确认一切正常工作,随后,我们可以更改到永久的301重定向。
在现有的配置文件中,更新两个倾听
语句以使用端口443和SSL,然后包括我们在上一步创建的两个片段文件:
1[label /etc/nginx/sites-available/example.com]
2server {
3 listen 443 ssl;
4 listen [::]:443 ssl;
5 include snippets/self-signed.conf;
6 include snippets/ssl-params.conf;
7
8 server_name example.com www.example.com;
9
10 root /var/www/example.com/html;
11 index index.html index.htm index.nginx-debian.html;
12
13 . . .
14}
接下来,将第二个服务器块粘贴到配置文件中,在第一个块的关闭支架(}
)后:
1[label /etc/nginx/sites-available/example.com]
2. . .
3server {
4 listen 80;
5 listen [::]:80;
6
7 server_name example.com www.example.com;
8
9 return 302 https://$server_name$request_uri;
10}
This is a bare-bones configuration that listens on port 80 and performs the redirect to HTTPS. Save and close the file when you are finished editing it.
Step 3 — Adjusting the Firewall
If you have the ufw
firewall enabled, as recommended by the prerequisite guides, you'll need to adjust the settings to allow for SSL traffic. Luckily, Nginx registers a few profiles with ufw
upon installation.
We can see the available profiles by typing:
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)
步骤4:启用 Nginx 中的更改
现在,我们已经进行了更改并调整了防火墙,我们可以重新启动 Nginx 来实施新的更改。
首先,我们应该检查,以确保我们的文件中没有语法错误,我们可以通过键入:
1sudo nginx -t
如果一切顺利,你会得到一个看起来像这样的结果:
1[secondary_label Output]
2nginx: [warn] "ssl_stapling" ignored, issuer certificate not found
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
步骤5:测试加密
现在,我们已经准备好测试我们的SSL服务器。
打开您的网页浏览器,然后输入https://
,然后输入您的服务器的域名或IP地址栏:
1https://server_domain_or_IP
由于我们创建的证书不是由您浏览器的可信证书机构之一签署的,您可能会看到一个看起来可怕的警告,如下面的警告(使用Google Chrome时会显示以下内容):
我们只对我们的证书的加密方面感兴趣,而不是第三方验证我们的主机的真实性。点击ADVANCED
,然后提供的链接可以继续到您的主机:
你应该被带到你的网站. 如果你看浏览器地址栏,你会看到一个锁有x
在它上面. 在这种情况下,这只是意味着证书不能验证。
如果您配置了 Nginx 用两个服务器块,自动将 HTTP 内容重定向到 HTTPS,您还可以检查重定向是否正常工作:
1http://server_domain_or_IP
如果这导致相同的图标,这意味着您的重定向工作正确。
步骤 6 — 更改到永久重定向
如果您的重定向工作正确,并且您确信只希望允许加密流量,您应该修改 Nginx 配置以使重定向永久。
再次打开服务器封锁配置文件:
1sudo nano /etc/nginx/sites-available/example.com
找到返回302
并将其更改为返回301
:
1[label /etc/nginx/sites-available/example.com]
2 return 301 https://$server_name$request_uri;
保存并关闭文件。
检查您的配置语法错误:
1sudo nginx -t
当你准备好时,重新启动 Nginx 以使重定向永久:
1sudo systemctl restart nginx
结论
您已配置您的 Nginx 服务器以使用强大的加密为客户端连接,这将允许您安全地服务请求,并防止外部人员阅读您的流量。