Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >为什么我强烈建议你使用ECC 证书

为什么我强烈建议你使用ECC 证书

作者头像
Bug开发工程师
发布于 2019-05-05 08:09:21
发布于 2019-05-05 08:09:21
11.8K02
代码可运行
举报
文章被收录于专栏:码农沉思录码农沉思录
运行总次数:2
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
作者:Jerry Qu
原文:https://imququ.com/post/ecc-certificate.html

本文包含三部分内容:1)简单介绍 ECC 证书是什么;2)介绍如何申请 ECC 证书;3)以 Nginx 为例介绍如何使用 ECC 证书。

简单介绍

HTTPS 通过 TLS 层和证书机制提供了内容加密、身份认证数据完整性三大功能,可以有效防止数据被监听或篡改,还能抵御 MITM(中间人)攻击。TLS 在实施加密过程中,需要用到非对称密钥交换和对称内容加密两大算法。

对称内容加密强度非常高,加解密速度也很快,只是无法安全地生成和保管密钥。在 TLS 协议中,应用数据都是经过对称加密后传输的,传输中所使用的对称密钥,则是在握手阶段通过非对称密钥交换而来。常见的 AES-GCM、ChaCha20-Poly1305,都是对称加密算法。

非对称密钥交换能在不安全的数据通道中,产生只有通信双方才知道的对称加密密钥。目前最常用的密钥交换算法有 RSA 和 ECDHE:RSA 历史悠久,支持度好,但不支持 PFS(Perfect Forward Secrecy);而 ECDHE 是使用了 ECC(椭圆曲线)的 DH(Diffie-Hellman)算法,计算速度快,支持 PFS。要了解更多 RSA 和 ECDHE 密钥交换的细节,可以阅读 Cloudflare 的这篇文章:https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/。

只有非对称密钥交换,依然无法抵御 MITM 攻击,还得引入身份认证机制。对于大部分 HTTPS 网站来说,服务端一般通过 HTTP 应用层的帐号体系就能完成客户端身份认证;而浏览器想要验证服务端身份,需要用到服务端提供的证书。

浏览器会在两个步骤中用到证书:1)证书合法性校验。确保证书由合法 CA 签署,且适用于当前网站;2)使用证书提供的非对称加密公钥,完成密钥交换和服务端认证。

证书合法性校验的原理,简单总结如下:

  • 根据版本号、序列号、签名算法标识、发行者名称、有效期、证书主体名、证书主体公钥信息、发行商唯一标识、主体唯一标识、扩展等信息,生成 TBSCertificate(To Be Signed Certificate)信息;
  • 签发数字签名:使用 HASH 函数对 TBSCertificate 计算得到消息摘要,再用 CA 的私钥进行加密,得到签名;
  • 校验数字签名:使用相同的 HASH 函数对 TBSCertificate 计算得到消息摘要,与使用 CA 公钥解密签名得到内容相比较;

可以看到校验证书需要同时用到签名和非对称加密算法:目前必须使用 SHA-2 做为证书签名函数(没有打 XP SP3 补丁的 IE6 不支持);目前一般使用 RSA 算法对 TBSCertificate 进行非对称加密。可以通过 openssl 工具来查看证书签名算法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ openssl x509 -in chained.pem -noout -text | grep 'Signature Algorithm'

Signature Algorithm: sha256WithRSAEncryption

大部分 CA 都有证书链,浏览器对于收到的多级证书,需要从站点证书开始逐级验证,直至出现操作系统或浏览器内置的受信任 CA 根证书。

浏览器还需要校验当前访问的域名是否存在于证书 TBSCertificate 的 Common NameSubject Alternative Name 字段之中。

在 RSA 密钥交换中,浏览器使用证书提供的 RSA 公钥加密相关信息,如果服务端能解密,意味着服务端拥有证书对应的私钥,同时也能算出对称加密所需密钥。密钥交换和服务端认证合并在一起。

在 ECDHE 密钥交换中,服务端使用证书私钥对相关信息进行签名,如果浏览器能用证书公钥验证签名,就说明服务端确实拥有对应私钥,从而完成了服务端认证。密钥交换和服务端认证是完全分开的。

可用于 ECDHE 数字签名的算法主要有 RSA 和 ECDSA,也就是目前密钥交换 + 签名有三种主流选择:

  • RSA 密钥交换(无需签名);
  • ECDHE 密钥交换、RSA 签名;
  • ECDHE 密钥交换、ECDSA 签名;

以下是 Chrome 中这三种密钥交换方式的截图(截图来自于早期 Chrome,新版 Chrome 查看位置有了变化):

