如何在 Debian 8 的 Nginx 上创建 ECC 证书

介绍

本文解释了如何为 Nginx 创建一个 Elliptic Curve Cryptography (ECC) SSL 证书. 在本教程结束时,您将有更快的加密机制用于生产使用。

另一方面,ECC依赖于无法将随机圆曲线解决为分散的算法函数,这个问题被称为圆曲线分散算法问题或ECDLP。

这个教程,以及所有ECC证书,都依赖于一个 elliptic-curve protocol 可以提供多种口味。 国家标准和技术研究所(NIST) Suite B规定了两种潜在的圆曲线用于使用,P-256 和 P-384,也被称为 prime256v1 和 secp384r1. 为了简单,我们将使用前者, prime256v1,因为它是简单但实用的。

前提条件

要遵循本教程,您将需要:

  • 一个新的 Debian 8.1 Droplet * 一个 sudo 非根用户,您可以通过遵循 本教程的步骤 2 和 3 来设置 * OpenSSL 安装和更新

要进行测试,您需要两个系统之一,OpenSSL安装和更新:

另一个LinuxDropplet*基于Linux的本地系统(Mac、Ubuntu、Debian等)

第1步:安装 Nginx

在此步骤中,我们将使用内置的 _package 安装程序,称为 apt-get. 它极大地简化了管理,并促进了清洁的安装。

在前提条件中指定的链接中,您应该更新apt-get并安装了sudo包,因为与其他Linux发行版不同,Debian 8没有安装sudo

Nginx 是上述的 HTTP 服务器,专注于处理大负载,使用较低的内存。

1sudo apt-get install nginx

有关 Nginx 和 Apache2 之间最流行的开源 Web 服务器的区别的信息,请参阅 本文

第2步:创建目录

我们需要将私钥和证书存储在一个难忘的位置,所以我们需要创建一个新的目录。

1sudo mkdir /etc/nginx/ssl

步骤 3 – 创建自签名的 ECC 证书

在本节中,我们将要求新证书并签署它。

首先,使用OpenSSL的ecparam工具生成ECC私钥。

*out旗将输出指向一个文件. 对于本教程,我们将将键保存在/etc/nginx/ssl/nginx.key中。

1sudo openssl ecparam -out /etc/nginx/ssl/nginx.key -name prime256v1 -genkey

然后,生成证书签名请求。

*钥匙旗指明了在上一个命令中生成的到我们的钥匙的路径。 *离开旗指明了我们生成的证书的路径。

1sudo openssl req -new -key /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/csr.pem

召喚這個命令將導致一系列提示。

  • Common Name : 指定您的服务器的 IP 地址或主机名称。 * ** 挑战密码** : 不要提供一个。 * 按自己的判断填写所有其他字段。
 1You are about to be asked to enter information that will be incorporated into your certificate request.
 2What you are about to enter is what is called a Distinguished Name or a DN.
 3There are quite a few fields but you can leave some blank
 4For some fields there will be a default value,
 5If you enter '.', the field will be left blank.
 6-----
 7Country Name (2 letter code) [AU]:US
 8State or Province Name (full name) [Some-State]:New York
 9Locality Name (eg, city) []:New York
10Organization Name (eg, company) [Internet Widgits Pty Ltd]:Digital Ocean Tutorial
11Organizational Unit Name (eg, section) []:ECC Certificate Test
12Common Name (e.g. server FQDN or YOUR name) []:example.com
13Email Address []: [email protected]
14
15Please enter the following 'extra' attributes to be sent with your certificate request
16A challenge password []:
17An optional company name []:

最后,自行签署证书,然后由客户端使用证书来加密数据,只有服务器才能读取。

  • 'x509' 是生成证书的 OpenSSL 工具。 * 'days' 标志指明证书应该有效多久。
1sudo openssl req -x509 -nodes -days 365 -key /etc/nginx/ssl/nginx.key -in /etc/nginx/ssl/csr.pem -out /etc/nginx/ssl/nginx.pem

设置文件权限以保护您的私钥和证书. 有关三位数权限代码的更多信息,请参阅关于 Linux 权限的教程。

