介绍
本文解释了如何为 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 #
- 更新根目录,直接在评论的块下方. 原始读
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 文章。