如何在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 块内进行。

  1. 首先,注释掉 server 块的前两行,在该行前面加上一个井号:

等/nginx/启用站点/默认

server {
    # listen 80 default_server;
    # listen [::]:80 default_server;
  1. 然后,通过删除井号来取消注释 SSL Configuration 下面的第一行 listen。 正确缩进,并删除 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://example.com) 中使用 HTTPS。 您的浏览器会警告您证书是自签名的。 您应该能够查看证书并确认详细信息与您在步骤 4 中输入的内容相匹配。

##结论

我们的教程到此结束,为您留下一个工作 Nginx 服务器,安全地配置了 ECC 证书。 有关使用 OpenSSL 的更多信息,请参阅 OpenSSL Essentials 文章