如何在Nginx上为Debian8创建ECC证书
介绍
本文介绍如何为 Nginx 创建椭圆曲线加密 (ECC) SSL 证书。 在本教程结束时,您将拥有一个更快的生产使用加密机制。
传统的公钥密码术依赖于几乎不可能分解大整数。 另一方面,ECC 依赖于将随机椭圆曲线分解为离散对数函数的不可能性,这个问题被称为“椭圆曲线离散对数问题”或 ECDLP。 简而言之,ECC 提供具有类似安全性的更小密钥,这反过来又转化为更高的加密性能,适用于 SSL 等数字签名。
本教程以及所有 ECC 证书都依赖于 椭圆曲线协议 ,它可以有多种形式。 美国国家标准与技术研究院 (NIST) Suite B 指定了两条可能使用的椭圆曲线,P-256 和 P-384,也称为 prime256v1 和 secp384r1。 为简单起见,我们将使用前者,prime256v1,因为它简单但实用。
先决条件
要遵循本教程,您将需要:
- 一个新鲜的 Debian 8.1 Droplet
- 一个sudo非root用户,可以按照本教程的步骤2和3进行设置
- 安装和更新 OpenSSL
要进行测试,您将需要安装和更新 OpenSSL 的两个系统之一:
- 另一个 Linux Droplet
- 基于 Linux 的本地系统(Mac、Ubuntu、Debian 等)
第 1 步 — 安装 Nginx
在这一步中,我们将使用一个名为 apt-get
的内置 软件包安装程序。 它极大地简化了管理并促进了干净的安装。
在先决条件中指定的链接中,您应该已更新 apt-get
并安装了 sudo
软件包,因为与其他 Linux 发行版不同,Debian 8 没有安装 sudo
。
Nginx 是前面提到的 HTTP 服务器,专注于处理低内存使用的大负载。 要安装它,请运行以下命令:
sudo apt-get install nginx
有关 Nginx 和 Apache2 这两种最流行的开源 Web 服务器之间的差异的信息,请参阅 这篇文章 。
第 2 步 — 创建目录
本节简单而简短。 我们需要将私钥和证书存储在一个容易记住的位置,因此我们需要创建一个新目录。
sudo mkdir /etc/nginx/ssl
第 3 步 — 创建自签名 ECC 证书
在本节中,我们将请求一个新证书并对其进行签名。
首先,使用 OpenSSL 的 ecparam
工具生成 ECC 私钥。
out
标志将输出定向到文件。 对于本教程,我们将把密钥保存在/etc/nginx/ssl/nginx.key
中。name
标志标识椭圆曲线prime256v1
。
sudo openssl ecparam -out /etc/nginx/ssl/nginx.key -name prime256v1 -genkey
然后,生成证书签名请求。
key
标志指定我们的密钥的路径,在前面的命令中生成。out
标志指定我们生成的证书的路径。
sudo openssl req -new -key /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/csr.pem
调用此命令将导致一系列提示。
- Common Name:指定服务器的 IP 地址或主机名。
- 挑战密码:不提供一个。
- 自行决定填写所有其他字段。 点击
ENTER
接受默认值。
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York Organization Name (eg, company) [Internet Widgits Pty Ltd]:Digital Ocean Tutorial Organizational Unit Name (eg, section) []:ECC Certificate Test Common Name (e.g. server FQDN or YOUR name) []:example.com Email Address []: webmaster@example.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
最后,自签名证书。 然后客户端使用证书来加密只有服务器可以读取的数据。
x509
是用于生成证书的 OpenSSL 工具。days
标志指定证书应保持有效的时间。 在此示例中,证书将持续一年。in
指定我们之前生成的证书请求。
sudo 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权限教程。
sudo chmod 600 /etc/nginx/ssl/*
您的证书和保护它的私钥现在可以设置了。
第 4 步 — 设置证书
在本节中,我们将使用密钥和证书配置 Nginx 虚拟主机。 实际上,我们的服务器将开始提供 HTTPS 而不是 HTTP 请求。
使用 nano 或您喜欢的文本编辑器打开服务器配置文件。
sudo nano /etc/nginx/sites-enabled/default
在配置文件的顶部,您会发现一段代码,类似于以下内容:
/etc/nginx/sites-enabled/default
... # Default server configuration # server { ... }
接下来的几个编辑将在 server
块内进行。
- 首先,注释掉
server
块的前两行,在该行前面加上一个井号:
等/nginx/启用站点/默认
server { # listen 80 default_server; # listen [::]:80 default_server;
- 然后,通过删除井号来取消注释
SSL Configuration
下面的第一行listen
。 正确缩进,并删除ssl default_server
。
/etc/nginx/sites-enabled/default
# SSL Configuration # listen 443; # listen [::]:443 ssl default_server; #
更新根目录,直接在注释块下方。 原文为
server_name _;
。 将其更改为包含您的服务器 ip,使其显示为server_name your_server_ip
。在
server_name
之后,添加您的 SSL 密钥和证书路径。
/etc/nginx/sites-enabled/default
ssl on; ssl_certificate /etc/nginx/ssl/nginx.pem; ssl_certificate_key /etc/nginx/ssl/nginx.key;
- 最后,添加 SSL 设置。
/etc/nginx/sites-enabled/default
ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH+kEECDH+AESGCM:HIGH+kEECDH:HIGH+kEDH:HIGH:!aNULL; ssl_prefer_server_ciphers on;
您的最终结果应与以下结果相同。
/etc/nginx/sites-enabled/default
# Default server configuration # server { # listen 80 default_server; # listen [::]:80 default_server; # SSL configuration # listen 443; # listen [::]:443 ssl default_server; # # Self signed certs generated by the ssl-cert package # Don't use them in a production server! # # include snippets/snakeoil.conf; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; server_name your_server_ip; ssl on; ssl_certificate /etc/nginx/ssl/nginx.pem; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH+kEECDH+AESGCM:HIGH+kEECDH:HIGH+kEDH:HIGH:!aNULL; ssl_prefer_server_ciphers on; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }
完成这些更改后,保存并退出文件。
重新启动 Nginx 以应用更改。
sudo service nginx restart
第 5 步 — 使用 ECC 测试 Nginx
在本节中,我们将通过命令行测试服务器。 再一次,这可以在 (1) 您的本地基于 Linux 的系统或 (2) 另一个 Droplet 上完成。 您也可以从同一个 shell 窗口运行此命令,但您可能需要更可靠的成功证明。
通过 HTTPS 443 端口打开连接。
openssl s_client -connect your_server_ip:443
在关键输出之后滚动到输出的中间,你应该会发现以下内容:
output--- SSL handshake has read 3999 bytes and written 444 bytes --- ... SSL-Session: ...
当然,数字是可变的,但这就是成功。 恭喜!
按 CTRL+C
退出。
您还可以在 Web 浏览器中访问您的站点,在 URL (https://example.com
) 中使用 HTTPS。 您的浏览器会警告您证书是自签名的。 您应该能够查看证书并确认详细信息与您在步骤 4 中输入的内容相匹配。
##结论
我们的教程到此结束,为您留下一个工作 Nginx 服务器,安全地配置了 ECC 证书。 有关使用 OpenSSL 的更多信息,请参阅 OpenSSL Essentials 文章 。