如安在 Ubuntu 16.04 上为 Nginx 创建自署名 SSL 证书

打印 上一主题 下一主题

主题 1025|帖子 1025|积分 3075

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前些天发现了一个巨牛的人工智能学习网站,普通易懂,风趣幽默,忍不住分享一下给各人。点击跳转到网站。
简介

TLS,即传输层安全协议,及其前身SSL,即安全套接字层,是用于将平凡流量包装在受保护的加密包装中的网络协议。
使用这项技能,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部方拦截。证书系统还资助用户验证他们正在连接的站点的身份。
在本指南中,我们将向您展示如安在 Ubuntu 16.04 服务器上为 Nginx web 服务器设置自署名 SSL 证书。
先决条件

在开始之前,您应该已经设置了一个具有sudo权限的非根用户。您可以按照我们的 Ubuntu 16.04 初始服务器设置指南来了解如何设置此类用户帐户。
您还需要已安装 Nginx web 服务器。假如您想在服务器上安装完整的 LEMP(Linux、Nginx、MySQL、PHP)堆栈,可以按照我们的 Ubuntu 16.04 上设置 LEMP 的指南进行操作。
假如您只想要 Nginx web 服务器,可以按照我们的 Ubuntu 16.04 上安装 Nginx 的指南进行操作。
完成先决条件后,请继续以下操作。
步骤 1:创建 SSL 证书

TLS/SSL 通过使用公共证书和私钥的组合来工作。SSL 密钥在服务器上保密。它用于加密发送给客户端的内容。SSL 证书与请求内容的任何人公开共享。它可用于解密由相关 SSL 密钥署名的内容。
我们可以使用 OpenSSL 一次性创建自署名密钥和证书对:
  1. 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 在那边放置我们正在创建的证书。
正如我们上面所述,这些选项将创建一个密钥文件和一个证书。我们将被要求关于我们的服务器的一些问题,以便将信息精确嵌入证书中。
得当填写提示。最重要的一行是请求“通用名称(例如服务器 FQDN 或您的名称)”。您需要输入与您的服务器关联的域名或更可能是您服务器的公共 IP 地点。
提示的全部内容将雷同于以下内容:
  1. Country Name (2 letter code) [AU]:US
  2. State or Province Name (full name) [Some-State]:New York
  3. Locality Name (eg, city) []:New York City
  4. Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
  5. Organizational Unit Name (eg, section) []:Ministry of Water Slides
  6. Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
  7. Email Address []:admin@your_domain.com
复制代码
您创建的两个文件将放置在/etc/ssl目次的得当子目次中。
当我们使用 OpenSSL 时,我们还应该创建一个强盛的 Diffie-Hellman 组,用于与客户端协商完美前向保密。
我们可以通过输入以下内容来实现:
  1. sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
复制代码
这可能需要几分钟的时间,但完成后,您将在/etc/ssl/certs/dhparam.pem上拥有一个强盛的 DH 组,我们可以在我们的设置中使用。
步骤 2:设置 Nginx 使用 SSL

我们已经在 /etc/ssl 目次下创建了我们的密钥和证书文件。现在我们只需要修改我们的 Nginx 设置以利用这些文件。
我们将对我们的设置进行一些调整。

  • 我们将创建一个包含 SSL 密钥和证书文件位置的设置片段。
  • 我们将创建一个包含强盛 SSL 设置的设置片段,这些设置可以在将来与任何证书一起使用。
  • 我们将调整我们的 Nginx 服务器块以处理 SSL 请求,并使用上述两个片段。
这种设置 Nginx 的方法将允许我们保持清晰的服务器块,并将常见的设置段放入可重用的模块中。
创建指向 SSL 密钥和证书的设置片段

起首,让我们在 /etc/nginx/snippets 目次下创建一个新的 Nginx 设置片段。
为了精确区分该文件的目的,让我们将其命名为 self-signed.conf:
  1. sudo nano /etc/nginx/snippets/self-signed.conf
复制代码
在这个文件中,我们只需要将 ssl_certificate 指令设置为我们的证书文件,将 ssl_certificate_key 设置为相关的密钥。在我们的情况下,这将如下所示:
  1. ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
  2. ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
复制代码
当您添加了这些行后,生存并关闭文件。
创建包含强加密设置的设置片段

接下来,我们将创建另一个片段,用于定义一些 SSL 设置。这将使用强盛的 SSL 密码套件并启用一些高级功能,有助于保持我们的服务器安全。
我们将设置的参数可以在将来的 Nginx 设置中重复使用,因此我们将给文件一个通用的名称:
  1. sudo nano /etc/nginx/snippets/ssl-params.conf