内置 ECDSA 公钥的证书一般被称之为 ECC 证书,内置 RSA 公钥的证书就是 RSA 证书。由于 256 位 ECC Key 在安全性上等同于 3072 位 RSA Key,加上 ECC 运算速度更快,ECDHE 密钥交换 + ECDSA 数字签名无疑是最好的选择。由于同等安全条件下,ECC 算法所需的 Key 更短,所以 ECC 证书文件体积比 RSA 证书要小一些。以下是本站的对比,可以看到左侧的 ECC 证书要小 1/3:

RSA 证书可以用于 RSA 密钥交换(RSA 非对称加密)或 ECDHE 密钥交换(RSA 非对称签名);而 ECC 证书只能用于 ECDHE 密钥交换(ECDSA 非对称签名)。

并不是所有浏览器都支持 ECDHE 密钥交换,也就是说 ECC 证书的兼容性要差一些。例如在 Windows XP 中,使用 ECC 证书的网站只有 Firefox 能访问(Firefox 的 TLS 自己实现,不依赖操作系统);Android 平台中,也需要 Android 4+ 才支持 ECC 证书。

好消息是,Nginx 1.11.0 开始提供了对 RSA/ECC 双证书的支持。它的实现原理是:分析在 TLS 握手中双方协商得到的 Cipher Suite,如果支持 ECDSA 就返回 ECC 证书,否则返回 RSA 证书。

也就是说,配合最新的 Nginx,我们可以使用 ECC 证书为现代浏览器提供更好的体验,同时老旧浏览器依然会得到 RSA 证书,从而保证了兼容性。这一次,鱼与熊掌可以兼得。

如何申请

如果你的 CA 支持签发 ECC 证书,使用以下命令生成 CSR(Certificate Signing Request,证书签名请求)文件并提交给提供商,就可以获得 ECC 证书:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl ecparam -genkey -name secp256r1 | openssl ec -out ecc.key
openssl req -new -key ecc.key -out ecc.csr

以上命令中可供选择的算法有 secp256r1 和 secp384r1,secp521r1 已被 Chrome 和 Firefox 废弃。

我目前在用的 Let’s Encrypt,也支持签发 ECC 证书。我使用了 acme.sh 这个小巧的工具来签发证书,指定 -k ec-256 就可以将证书类型改为 ECC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"/root/.acme.sh"/acme.sh --issue --dns dns_cx -d imququ.com -d www.imququ.com -k ec-256

目前 Let’s Encrypt 只提供 RSA 中间证书,官方预计会在 2017 年 3 月底提供 ECC 中间证书(via)。

如何使用

有了 RSA/ECC 双证书之后,还需要安装 Nginx 1.11.x。这部分内容我之前详细写过,请点击查看。

一切准备妥当后,将证书配置改为双份即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssl_certificate     example.com.rsa.crt;ssl_certificate_key example.com.rsa.key;ssl_certificate     example.com.ecdsa.crt;ssl_certificate_key example.com.ecdsa.key;

问题来了!本站使用 Cloudflare 提供的 Cipher Suites 配置,在 Nginx 中配置了双证书并重启,用 Chrome 测试发现仍然没有采用 ECC 证书。这是为什么呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# https://github.com/cloudflare/sslconfig/blob/master/confssl_ciphers                 EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;ssl_prefer_server_ciphers   on;

研究发现,Chrome 与服务端协商到的 Cipher Suites 是 ECDHE-RSA-AES128-GCM-SHA256,来自于 ssl_ciphers 配置中的 EECDH+AES128 这部分。我们通过 openssl 工具看一下 EECDH+AES128 具体包含哪些 Cipher Suites:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl ciphers -V 'EECDH+AES128' | column -t

0xC0,0x2F  -  ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)  Mac=AEAD
0xC0,0x2B  -  ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(128)  Mac=AEAD
0xC0,0x27  -  ECDHE-RSA-AES128-SHA256        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(128)     Mac=SHA256
0xC0,0x23  -  ECDHE-ECDSA-AES128-SHA256      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(128)     Mac=SHA256
0xC0,0x13  -  ECDHE-RSA-AES128-SHA           SSLv3    Kx=ECDH  Au=RSA    Enc=AES(128)     Mac=SHA1
0xC0,0x09  -  ECDHE-ECDSA-AES128-SHA         SSLv3    Kx=ECDH  Au=ECDSA  Enc=AES(128)     Mac=SHA1

可以看到,使用 RSA 做为签名认证算法(Au=RSA)的加密套件排到了前面,导致 Nginx 作出了错误判断。

知道原因就好办了,将这段配置改为 EECDH+ECDSA+AES128:EECDH+aRSA+AES128,再看一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl ciphers -V 'EECDH+ECDSA+AES128:EECDH+aRSA+AES128' | column -t

