如何在Nginx上为Debian7创建ECC证书

来自菜鸟教程
跳转至:导航、​搜索

介绍

本教程演示了如何创建椭圆曲线加密 (ECC) 公钥和私钥对以用于 Nginx,这是一种高性能 HTTP 服务器。 与传统 RSA 密钥相比,ECC 密钥具有一些优势。 ECC 密钥提供与较大 RSA 密钥等效的安全性,同时尺寸更小,减少了服务器所需的资源并为移动设备提供更快的性能。

使用 ECC 可以提高流媒体、VPN 连接或其他高带宽应用程序的性能。 赛门铁克等证书颁发机构 (CA) 已开始提供 ECC 或 Elliptic Curve C 加密证书。 如果您在使用前向保密或完美前向保密之前已经连接到一个网站,那么您已经使用了椭圆曲线密码学! 本指南详细介绍了使用 prime256v1 曲线在 Debian Wheezy 系统上使用 Nginx 部署自签名 ECC 私钥和公共证书所需的步骤。

注意: 有多种不同的曲线可供您使用。 为了使本文保持简单,我们使用 prime256v1 曲线。

要求

  • 带有 Debian 7.0 Wheezy 的液滴。
  • OpenSSL 安装和更新。

跑:

 apt-get update && apt-get upgrade

更新后最好重新启动 Droplet。

  • 现代浏览器:Internet Explorer 7+(Windows Vista、Windows 7)、Firefox 19+(Linux、Mac、Windows)或 Chrome 25+(Android、Linux、Mac、Windows)。 在本教程中,我们将使用 Firefox 进行测试。

以下所有命令都应以 root 用户身份执行。

第 1 步:安装 Nginx

使用 apt-get 包管理器安装 Nginx。 Nginx 是一个高性能的 HTTP 服务器,可以处理大量并发请求,而不会占用你的 Droplet 上的大量内存。 需要安装其他软件包。 要接受安装,请输入 Y,然后按 Enter 键。

apt-get install nginx 

第 2 步:生成并签署 ECC 私钥

创建一个目录来存储私钥、证书签名请求和服务器证书。 我建议创建目录 /etc/nginx/ssl。 然后进入目录。

mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

使用 OpenSSL 的 ecparam 工具生成 ECC 私钥。 此命令使用 prime256v1 ECC 曲线生成 256 位私钥,并将密钥保存在名为 privatekey.key 的文件中。 此 256 位密钥等效于 2048 位 RSA 私钥。

openssl ecparam -out privatekey.key -name prime256v1 -genkey

使用 OpenSSL 生成证书签名请求。

openssl req -new -key privatekey.key -out csr.pem

运行此命令后,您将看到几个问题。 对于 Common Name 提示,请确保输入服务器的 IP 地址或主机名。 提供质询密码。 所有其他字段都可以填写您认为合适的信息。

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 []:

Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:

注意: 此时您可以将您的证书提交给权威机构进行签名。 按照您选择的 CA 提供的说明进行操作。 赛门铁克目前正在提供 ECC 证书,未来预计会有更多的证书颁发机构提供 ECC 证书。 出于本指南的目的,将创建一个自签名证书。

创建证书或公钥。 客户端使用证书来加密只有服务器可以读取的数据。 OpenSSL x509 工具用于使用证书签名请求 (CSR) 创建自签名证书。 如果要使证书有效期更长,可以将 -days 的值从 365 更改为 3650,创建有效期为 10 年的证书。

openssl req -x509 -days 365 -key privatekey.key -in csr.pem -out certificate.pem

设置文件权限,使其他用户无法访问您的私钥和证书。

chmod 600 /etc/nginx/ssl/*
      1. Step 3:使用 ECC 密钥和证书配置 Nginx

使用您选择的文本编辑器打开默认的 Nginx 虚拟主机配置。 默认情况下,Nginx 包配置文件设置为仅服务 HTTP 请求。 现在我们将配置 Nginx 来处理 HTTPS 请求。

vi /etc/nginx/sites-enabled/default

Nginx 默认虚拟主机配置文件底部附近是 HTTPS 服务器的示例配置,顶部附近有 listen 443; 行。 取消注释这些行并更新您的 HTTPS 服务器块以匹配下面显示的示例。 您将编辑大部分行,因此请注意!

更改值时,请确保在每行末尾保留分号 (;)。

#HTTPS server
#
server {
    listen 443;
    server_name Your IP Address or Hostname;
#
    root /usr/share/nginx/www;
    index index.html index.htm;
#
    ssl on;
    ssl_certificate /etc/nginx/ssl/certificate.pem;
    ssl_certificate_key /etc/nginx/ssl/privatekey.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 / {
        try_files $uri $uri/ =404;
    }
}

一旦您的 HTTPS 服务器块与上面的示例匹配,请保存您的更改。

请注意,根据您的云 Droplet 的现有配置,可能需要对 HTTPS 服务器块进行其他更改。 例如,如果您的云服务器正在运行 PHP,您需要将添加到 HTTP 块以支持 PHP 的行复制到 HTTPS 块中。

重新启动 Nginx 以应用更改。

service nginx restart
      1. 步骤 4:使用 ECC 测试 Nginx

我们将使用 Firefox 进行测试,尽管任何现代网络浏览器都可以访问您的网站并使用 ECC 加密。

使用 Firefox 浏览到您的云服务器的 IP 地址或主机名。 接受自签名证书警告后,您应该会看到“欢迎使用 nginx!” 页。 您将收到证书警告,因为服务器的证书是自签名的,并且尚未由您的 Web 浏览器识别的证书颁发机构签名。

https://IP 或主机名

请参阅下面的初始警告:

接受证书。

如果您使用的是 Mozilla Firefox,请单击地址栏中 https:// 前缀附近的挂锁。 将出现连接信息窗口。

单击 更多信息… 按钮。 在新窗口中,在 Security 选项卡下,单击 View Certificate 按钮。 选择 详细信息 选项卡。 向下滚动并选择 算法参数 字段。 在下面的 Field Value 文本区域中,您应该看到包含 椭圆曲线 prime256v1 的文本,表示 ECC 证书。

Subject 的公钥 字段将显示 256 位的公钥大小。

恭喜! 您的 Nginx 服务器现在配置了 ECC 私钥和证书!