1sudo chmod 600 /etc/nginx/ssl/*

您的证书和保护它的私钥现在已经准备好设置。

步骤4 - 设置证书

在本节中,我们将用密钥和证书配置 Nginx 虚拟主机,实际上,我们的服务器将开始服务 HTTPS 而不是 HTTP 请求。

使用 nano 或您最喜欢的文本编辑器打开服务器配置文件。

1sudo nano /etc/nginx/sites-enabled/default

在配置文件的顶部,你会发现一个代码块,类似于以下:

1[label /etc/nginx/sites-enabled/default]
2...
3# Default server configuration
4#
5server {
6...
7}

接下來的幾個編輯將在「伺服器」區塊內進行。

1、首先,评论服务器块的前两行,以英镑标志前行:

1[label etc/nginx/sites-enabled/default]
2server {
3    # listen 80 default_server;
4    # listen [::]:80 default_server;

然后,删除SSL Configuration下面的第一个倾听行,然后正确输入,并删除ssl default_server

1[label /etc/nginx/sites-enabled/default]
2    # SSL Configuration
3    #
4    listen 443;
5    # listen [::]:443 ssl default_server;
6    #
  1. 更新根目录,直接在评论的块下方. 原始读 server_name _;. 更改它以包括您的服务器 ip,以便读 server_name your_server_ip. 4. 在 server_name之后,添加您的 SSL 密钥和证书路径。
1[label /etc/nginx/sites-enabled/default]
2        ssl on;
3        ssl_certificate /etc/nginx/ssl/nginx.pem;
4        ssl_certificate_key /etc/nginx/ssl/nginx.key;

最后,添加SSL设置。

1[label /etc/nginx/sites-enabled/default]
2        ssl_session_timeout 5m;
3        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
4        ssl_ciphers HIGH+kEECDH+AESGCM:HIGH+kEECDH:HIGH+kEDH:HIGH:!aNULL;
5        ssl_prefer_server_ciphers on;

你的最终结果应该与以下相同。

 1[label /etc/nginx/sites-enabled/default]
 2# Default server configuration
 3#
 4server {
 5        # listen 80 default_server;
 6        # listen [::]:80 default_server;
 7
 8        # SSL configuration
 9        #
10        listen 443;
11        # listen [::]:443 ssl default_server;
12        #
13        # Self signed certs generated by the ssl-cert package
14        # Don't use them in a production server!
15        #
16        # include snippets/snakeoil.conf;
17
18        root /var/www/html;
19
20        # Add index.php to the list if you are using PHP
21        index index.html index.htm index.nginx-debian.html;
22
23        server_name your_server_ip;
24
25        ssl on;
26       ssl_certificate /etc/nginx/ssl/nginx.pem;
27       ssl_certificate_key /etc/nginx/ssl/nginx.key;
28       ssl_session_timeout 5m;
29       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
30       ssl_ciphers HIGH+kEECDH+AESGCM:HIGH+kEECDH:HIGH+kEDH:HIGH:!aNULL;
31       ssl_prefer_server_ciphers on;
32
33        location / {
34                # First attempt to serve request as file, then
35                # as directory, then fall back to displaying a 404.
36                try_files $uri $uri/ =404;
37        }

完成这些更改后,保存并退出文件。

重新启动 Nginx 以应用更改。

1sudo service nginx restart

步骤5:测试 Nginx 与 ECC

在本节中,我们将测试服务器,通过命令行. 再次,这可以做在(1)您的本地基于Linux的系统或(2)另一个Droplet. 你也可以从相同的壳窗口运行这个命令,但你可能想要一个更坚实的成功证明。

通过 HTTPS 443 端口进行连接。

「openssl s_client -connect your_server_ip:连接您的服务器。

在键输出后滚动到输出的中间,你应该找到以下内容:

1[secondary_label output]
2---
3SSL handshake has read 3999 bytes and written 444 bytes
4---
5...
6SSL-Session:
7...

当然,数字是可变的,但这是成功!恭喜!

CTRL+C即可退出。

您也可以在网页浏览器中访问您的网站,使用URL中的HTTPS(https://example.com)。您的浏览器会警告您证书是自签名的。您应该能够查看证书并确认细节与您在步骤 4中输入的内容相匹配。

结论

这结束了我们的教程,留给您一个工作 Nginx 服务器,安全配置使用 ECC 证书. 有关使用 OpenSSL 的更多信息,请参阅 OpenSSL Essentials 文章

Published At
Categories with 技术
comments powered by Disqus