复制代码
为了安全地设置 Nginx SSL,我们将使用 Remy van Elst 在 Cipherli.st 网站上的发起。该网站旨在为流行软件提供易于消化的加密设置。您可以在这里阅读更多关于他在 Nginx 选择方面的决定。
对于我们的目的,我们可以完全复制所提供的设置。我们只需要做一些小的修改。
起首,我们将添加我们首选的上游请求的 DNS 剖析器。在本指南中,我们将使用 Google 的剖析器。我们还将设置 ssl_dhparam 设置,指向我们之前生成的 Diffie-Hellman 文件。
末了,您应该花一点时间了解 HTTP 严格传输安全性(HSTS),特殊是关于“preload”功能。预加载 HSTS 提供了增强的安全性,但假如意外启用或错误启用可能会产生深远的结果。在本指南中,我们不会预加载这些设置,但假如您确信理解了其影响,可以进行修改:
  1. # 来自 https://cipherli.st/
  2. # 和 https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
  3. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  4. ssl_prefer_server_ciphers on;
  5. ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
  6. ssl_ecdh_curve secp384r1;
  7. ssl_session_cache shared:SSL:10m;
  8. ssl_session_tickets off;
  9. ssl_stapling on;
  10. ssl_stapling_verify on;
  11. resolver 8.8.8.8 8.8.4.4 valid=300s;
  12. resolver_timeout 5s;
  13. # 暂时禁用预加载 HSTS。如果您理解其影响,可以使用包含“preload”指令的已注释的头行。
  14. #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
  15. add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
  16. add_header X-Frame-Options DENY;
  17. add_header X-Content-Type-Options nosniff;
  18. ssl_dhparam /etc/ssl/certs/dhparam.pem;
复制代码
由于我们使用的是自署名证书,以是 SSL stapling 将不会被使用。Nginx 将简单地输出告诫,为我们的自署名证书禁用 stapling,并继续正常运行。
完成后生存并关闭文件。
调整 Nginx 设置以使用 SSL

现在我们有了我们的片段,我们可以调整我们的 Nginx 设置以启用 SSL。
在本指南中,我们假设您正在使用 /etc/nginx/sites-available 目次中的 default 服务器块文件。假如您使用不同的服务器块文件,请在下面的命令中替换其名称。
在继续之前,让我们先备份当前的服务器块文件:
  1. sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
复制代码
现在,打开服务器块文件进行调整:
  1. sudo nano /etc/nginx/sites-available/default
