如何在Ubuntu 18.04上为Nginx创建自签名SSL证书

时间:2020-03-05 15:30:25  来源:igfitidea点击:

SSL代表“安全套接字层”,这是用于在Web服务器和Web浏览器之间创建加密链接的标准安全技术。
此链接可确保在服务器和浏览器之间传递的所有信息保持私密性和安全性。
SSL证书的主要目的是确保的安全性,并对客户端和浏览器之间传输的数据进行加密,以防止任何敏感信息(例如信用卡详细信息,帐号和密码等)被盗。

自签名证书是由创建它的人而不是受信任的证书颁发机构(CA)签名的证书。
大多数客户和组织都倾向于使用自签名SSL证书,而不是使用受信任的证书颁发机构颁发和验证的SSL证书,这主要是由于成本差异。
但是它仍然可以提供相同级别的加密。

在本文中,我将解释如何在具有Nginx Web服务器的Ubuntu 18.04服务器上创建自签名SSL证书。

准备工作

一个配置良好的服务器,具有root特权和OpenSSL库。
需要OpenSSL库才能生成自己的证书。
在ubuntu服务器中运行以下命令,以查看是否已安装OpenSSL。

# which openssl
/usr/bin/openssl

如果which命令没有返回二进制文件,那么我们将需要使用以下命令来安装它:

#apt install openssl

创建自签名证书

SSL主要包括两个部分,一个是私钥,另一个是公共证书。
SSL密钥在受限于root用户的服务器上保持私有状态。
它实际上用于加密发送给客户端的内容。
公开SSL证书与请求内容的任何人共享。
它可用于解密由关联的专用SSL密钥签名的内容。
其中我正在使用此命令通过OpenSSL工具生成一个自签名证书,即example.com.crt和一个私钥example.com.key(这里我使用example.com.pem作为文件名)。

#openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.pem

请在下面查看每个选项的详细信息:

  • 要求:此子命令用于创建新的X.509证书。 “ X.509”是SSL和TLS对其密钥和证书管理所遵循的公共密钥基础结构标准。
  • -x509:通过告诉实用程序我们要制作自签名证书,这进一步修改了先前的子命令。
  • -nodes:用于跳过密码短语选项以保护我们的证书。
  • -days 365:此选项以天为单位设置证书的有效性。我们在这里设置一年。
  • -newkey rsa:2048:这指定我们要生成一个新的2048位长的RSA密钥以及证书。
  • -keyout:此选项告诉OpenSSL将生成的私钥文件放置在何处。
  • -out:此选项告诉OpenSSL将生成的证书放置在何处。

在此命令执行过程中,它将提示我们提供域/客户端详细信息,以生成证书签名请求(CSR)。
我们可以根据需要提供这些详细信息。

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:Victoria
Locality Name (eg, city) []:Melbourne
Organization Name (eg, company) [Internet Widgits Pty Ltd]:theitroad LLC
Organizational Unit Name (eg, section) []:Web
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:[email protected]

现在,我们有了新生成的自签名证书,并且私钥位于以下位置:'/etc/ssl/certs/example.com.pem'和'/etc/ssl/private/example.com.key'。
接下来,我们应该创建一个强大的Diffie-Hellman组,该组用于与客户协商“完全正向保密”。
我们可以运行此命令来创建一个。

#openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

这可能需要一些时间才能完成,但是完成后,我们将在'/etc/ssl/certs/dhparam.pem'中拥有一个强大的DH组,我们可以在配置中使用它。

配置Nginx以使用自签名证书

在开始之前,我们需要确保在我们的Ubuntu 18.04服务器上安装了Nginx Web服务器。
如果尚未安装,则可以使用以下简单命令进行安装:

#apt install nginx

我已经在服务器上安装并启用了此服务。

# nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
#systemctl enable nginx
#systemctl start nginx
#systemctl status nginx

下一个。
我们可以将Nginx配置为使用SSL。
我将分三个步骤进行说明:

  • 使用生成的SSL证书详细信息创建代码段配置。
  • 创建片段配置以维护强大且安全的SSL设置,以克服可能的SSL漏洞。
  • 使用以上代码段配置更新域虚拟主机以启用SSL

步骤1:使用SSL证书详细信息创建代码段配置

让我们创建一个新的代码片段配置文件“ self-signed.conf”,用于将我们生成的“自签名证书”详细信息指向Nginx片段文件夹中的“/etc/nginx/snippets /”,如下所示:

# cat /etc/nginx/snippets/self-signed.conf
# Self signed certificates generated by the ssl-cert package
# Don't use them in a production server!
ssl_certificate /etc/ssl/certs/example.com.pem;
ssl_certificate_key /etc/ssl/private/example.com.key;

其中我们需要为上述指令指定生成的证书路径:“/etc/ssl/certs/example.com.pem”和密钥路径:“/etc/ssl/private/example.com.key”。

步骤2:创建代码段配置以维护强大且安全的SSL设置,以克服可能的SSL漏洞

其次,我们需要维护一个功能齐全且功能强大的SSL服务器配置,以保护我们的服务器免受所有可能的SSL漏洞的侵害。
我为Nginx配置了强大的SSL密码套件,并启用了一些高级功能来确保服务器安全。
所有这些参数都包含在文件中:'/etc/nginx/snippets/ssl-params.conf'

cat /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling off;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/ssl/certs/dhparam.pem;

我们可以在“密码”列表中获得这些Nginx Cipher建议。

这些参数将在以后的Nginx SSL配置中使用。
如我们所见,我们已将'ssl_dhparam'设置设置为指向我们在此之前生成的Diffie-Hellman文件。
由于我们使用的是自签名证书,因此不会使用“ SSL装订”。
因此,我已将其“关闭”,否则Nginx只会输出类似“ nginx的警告:[警告]“ ssl_stapling”被忽略,未为证书找到颁发者证书”。
进行这些更改后,我们可以保存配置并退出。

步骤3:使用上述代码段配置更新域虚拟主机以启用SSL

我们已经准备好需要的代码段配置,现在可以将其包含在域虚拟主机中并启用SSL。
在本文的此处,我使用的是位于'/etc/nginx/sites-available/default'的默认Nginx配置文件。
我已修改此文件以启用SSL并获取生成的自签名证书。
请在此配置中查看下面的修改部分:

cat /etc/nginx/sites-available/default
#server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
## Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
## Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
## Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#include snippets/self-signed.conf;
include snippets/ssl-params.conf;

现在,我们可以保存这些配置并重新启动Nginx服务,以使这些更改生效。

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
#systemctl restart nginx

测试

这是我们的最后一步,我们可以打开浏览器并尝试通过URL >>'https://Server_IP或者Hostname'访问服务器IP。
由于我们使用的是自签名证书,因此它将显示安全警告,我们可以忽略该警告,然后单击以确认安全性以继续进行操作。