0xC0,0x2B  -  ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(128)  Mac=AEAD
0xC0,0x23  -  ECDHE-ECDSA-AES128-SHA256      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(128)     Mac=SHA256
0xC0,0x09  -  ECDHE-ECDSA-AES128-SHA         SSLv3    Kx=ECDH  Au=ECDSA  Enc=AES(128)     Mac=SHA1
0xC0,0x2F  -  ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)  Mac=AEAD
0xC0,0x27  -  ECDHE-RSA-AES128-SHA256        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(128)     Mac=SHA256
0xC0,0x13  -  ECDHE-RSA-AES128-SHA           SSLv3    Kx=ECDH  Au=RSA    Enc=AES(128)     Mac=SHA1

这下就没问题了。

并不是所有加密套件都需要把 ECDSA 和 aRSA 分开写,例如 EECDH+CHACHA20 就不需要,ECDSA 默认就在前面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl ciphers -V 'EECDH+CHACHA20' | column -t

0xCC,0xA9  -  ECDHE-ECDSA-CHACHA20-POLY1305  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=ChaCha20-Poly1305  Mac=AEAD
0xCC,0xA8  -  ECDHE-RSA-CHACHA20-POLY1305    TLSv1.2  Kx=ECDH  Au=RSA    Enc=ChaCha20-Poly1305  Mac=AEAD

