本文介绍如何为Nginx创建椭圆曲线加密(ECC)SSL证书。在本教程结束时,您将有一个更快的加密机制供生产使用。
传统的公钥加密依赖于几乎不可能分解大整数。另一方面,ECC依赖于将随机椭圆曲线解析为离散对数函数的不可能性,这个问题被称为“椭圆曲线离散对数问题”或ECDLP。简而言之,ECC提供具有类似安全性的较小密钥,这反过来转化为更高的加密性能,适用于SSL等数字签名。
本教程和所有ECC证书都依赖于椭圆曲线协议,该协议可以有多种形式。美国国家标准与技术研究院(NIST)Suite B规定了两种可能使用的椭圆曲线,P-256和P-384,也称为prime256v1和secp384r1。为简单起见,我们将使用前者,prime256v1,因为它简单但实用。
要完成本教程,您需要具备一台已经设置好可以使用sudo
命令的非root账号的Debian服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
要学习本教程,您需要:
要进行测试,您需要安装和更新OpenSSL的两个系统之一:
在此步骤中,我们将使用一个名为apt-get
的内置包安装程序。它大大简化了管理并简化了安装。
您应该已经更新了apt-get
并安装了sudo
软件包,与其他Linux发行版不同,Debian 8没有安装sudo
。
Nginx是前面提到的HTTP服务器,专注于处理内存使用率低的大型负载。要安装它,请运行以下命令:
sudo apt-get install nginx
这部分简单而简短。我们需要将私钥和证书存储在一个容易记忆的位置,因此我们需要创建一个新目录。
sudo mkdir /etc/nginx/ssl
在本节中,我们将申请新证书并签名。
首先,使用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
调用此命令将导致一系列提示。
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
设置文件权限以保护您的私钥和证书。
sudo chmod 600 /etc/nginx/ssl/*
您的证书和保护它的私钥现在可以进行设置了。
在本节中,我们将使用密钥和证书配置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;
SSL Configuration
下面的第一行listen
。缩进正确,也删除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_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
在本节中,我们将通过命令行测试服务器。再一次,这可以在(1)本地基于Linux的系统或(2)另一个腾讯云CVM 上完成。您也可以从同一个shell窗口运行此命令,但您可能需要更加可靠的成功证明。
通过HTTPS 443端口打开连接。
openssl s_client -connect your_server_ip:443
在键输出后滚动到输出的中间,您应该找到以下内容:
---
SSL handshake has read 3999 bytes and written 444 bytes
---
...
SSL-Session:
...
当然,数字和示例不一样也是成功的。恭喜!
按CTRL+C
退出。
您还可以使用URL(https://example.com
)中的HTTPS在Web浏览器中访问您的站点。您的浏览器会警告您证书是自签名的。您应该能够查看证书并确认详细信息与您在步骤4中输入的内容相匹配。
这是我们的教程的结束,让您使用一个有效的Nginx服务器,使用ECC证书进行安全配置。
想要了解更多关于创建ECC证书的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Create an ECC Certificate on Nginx for Debian 8》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。