复制代码
在文件中,您的服务器块可能开始如下所示:
  1. server {
  2.     listen 80 default_server;
  3.     listen [::]:80 default_server;
  4.     # SSL configuration
  5.     # listen 443 ssl default_server;
  6.     # listen [::]:443 ssl default_server;
  7.     . . .
复制代码
我们将修改此设置,以便将未加密的 HTTP 请求主动重定向到加密的 HTTPS。这为我们的站点提供了最佳安全性。假如您希望允许 HTTP 和 HTTPS 流量,请使用以下备用设置。
我们将把设置分成两个单独的块。在两个第一条 listen 指令之后,我们将添加一个 server_name 指令,设置为您的服务器域名或更可能的 IP 地点。然后,我们将设置一个重定向到我们将要创建的第二个服务器块。之后,我们将关闭这个简短的块:
  1. server {
  2.     listen 80 default_server;
  3.     listen [::]:80 default_server;
  4.     server_name server_domain_or_IP;
  5.     return 302 https://$server_name$request_uri;
  6. }
  7.     # SSL configuration
  8.     # listen 443 ssl default_server;
  9.     # listen [::]:443 ssl default_server;
  10.     . . .
复制代码
接下来,我们需要在下面直接开始一个新的服务器块,以包含剩余的设置。我们可以取消注释使用端口 443 的两个 listen 指令。我们可以在这些行中添加 http2 以在此块中启用 HTTP/2。之后,我们只需要包含我们设置的两个片段文件:
  1. server {
  2.     listen 80 default_server;
  3.     listen [::]:80 default_server;
  4.     server_name server_domain_or_IP;
  5.     return 302 https://$server_name$request_uri;
  6. }
  7. server {
  8.     # SSL configuration
  9.     listen 443 ssl http2 default_server;
  10.     listen [::]:443 ssl http2 default_server;
  11.     include snippets/self-signed.conf;
  12.     include snippets/ssl-params.conf;
  13.     . . .
复制代码
完成后生存并关闭文件。
(备用设置)允许 HTTP 和 HTTPS 流量

假如您希望或需要允许加密和非加密内容,您将需要稍微不同地设置 Nginx。一般来说,假如可以避免,这通常是不发起的,但在某些情况下可能是须要的。基本上,我们将两个单独的服务器块压缩成一个块,并删除重定向:
  1. server {
  2.     listen 80 default_server;
  3.     listen [::]:80 default_server;
  4.     listen 443 ssl http2 default_server;
  5.     listen [::]:443 ssl http2 default_server;
  6.     server_name server_domain_or_IP;
  7.     include snippets/self-signed.conf;
  8.     include snippets/ssl-params.conf;
  9.     . . .
复制代码
完成后生存并关闭文件。
步骤 3:调整防火墙

假如您已经启用了 ufw 防火墙,如先决指南中保举的那样,您需要调整设置以允许 SSL 流量。荣幸的是,Nginx 在安装时会向 ufw 注册一些设置文件。
我们可以通过输入以下命令来查看可用的设置文件:
  1. sudo ufw app list
复制代码
您应该会看到以下雷同的列表:
  1. Available applications:
  2.   Nginx Full
  3.   Nginx HTTP
  4.   Nginx HTTPS
  5.   OpenSSH
复制代码
您可以通过输入以下命令来查看当前设置:
  1. sudo ufw status
复制代码
它可能看起来像这样,意味着只有 HTTP 流量被允许访问 Web 服务器:
  1. Status: active
  2. To                         Action      From
  3. --                         ------      ----
  4. OpenSSH                    ALLOW       Anywhere
  5. Nginx HTTP                 ALLOW       Anywhere
  6. OpenSSH (v6)               ALLOW       Anywhere (v6)
  7. Nginx HTTP (v6)            ALLOW       Anywhere (v6)
复制代码
为了额外允许 HTTPS 流量,我们可以允许 “Nginx Full” 设置文件,然后删除多余的 “Nginx HTTP” 设置文件允许:
  1. sudo ufw allow 'Nginx Full'
  2. sudo ufw delete allow 'Nginx HTTP'
复制代码
现在您的状态应该是这样的:
  1. sudo ufw status
复制代码
  1. Status: active
  2. To                         Action      From
  3. --                         ------      ----
  4. OpenSSH                    ALLOW       Anywhere
  5. Nginx Full                 ALLOW       Anywhere
  6. OpenSSH (v6)               ALLOW       Anywhere (v6)
  7. Nginx Full (v6)            ALLOW       Anywhere (v6)
复制代码
步骤 4:启用 Nginx 中的更改

现在我们已经做出了更改并调整了防火墙,我们可以重新启动 Nginx 来实行我们的新更改。
起首,我们应该检查我们的文件中是否有语法错误。我们可以通过输入以下命令来执行此操作:
  1. sudo nginx -t
复制代码
假如统统顺利,您将会得到以下雷同的效果:
  1. nginx: [warn] "ssl_stapling" ignored, issuer certificate not found
  2. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  3. nginx: configuration file /etc/nginx/nginx.conf test is successful
复制代码
请注意开头的告诫。如前所述,由于我们的自署名证书无法使用 SSL stapling,因此此特定设置会产生告诫。这是预期的,我们的服务器仍旧可以精确加密连接。
假如您的输出与上述相匹配,则您的设置文件没有语法错误。我们可以安全地重新启动 Nginx 来实行我们的更改:
  1. sudo systemctl restart nginx
复制代码
步骤 5:测试加密

现在,我们准备测试我们的 SSL 服务器。
打开您的 Web 浏览器,然后在地点栏中输入 https://,反面跟上您服务器的域名或 IP:
  1. https://server_domain_or_IP
复制代码
由于我们创建的证书未经您浏览器信任的证书颁发机构署名,您可能会看到以下雷同的告诫:
!Nginx self-signed cert warning
这是预期的和正常的。我们只关心证书的加密方面,而不是主机真实性的第三方验证。点击 “高级”,然后点击提供的链接以继续访问您的主机:
!Nginx self-signed override
您应该会进入您的站点。假如您查看浏览器地点栏,您会看到一个带有 “x” 的锁。在这种情况下,这只是意味着无法验证证书。它仍旧在加密您的连接。
假如您设置了 Nginx 两个服务器块,主动将 HTTP 内容重定向到 HTTPS,您还可以检查重定向是否正常工作:
  1. http://server_domain_or_IP
复制代码
假如效果显示雷同的图标,这意味着您的重定向已经精确工作。
步骤 6:更改为永久重定向

假如您的重定向工作正常,而且您确定只想允许加密流量,您应该修改 Nginx 设置以使重定向变为永久性。
再次打开您的服务器块设置文件:
  1. sudo nano /etc/nginx/sites-available/default
复制代码
找到 return 302 并将其更改为 return 301:
  1. server {
  2.         listen 80 default_server;
  3.         listen [::]:80 default_server;
  4.         server_name server_domain_or_IP;
  5.         return 301 https://$server_name$request_uri;
  6. }
  7. . . .
复制代码
生存并关闭文件。
检查您的设置是否存在语法错误:
  1. sudo nginx -t
复制代码
当您准备好时,重新启动 Nginx 以使重定向变为永久性:
  1. sudo systemctl restart nginx
复制代码
结论

您已经设置了 Nginx 服务器以使用强加密来处理客户端连接。这将允许您安全地提供请求,并防止外部方读取您的流量。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表