介绍
TLS(Transport Layer Security)和其前身 SSL(Secure Sockets Layer)是用于将正常流量包装到受保护的加密包装中使用的网络协议。
使用这种技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性,证书系统还帮助用户验证他们正在连接的网站的身份。
在本指南中,我们将向您展示如何在 Debian 8 服务器上使用自签名的 SSL 证书。
注: 一个自签证书将加密服务器和任何客户端之间的通信,但是,由于它不是由包含在 Web 浏览器中的任何一个受信任的证书机构签署的,用户无法使用该证书自动验证您的服务器的身份。
如果您没有与服务器相关联的域名,并且加密的 Web 接口不针对用户,则可以使用自签名证书,如果您有域名,在许多情况下最好使用 CA 签名的证书。
前提条件
在你开始之前,你应该有一个非根用户配置了sudo
权限,你可以通过遵循我们的 Debian 8 的初始服务器设置来学习如何设置这样的用户帐户。
如果你想在你的服务器上安装一个完整的LEMP(Linux, Nginx,MySQL,PHP)堆栈,你可以遵循我们的指南在 Debian 8上设置LEMP。
如果您只想使用 Nginx 網頁伺服器,您可以按照我們的指南在 Debian 8 上安裝 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/ssl/certs/dhparam.pem 2048
这可能需要几分钟,但一旦完成,您将有一个强大的DH组在/etc/ssl/certs/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 的此指南,我们还将继续设置 ssl_dhparam
设置,以指向我们先前生成的 Diffie-Hellman 文件。
最后,您应该花一会儿时间阅读 HTTP 严格运输安全,或 HSTS,特别是关于 重新加载
功能。 预加载 HSTS 提供了更高的安全性,但如果意外启用或不正确启用,可能会产生深远的后果。
1[label /etc/nginx/snippets/ssl-params.conf]
2# from https://cipherli.st/
3# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
4
5ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
6ssl_prefer_server_ciphers on;
7ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
8ssl_ecdh_curve secp384r1;
9ssl_session_cache shared:SSL:10m;
10ssl_session_tickets off;
11ssl_stapling on;
12ssl_stapling_verify on;
13resolver 8.8.8.8 8.8.4.4 valid=300s;
14resolver_timeout 5s;
15# Disable preloading HSTS for now. You can use the commented out header line that includes
16# the "preload" directive if you understand the implications.
17#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
18add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
19add_header X-Frame-Options DENY;
20add_header X-Content-Type-Options nosniff;
21
22ssl_dhparam /etc/ssl/certs/dhparam.pem;
由于我们使用的是自签证书,所以不会使用SSL堆积。 Nginx只会发出警告,禁用我们自签证的堆积,并继续正常运作。
保存并关闭文件,当你完成。
调整 Nginx 配置以使用 SSL
现在我们有我们的片段,我们可以调整我们的 Nginx 配置以启用 SSL。
在本指南中,我们将假设您正在使用/etc/nginx/sites-available
目录中的默认
服务器封锁文件. 如果您正在使用不同的服务器封锁文件,请在下面的命令中替换其名称。
在我们进一步前,让我们备份我们当前的服务器封锁文件:
1sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
现在,打开服务器封锁文件以进行调整:
1sudo nano /etc/nginx/sites-available/default
內部,您的伺服器封鎖可能是這樣開始的:
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5
6 # SSL configuration
7
8 # listen 443 ssl default_server;
9 # listen [::]:443 ssl default_server;
10
11 . . .
我们将修改此配置,以便未加密的 HTTP 请求自动重定向到加密的 HTTPS. 这为我们的网站提供了最佳的安全性。
我们将将配置分为两个单独的块,在第一个两个倾听
指令之后,我们将添加一个server_name
指令,设置为您的服务器的域名或更有可能的IP地址,然后我们将设置重定向到我们将创建的第二个服务器块。
注意:我们将使用302重定向,直到我们确认一切正常工作,随后,我们可以更改到永久的301重定向。
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5 server_name server_domain_or_IP;
6 return 302 https://$server_name$request_uri;
7}
8
9 # SSL configuration
10
11 # listen 443 ssl default_server;
12 # listen [::]:443 ssl default_server;
13
14 . . .
接下来,我们需要直接在下方启动一个新的服务器块,以包含剩余的配置。我们可以拒绝使用端口443的两个倾听
指令。
<$>[注] ** 注:** 您可能只有一個 ** one ** 'listen' 指令,其中包含每个 IP 版本和端口组合的 `default_server' 修改器。
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5 server_name server_domain_or_IP;
6 return 302 https://$server_name$request_uri;
7}
8
9server {
10
11 # SSL configuration
12
13 listen 443 ssl default_server;
14 listen [::]:443 ssl default_server;
15 include snippets/self-signed.conf;
16 include snippets/ssl-params.conf;
17
18 . . .
保存并关闭文件,当你完成。
(替代配置) 允许 HTTP 和 HTTPS 流量
如果您想要或需要允许加密和未加密内容,您将不得不以稍微不同的方式配置 Nginx。如果可以避免,通常不建议这样做,但在某些情况下可能需要这样做。
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5 listen 443 ssl default_server;
6 listen [::]:443 ssl default_server;
7
8 server_name server_domain_or_IP;
9 include snippets/self-signed.conf;
10 include snippets/ssl-params.conf;
11
12 . . .
保存并关闭文件,当你完成。
第3步:调整防火墙
如果您已启用防火墙,则需要调整设置以允许SSL流量。所需程序取决于您正在使用的防火墙软件。
UFW
如果您正在使用 ufw ,您可以通过键入查看当前设置:
1sudo ufw status
它可能看起来像这样,这意味着只有HTTP流量被允许到Web服务器:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6SSH ALLOW Anywhere
7WWW ALLOW Anywhere
8SSH (v6) ALLOW Anywhere (v6)
9WWW (v6) ALLOW Anywhere (v6)
为了进一步允许 HTTPS 流量,我们可以允许WWW Full
配置文件,然后删除余额的WWW
配置文件允许:
1sudo ufw allow 'WWW Full'
2sudo ufw delete allow 'WWW'
你的状态现在应该是这样的:
1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6SSH ALLOW Anywhere
7WWW Full ALLOW Anywhere
8SSH (v6) ALLOW Anywhere (v6)
9WWW Full (v6) ALLOW Anywhere (v6)
HTTPS请求现在应该被您的服务器接受。
IPTables 标签
如果您正在使用iptables
,您可以通过键入查看当前的规则:
1sudo iptables -S
如果您已启用任何规则,则会显示这些规则. 一个示例配置可能看起来像这样:
1[secondary_label Output]
2-P INPUT DROP
3-P FORWARD ACCEPT
4-P OUTPUT ACCEPT
5-A INPUT -i lo -j ACCEPT
6-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
7-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
8-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
打开 SSL 流量所需的命令将取决于您当前的规则。 对于像上面这样的一套基本规则,您可以通过键入添加 SSL 访问:
1sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
如果我们再次看看防火墙规则,我们应该看到新的规则:
1sudo iptables -S
1[secondary_label Output]
2-P INPUT DROP
3-P FORWARD ACCEPT
4-P OUTPUT ACCEPT
5-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
6-A INPUT -i lo -j ACCEPT
7-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
8-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
9-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
如果您正在使用一个程序在启动时自动应用iptables
规则,则需要确保您使用新规则更新配置。
第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
我们的服务器现在应该通过HTTPS访问。
步骤5:测试加密
现在,我们已经准备好测试我们的SSL服务器。
打开您的网页浏览器,然后输入https://
,然后输入您的服务器的域名或IP地址栏:
1https://server_domain_or_IP
由于我们创建的证书不是由您的浏览器的可信证书机构之一签署的,您可能会看到一个可怕的警告,如下面的警告:
我们只对我们的证书的加密方面感兴趣,而不是第三方验证我们的主机的真实性。点击ADVANCED
,然后提供的链接可以继续到您的主机:
您应该被带到您的网站. 如果您在浏览器地址栏中查看,您会看到某些部分安全的迹象。这可能是上面有一个x
的锁或一个有呼声点的三角形。在这种情况下,这只是意味着证书无法验证。它仍然加密您的连接。
如果您配置了 Nginx 用两个服务器块,自动将 HTTP 内容重定向到 HTTPS,您还可以检查重定向是否正常工作:
1http://server_domain_or_IP
如果这导致相同的图标,这意味着您的重定向工作正确。
步骤 6:切换到永久重定向
如果您的重定向工作正确,并且您确信只希望允许加密流量,您应该修改 Nginx 配置以使重定向永久。
再次打开服务器封锁配置文件:
1sudo nano /etc/nginx/sites-available/default
找到返回302
并将其更改为返回301
:
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80 default_server;
4 listen [::]:80 default_server;
5 server_name server_domain_or_IP;
6 return 301 https://$server_name$request_uri;
7}
8
9. . .
保存并关闭文件。
检查您的配置语法错误:
1sudo nginx -t
当你准备好时,重新启动 Nginx 以使重定向永久:
1sudo systemctl restart nginx
您的网站现在应该通过HTTP访问时发出永久重定向。
结论
您已配置您的 Nginx 服务器以使用强大的加密为客户端连接,这将允许您安全地服务请求,并防止外部人员阅读您的流量。