如何为Debian 8上创建一个Nginx的ECC证书

介绍

本文介绍如何为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

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

/ etc / nginx / sites-enabled / default
...
# Default server configuration
#
server {
...
}

接下来的几个编辑将内部进行server块。

  1. 首先,注释掉的前两行server模块,通过与英镑符号行前面:
etc / nginx / sites-enabled / default
server {
    # listen 80 default_server;
    # listen [::]:80 default_server;
  1. 然后,取消对首listen底下线SSL Configuration通过删除井号。 缩进得当,也删除ssl default_server
/ etc / nginx / sites-enabled / default
    # SSL Configuration
    #
    listen 443;
    # listen [::]:443 ssl default_server;
    #
  1. 更新根目录,直接在注释的块下面。 原来读取server_name _; 将其更改为包括你的服务器IP,以便它读取server_name your_server_ip

  2. 之后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;
  1. 最后,添加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 https://example.com )。 您的浏览器将警告您证书是自签名的。 您应该可以查看证书,并确认其详细信息与您在第4步中输入的内容相符。

结论

这就结束了我们的教程,让你有一个工作的Nginx服务器,使用ECC证书安全配置。 有关使用OpenSSL的的详细信息,请参阅OpenSSL的精华文章

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