今天给大家分享下服务器里面SSL证书的操作应用,我们今天以Ubuntu 18.04为例子去说明,OK,走起吧。
介绍 {#introduction}
TLS或传输层安全性及其前身SSL代表安全套接字层,是用于将正常流量包装在受保护的加密包装器中的 Web 协议。
使用这项技术,服务器可以安全地在服务器和客户端之间发送流量,而不会被外界拦截消息。证书系统还帮助用户验证他们正在连接的站点的身份。
在本指南中,我们将向您展示如何在 Ubuntu 18.04 服务器上设置用于 Nginx Web 服务器的自签名 SSL 证书。
注意:自签名证书将加密您的服务器和任何客户端之间的通信。但是,由于它不是由 Web 浏览器附带的任何受信任的证书颁发机构签署的,因此用户无法使用该证书来自动验证您的服务器的身份。
如果您没有与服务器关联的域名,并且加密的 Web 界面不是面向用户的,则自签名证书可能是合适的。如果你这样做有一个域名,在很多情况下,最好使用CA签名的证书。
先决条件
在开始之前,您应该有一个配置了sudo
权限的非 root 用户。您可以按照我们针对 Ubuntu 18.04 的初始服务器设置来了解如何设置此类用户帐户。
您还需要安装 Nginx Web 服务器。如果您想在您的服务器上安装整个 LEMP(Linux、Nginx、MySQL、PHP)堆栈,您可以按照我们在 Ubuntu 18.04上设置 LEMP 的指南进行操作。
如果您只想要 Nginx Web 服务器,则可以按照我们在 Ubuntu 18.04上安装 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
部分告诉它制作一个 2048 位长的 RSA 密钥。 -
-keyout:这一行告诉 OpenSSL 在哪里放置我们正在创建的生成的私钥文件。
-
-out:这告诉 OpenSSL 在哪里放置我们正在创建的证书。
如上所述,这些选项将创建密钥文件和证书。我们将被问到一些关于我们服务器的问题,以便将信息正确地嵌入到证书中。
适当填写提示。最重要的一行是请求Common Name (e.g. 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 组,用于与客户协商Perfect Forward Secrecy。
我们可以通过键入:
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
这将需要一段时间,但完成后您将拥有一个强大的 DH 组/etc/nginx/dhparam.pem
,我们可以在我们的配置中使用它。
步骤 2 -- 配置 Nginx 以使用 SSL
我们已经在目录下创建了我们的密钥和证书文件/etc/ssl
。现在我们只需要修改我们的 Nginx 配置来利用这些。
我们将对我们的配置进行一些调整。
-
我们将创建一个包含 SSL 密钥和证书文件位置的配置片段。
-
我们将创建一个包含强 SSL 设置的配置片段,将来可以与任何证书一起使用。
-
我们将调整我们的 Nginx 服务器块来处理 SSL 请求并使用上面的两个片段。
这种配置 Nginx 的方法将允许我们保持干净的服务器块并将常见的配置段放入可重用的模块中。
创建指向 SSL 密钥和证书的配置片段
首先,让我们在/etc/nginx/snippets
目录中创建一个新的 Nginx 配置片段。
为了正确区分此文件的用途,我们称之为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,我们将使用 Remy van Elst 在Cipherli.st站点上的建议。该站点旨在为流行软件提供易于使用的加密设置。
与上述链接的站点上的建议设置提供了强大的安全性。有时,这是以更高的客户端兼容性为代价的。如果您需要支持旧客户端,则可以通过单击页面上标有"是的,给我一个适用于旧软件/旧软件的密码套件"的链接访问替代列表。该列表可以替换下面复制的项目。
您使用哪种配置的选择在很大程度上取决于您需要支持的内容。他们都将提供极大的安全性。
出于我们的目的,我们可以完整复制提供的设置。我们只需要做一些小的修改。
首先,我们将为上游请求添加我们首选的 DNS 解析器。我们将在本指南中使用 Google。
其次,我们将注释掉设置严格传输安全标头的行。在取消对这一行的注释之前,您应该花点时间阅读HTTP 严格传输安全或 HSTS,特别是关于"预加载"功能的内容。预加载 HSTS 可提供更高的安全性,但如果意外启用或错误启用,可能会产生深远的后果。
将以下内容复制到您的ssl-params.conf
代码段文件中:
/etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_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;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
因为我们使用的是自签名证书,所以不会使用 SSL 装订。Nginx 将输出警告,禁用我们自签名证书的装订,并继续正常运行。
完成后保存并关闭文件。
调整 Nginx 配置以使用 SSL
现在我们有了代码片段,我们可以调整 Nginx 配置以启用 SSL。
我们将在本指南中假设您在/etc/nginx/sites-available
目录中使用自定义服务器块配置文件。我们将/etc/nginx/sites-available/example.com
在这个例子中使用。根据需要替换您的配置文件名。
在我们继续之前,让我们备份当前的配置文件:
sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com.bak
现在,打开配置文件进行调整:
sudo nano /etc/nginx/sites-available/example.com
在里面,您的服务器块可能与此类似:
/etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
. . .}
您的文件可能以不同的顺序,并且代替root
,并index
指示你可能有一些location
,proxy_pass
或其它自定义的配置语句。没关系,因为我们只需要更新listen
指令并包含我们的 SSL 片段。我们将修改这个现有的服务器块以在端口 443 上提供 SSL 流量,然后创建一个新的服务器块以在端口 80 上响应并自动将流量重定向到端口 443。
注意:我们将使用 302 重定向,直到我们确认一切正常。之后,我们可以将其更改为永久 301 重定向。
在您现有的配置文件中,更新两个listen
语句以使用端口 443 和 ssl,然后包含我们在前面步骤中创建的两个片段文件:
/etc/nginx/sites-available/example.com
server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
. . .}
接下来,将第二个服务器块粘贴到配置文件中,在}
第一个块的右括号 ( ) 之后:
/etc/nginx/sites-available/example.com
. . .server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 302 https://$server_name$request_uri;}
这是一个简单的配置,它侦听端口 80 并执行到 HTTPS 的重定向。完成编辑后保存并关闭文件。
步骤 3 -- 调整防火墙
如果ufw
按照先决条件指南的建议启用了防火墙,则需要调整设置以允许 SSL 流量。幸运的是,Nginxufw
在安装时注册了一些配置文件。
我们可以通过键入以下内容来查看可用的配置文件:
sudo ufw app list
您应该会看到如下列表:
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
您可以通过键入以下内容查看当前设置:
sudo ufw status
它可能看起来像这样,这意味着 Web 服务器只允许 HTTP 流量:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
为了额外允许 HTTPS 流量,我们可以允许"Nginx Full"配置文件,然后删除冗余的"Nginx HTTP"配置文件限额:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
您的状态现在应如下所示:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
第 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
注意开头的警告。如前所述,此特定设置会引发警告,因为我们的自签名证书无法使用 SSL 装订。这是意料之中的,我们的服务器仍然可以正确加密连接。
如果您的输出与上述匹配,则您的配置文件没有语法错误。我们可以安全地重启 Nginx 来实现我们的更改:
sudo systemctl restart nginx
步骤 5 -- 测试加密
现在,我们准备测试我们的 SSL 服务器。
打开您的网络浏览器,https://
然后在地址栏中输入您服务器的域名或 IP:
https://server_domain_or_IP
由于我们创建的证书不是由您浏览器的受信任证书颁发机构之一签署的,因此您可能会看到如下所示的可怕警告:
这是意料之中的正常现象。我们只对我们证书的加密方面感兴趣,而不是我们主机真实性的第三方验证。单击"高级",然后单击提供的链接以继续访问您的主机:
你应该被带到你的网站。如果您查看浏览器地址栏,您会看到一个带有"x"的锁。在这种情况下,这仅意味着无法验证证书。它仍在加密您的连接。
如果 Nginx 配置了两个服务器块,自动将 HTTP 内容重定向到 HTTPS,您还可以检查重定向是否正常工作:
http://server_domain_or_IP
如果这导致相同的图标,则表示您的重定向工作正常。
第 6 步 -- 更改为永久重定向
如果您的重定向工作正常并且您确定只允许加密流量,您应该修改 Nginx 配置以使重定向永久。
再次打开服务器块配置文件:
sudo nano /etc/nginx/sites-available/example.com
找到return 302
并将其更改为return 301
:
/etc/nginx/sites-available/example.com
return 301 https://$server_name$request_uri;
保存并关闭文件。
检查您的配置是否存在语法错误:
sudo nginx -t
准备好后,重新启动 Nginx 以使重定向永久生效:
sudo systemctl restart nginx
结论
您已将 Nginx 服务器配置为对客户端连接使用强加密。这将允许您安全地处理请求,并防止外部各方读取您的流量。