最终,我的 Cipher Suites 配置如下,供参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssl_ciphers                EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农沉思录 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
独家 | 手把手教你推导决策树算法
决策树是最重要的机器学习算法之一,其可被用于分类和回归问题。本文中,我们将介绍分类部分。
数据派THU
2020/06/12
6710
1、决策树理论知识详解与sklearn实践
首先看决策树的相关理论,在我看过的一些资料中,李航老师的《统计机器学习》这部分写得最全面,因此下面的内容主要参考了这本书,但顺序我做了一些更改,改成了决策树理论建立的顺序,以便读者能够更容易看懂。
zstar
2022/06/13
4110
1、决策树理论知识详解与sklearn实践
理论:决策树及衍射指标
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下的经验条件熵H(D|A)之差
sladesal
2018/08/27
3240
理论:决策树及衍射指标
决策树的构建原理
决策树(Decision Tree)是一种简单但是广泛使用的分类预测模型。通过训练数据构建决策树,可以高效的对未知的数据进行分类并作出决策。决策树有两大优点,一是决策树模型可以读性好,具有描述性,有助于人工分析;二是效率高,决策树只需要一次构建,反复使用,但是预测的最大计算次数不能超过决策树的深度。一个简单的决策树例子如下所示:
SYSU星空
2022/05/05
1.5K0
决策树的构建原理
HAWQ + MADlib 玩转数据挖掘之(十一)——分类方法之决策树
一、分类方法简介 1. 分类的概念         数据挖掘中分类的目的是学会一个分类函数或分类模型(也常常被称作分类器),该模型能把数据库中的数据项映射到给定类别中的某一个。分类可描述如下:输入数据
用户1148526
2018/01/03
1.5K0
HAWQ + MADlib 玩转数据挖掘之(十一)——分类方法之决策树
决策树:最清晰明了的分类模型
决策树属于监督学习算法的一种,根据原始输入数据中的特征,构建一个树状模型来进行分类。比如探究早晨是否出去打网球的例子,输入数据如下
生信修炼手册
2021/03/10
6780
决策树:最清晰明了的分类模型
MADlib——基于SQL的数据挖掘解决方案(25)——分类之随机森林
装袋(bagging)又称自助聚集(bootstrap aggregating),是一种根据均匀概率分布从数据集中重复抽样(有放回的)的技术。每个自助样本集都和原始数据集一样大。由于抽过程是有回放的,因此一些样本可能在同一训练数据集总出现多次,而其它一些却可能被忽略。一般来说,自助样本
用户1148526
2019/05/25
1K0
Machine learning -- C4.5算法详解及Python实现
程序实现部分转自 Wsine的博客小站 地址:http://www.cnblogs.com/wsine/p/5180315.html C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类。C4.5的目标是通过学习,找到一个从属性值到类别的映射关系,并且这个映射能用于对新的类别未知的实体进行分类。 C4.5由J.Ross Quinlan在ID3的基础上提出的。ID3算法用来构造决策
昱良
2018/04/04
2.7K0
Machine learning -- C4.5算法详解及Python实现
MADlib——基于SQL的数据挖掘解决方案(21)——分类之KNN
数据挖掘中分类的目的是学会一个分类函数或分类模型,该模型能把数据库中的数据项映射到给定类别中的某一个。分类可描述如下:输入数据,或称训练集(Training Set),是由一条条数据库记录(Record)组成的。每一条记录包含若干个属性(Attribute),组成一个特征向量。训练集的每条记录还有一个特定的类标签(Class Label)与之对应。该类标签是系统的输入,通常是以往的一些经验数据。一个具体样本的形式可为样本向量:(v1,v2,...,vn;c),在这里vi表示字段值,c表示类别。分类的目的是:分析输入数据,通过在训练集中的数据表现出来的特征,为每一个类找到一种准确的描述或模型。由此生成的类描述用来对未来的测试数据进行分类。尽管这些测试数据的类标签是未知的,我们仍可以由此预测这些新数据所属的类。注意是预测,而不是肯定,因为分类的准确率不能达到百分之百。我们也可以由此对数据中的每一个类有更好的理解。也就是说:我们获得了对这个类的知识。
用户1148526
2019/05/25
1K0
机器学习之决策树(Decision Tree)及其Python代码实现
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/54927178
大黄大黄大黄
2018/09/14
2.4K0
机器学习之决策树(Decision Tree)及其Python代码实现
Python人工智能:基于sklearn的决策树分类算法实现总结
本文使用sklearn的sklearn.tree.export_graphviz类函数实现分类决策树的可视化。需要注意的的是我们需要首先配置graphviz软件,具体配置方法可以自行百度,我前面写了一篇文章可供参考Python人工智能:Ubuntu系统中网络结构绘图工具库Graphviz的使用方法简介。
用户1143655
2023/03/21
1.9K0
Python人工智能:基于sklearn的决策树分类算法实现总结
决策树
决策树归纳的基本算法是贪心算法,它以自顶向下递归各个击破的方式构造决策树。 贪心算法:在每一步选择中都采取在当前状态下最好的选择。 在其生成过程中,分割方法即属性选择度量是关键。通过属性选择度量,选择出最好的将样本分类的属性。 根据分割方法的不同,决策树可以分为两类:基于信息论的方法(较有代表性的是ID3、C4.5算法等)和最小GINI指标方法(常用的有CART,SLIQ及SPRINT算法等)。 前面已经学习了预备知识信息量与Gini index ID3算法 ID3的属性选择度量就是使用信息增益,选择最高信
用户1733462
2018/06/01
5990
原创 | 决策树在金融领域的应用(附链接)
作者:王佳鑫审校:陈之炎 本文约4800字,建议阅读15分钟本文带你了解决策树是如何工作的。 决策树的基础概念 决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。我们来简单了解一下决策树是如何工作的。 决策树算法的本质是一种图结构,只需要问一系列问题就可以对数
数据派THU
2022/09/02
1.2K0
原创 | 决策树在金融领域的应用(附链接)
【机器学习】ID3、C4.5、CART 算法
ID3(Iterative Dichotomiser 3)算法使用信息增益作为特征选择的标准。它是一种贪心算法,信息增益表示按某特征划分数据集前后信息熵的变化量,变化量越大,表示使用该特征划分的效果越好。但ID3偏向于选择取值较多的特征,可能导致过拟合。
摆烂小白敲代码
2024/09/29
2180
【机器学习】ID3、C4.5、CART 算法
决策树算法之----C4.5
1. C4.5算法简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类。C4.5的目标是通过学习,找到一个从属性值到类别的映射关系,并且这个映射能用于对新的类别未知的实体进行分类。 C4.5由J.Ross Quinlan在ID3的基础上提出的。ID3算法用来构造决策树。决策树是一种类似流程图的树结构,其中每个内部节点(非树叶节点)表示在一个属性上的测试,每个分枝代
智能算法
2018/04/03
1.5K0
决策树算法之----C4.5
决策树之ID3、C4.5、C5.0等五大算法及python实现
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/47617801
悟乙己
2019/05/28
2.6K0
决策树(Decision Tree)C4.5算法
C4.5,是机器学习算法中的另一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法,也是上节所介绍的ID3的改进算法,所以基本上了解了一半决策树构造方法就能构造它。
统计学家
2019/04/08
1.7K0
决策树(Decision Tree)C4.5算法
数据分析入门系列教程-决策树原理
今天我们一起来学习决策树,那么什么是决策树呢,其实在生活中,我们无时无刻不在使用它。
周萝卜
2020/10/30
5550
数据分析入门系列教程-决策树原理
机器学习17:决策树模型
决策树分为两大类:分类树和回归树,分类树用于分类标签值,回归树用于预测连续值,常用算法有ID3、C4.5、CART等。
用户5473628
2019/08/08
9530
机器学习17:决策树模型
[机器学习算法]决策树引论和CART算法
决策树decision tree分类法是一种简单但广泛使用的分类技术。以是否贷款违约的二分类问题为例,当我们希望根据给定的训练集习得一个模型对新出现的贷款人进行分类时,经常需要从大量的贷款申请单中识别出来哪些贷款人是劣质的贷款人(容易拖欠贷款)。想象一下客户经理和助手针对一个贷款者进行的如下对话:
TOMOCAT
2020/06/09
6610
[机器学习算法]决策树引论和CART算法
推荐阅读
相关推荐
独家 | 手把手教你推导决策树算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验