介绍
本文介绍如何为Nginx创建椭圆曲线加密(ECC)SSL证书。 在本教程结束时,您将有一个更快的加密机制供生产使用。
传统的公钥密码术依赖于几乎不可能分解大整数。 另一方面,ECC依赖于将随机椭圆曲线解析为离散对数函数的不可能性,这是称为“椭圆曲线离散对数问题”或ECDLP的问题。 简而言之,ECC提供了具有类似安全性的较小密钥,这又转化为更高的加密性能,适用于像SSL这样的数字签名。
本教程,以及所有ECC证书,依赖于椭圆曲线的协议 ,可以有几种口味。 标准与技术研究院(NIST)的国家研究所的Suite B指定用于,P-256和P-384两个潜在的椭圆曲线,或称为prime256v1和secp384r1。 为简单起见,我们将使用前者,prime256v1,因为它是简单但实用。
先决条件
要遵循本教程,您需要:
- 一个新的Debian 8.1Droplet
- 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的一个ECC私钥ecparam
工具。
- 该
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
调用此命令将导致一系列提示。
- 通用名 :指定您的服务器的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
在配置文件的顶部,您会发现一个代码块,类似于以下内容:
...
# Default server configuration
#
server {
...
}
接下来的几个编辑将内部进行server
块。
- 首先,注释掉的前两行
server
模块,通过与英镑符号行前面:
server {
# listen 80 default_server;
# listen [::]:80 default_server;
- 然后,取消对首
listen
底下线SSL Configuration
通过删除井号。 缩进得当,也删除ssl default_server
。
# SSL Configuration
#
listen 443;
# listen [::]:443 ssl default_server;
#
更新根目录,直接在注释的块下面。 原来读取
server_name _;
将其更改为包括你的服务器IP,以便它读取server_name your_server_ip
。之后
server_name
,添加您的SSL密钥和证书路径。
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.pem;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
- 最后,添加SSL设置。
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;
您的最终结果应与以下内容相同。
# 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 https://example.com
)。 您的浏览器将警告您证书是自签名的。 您应该可以查看证书,并确认其详细信息与您在第4步中输入的内容相符。
结论
这就结束了我们的教程,让你有一个工作的Nginx服务器,使用ECC证书安全配置。 有关使用OpenSSL的的详细信息,请参阅OpenSSL的精华文章 。