如何在Nginx上为Debian 8创建ECC证书

介绍

本文介绍如何为Nginx创建椭圆曲线加密(ECC)SSL证书。在本教程结束时,您将有一个更快的加密机制供生产使用。

传统的公钥加密依赖于几乎不可能分解大整数。另一方面,ECC依赖于将随机椭圆曲线解析为离散对数函数的不可能性,这个问题被称为“椭圆曲线离散对数问题”或ECDLP。简而言之,ECC提供具有类似安全性的较小密钥,这反过来转化为更高的加密性能,适用于SSL等数字签名。

本教程和所有ECC证书都依赖于椭圆曲线协议,该协议可以有多种形式。美国国家标准与技术研究院(NIST)Suite B规定了两种可能使用的椭圆曲线,P-256和P-384,也称为prime256v1和secp384r1。为简单起见,我们将使用前者,prime256v1,因为它简单但实用。

要完成本教程,您需要具备一台已经设置好可以使用sudo命令的非root账号的Debian服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

准备

要学习本教程,您需要:

  • 一个新安装的Debian 8.1 腾讯云CVM
  • 一个可以使用sudo权限的非root用户,您可以按照本教程的第 2步和第3步进行设置
  • OpenSSL已安装并更新

要进行测试,您需要安装和更新OpenSSL的两个系统之一:

  • 另一个Linux 腾讯云CVM
  • 基于Linux的本地系统(Mac,Ubuntu,Debian等)

第1步 - 安装Nginx

在此步骤中,我们将使用一个名为apt-get的内置包安装程序。它大大简化了管理并简化了安装。

您应该已经更新了apt-get并安装了sudo软件包,与其他Linux发行版不同,Debian 8没有安装sudo

Nginx是前面提到的HTTP服务器,专注于处理内存使用率低的大型负载。要安装它,请运行以下命令:

sudo apt-get install nginx

第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

调用此命令将导致一系列提示。

  • 通用名称:指定服务器的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

设置文件权限以保护您的私钥和证书。

sudo chmod 600 /etc/nginx/ssl/*

您的证书和保护它的私钥现在可以进行设置了。

第4步 - 设置证书

在本节中,我们将使用密钥和证书配置Nginx虚拟主机。实际上,我们的服务器将开始提供HTTPS而不是HTTP请求。

使用nano或您喜欢的文本编辑器打开服务器配置文件。

sudo nano /etc/nginx/sites-enabled/default

在配置文件的顶部,您将找到一段代码,类似于以下内容:

...
# Default server configuration
#
server {
...
}

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

  1. 首先,通过在行前面加一个井号来注释掉server块的前两行:
server {
    # listen 80 default_server;
    # listen [::]:80 default_server;
  1. 然后,通过删除井号来取消注释SSL Configuration下面的第一行listen。缩进正确,也删除ssl default_server
    # SSL Configuration
    #
    listen 443;
    # listen [::]:443 ssl default_server;
    #
  1. 直接在注释块下面更新根目录。原来的读取server_name _;。更改它以包括您的服务器IP,以便它读取server_name your_server_ip
  2. server_name之后,添加您的SSL密钥和证书路径。
        ssl on;
        ssl_certificate /etc/nginx/ssl/nginx.pem;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
  1. 最后,添加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)另一个腾讯云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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Linux 基于tar与openssl加密解密压缩包

跨公网传输备份文件是运维和DBA们经常干的活,但是未经加密的压缩文件在公网上传输,就好比在亚龙湾裸泳,稍不留神就被拍啊,哈哈!本文主要描述通过openssl结合...

1614
来自专栏FreeBuf

影响所有Windows版本远程桌面(RDP)应用的CredSSP漏洞分析

在3月13号的微软补丁日中,由Preempt团队发现的Windows凭据安全支持提供协议(CredSSP)高危漏洞CVE-2018-0886被修复,该漏洞为逻辑...

5505
来自专栏七夜安全博客

你不知道的 HTTPS中间人攻击

研究生毕业了,好好给自己放了个假期,休息了两周,文章博客都没有更新。从大学开始基本上没过暑假,匆匆忙忙的。再过两天,就要去腾讯工作了,做了自己喜欢的网络安全,重...

1713
来自专栏七夜安全博客

无线安全专题_攻击篇--干扰通信

2484
来自专栏QQ音乐技术团队的专栏

分析 Android V2 新签名打包机制

本文实现了一种在 apk 的签名块中写入信息,读取信息,删除信息还原 apk 等功能,验证了在签名块中写入信息可以通过 v2 检验的例子。

2.6K0
来自专栏小文博客

为你的博客注册登陆页面添加【十以内运算验证码】

1472
来自专栏惨绿少年

全站HTTPS简单实践

第一个里程碑:创建https证书 1 [root@web01 backup]# openssl req -new -x509 -nodes -out ser...

2310
来自专栏FreeBuf

直面冥王:最新爆发的C#敲诈木马HadesLocker解读

近日哈勃分析系统捕获到一类由C#语言编写的新的敲诈勒索木马。之前出现 的C#语言编写的木马只是简单地调用了一些C#库来辅助开发。与之相比,这次的变种增加了多层嵌...

3066
来自专栏IMWeb前端团队

Nodejs进阶:核心模块https 之 如何优雅的访问12306

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 模块概览 这个模块的重要性,基本不用强调了。在网络安全问题日益严峻的今天,...

30510
来自专栏网络

突破封闭 Web 系统的技巧之正面冲锋

在互联网安全服务公司乙方工作的人或者进行 SRC 众测等相关渗透测试时,经常碰到客户只给一个 "xxx信息管理系统"、"xxx平台"之类的一个 Web 登录界面...

27110

扫码关注云+社区

领取腾讯云代金券