在目前的安全体系中,最重要的部分是数字安全加密体系,包括数字内容的加解密、数字签名和验证。虫虫在这篇文章中介绍了数字证书签名,全球最大的网站Https免费签名Let'sEncrypts,以及数字证书签名的安全性。概述数字签名就是在信息后面加上一段内容,可以证明信息没有被修改过。怎样才能达到这个效果呢?一般是对信息进行不可逆的哈希计算,得到哈希值。信息发出时,将哈希值加密后作为签名与信息一起发送。接收方收到信息后,会重新计算信息的哈希值,并与信息附带的哈希值(解密后)进行比较。如果一致,说明信息内容没有被修改。数字签名是当今现代安全体系中非常重要的基础,可用于确保文件的完整性、防止文件被篡改和身份认证。首先说一下数字证书的几个常见的基本概念:RFCRFC是RequestForComments的意思,中文对应的是RequestComments,就是一堆描述不同协议的文本文件。如果你想了解SSL、TLS(新的SSL)和x509证书(SSL和TLS的证书)是如何工作的,例如,如果你想编写自己的OpenSSL,则必须阅读相应的TLSRFC。:X509证书对应rfc5280,TLS(1.2)对应rfc5246。x509x509是为非正式Internet电子邮件、IPsec和WWW应用程序定义的证书规范。x509发展了三个版本,现在广泛使用RFCv3,其结构如下:Certificate::=SEQUENCE{tbsCertificateTBSCertificate,signatureAlgorithmAlgorithmIdentifier,signatureValueBITSTRING}这些是ASN.1结构。现代证书是这样的:第一个对象包含将要签名的所有感兴趣的内容,因此我们称其为“待签名证书”第二个对象包含CA用于签署证书的签名类型(例如:sha256)最后一个对象不是对象,只是对应于DER编码的TBSCertificate签名的ASN.1的一些位。它看起来很小,但每个对象都有一定的深度。TBSCertificate是最大的TBSCertificate,里面包含了一堆客户端、CA、客户端公钥等信息,DER当然不会这样发证书。而是使用DER将其编码为二进制格式。每个字段名称都被忽略,如果我们的证书形成方式,将无法理解每个值的含义。每个值都编码为TLV三元组:[TAG,LENGTH,VALUE]例如,查看Github的证书是右侧DER编码证书的十六进制转储和左侧ASN.1格式的翻译。正如您在上面看到的,没有RFC,我们真的不知道每个值对应的是什么。openssl工具自带了很多命令行工具,可以用来解析证书的内容。只需使用opensslx509-incert.pem-noout-text即可获得Let'sEncrypt数字签名。点个赞,可以说是它一个人就支持了整个互联网网站的HTTPS天空。Let'sEncrypt成立于2014年,是一家非营利性的认证机构。目前为约2亿个网站提供数字证书认证,累计颁发证书10亿个。Let'sEncrypt成功的关键在于两点:(1)它是免费的。在Let'sEncrypt之前,大多数证书颁发机构向网站管理员收取费用以获得证书。Let'sEncrypt证书和商业证书的区别:(2)它是自动化的。如果您遵循其标准化协议,则可以通过API请求、更新甚至撤销证书。这与需要手动处理并需要一些时间来颁发证书的其他证书颁发机构形成对比。如果网站管理员希望网站example-com(通过HTTPS)为用户提供安全连接,可以向Let'sEncrypt颁发申请证书,在证明自己拥有example-com域名并颁发证书后,即可使用证书与任何信任“让我们加密”的浏览器协商安全连接。实际流程如下:Alice使用她的RSA公钥向Let'sEncrypt注册。Alice为example-com请求Let'sEncrypt证书。让我们为Alice加密以证明她是example-com的所有者需要签署一些数据并将其上传到example-com/.well-known/acme-challenge/some_file。在Alice签名并上传她的签名后,她要求Let'sEncrypt检查它。Let'sEncrypt检查example-com上的文件是否可访问,如果它成功下载签名并且签名有效,Let'sEncrypt将向Alice颁发证书。这个过程的流程图如下:数字证书劫持那么,我们假设Alice实际上并不拥有example-com,而是她通过中间劫持实现了第5步的加密。自Let'sEncrypt推出以来,这一直是一个问题。事实上,普林斯顿大学的一组研究人员在BGP中与Bamboozling证书颁发机构证明了这一点:他们演示了真实世界的BGP攻击,以道德的方式从顶级CA获取假证书。为了评估PKI的脆弱性,研究人员收集了包含180万个证书的数据集,发现这些数据集中的绝大多数域都可以成功伪造证书。在论文中,研究人员提出了两种解决方案来补救或至少降低这些以KPI为目标的攻击的风险:借助BGP监控系统,检测可疑的BGP路由并延迟证书验证使网络运营商有时间对BGP攻击做出反应。最近Let'sEncrypt实现了第一个解决方案:多角度域名验证。该方法改变了上述流程的第5步:在新政策下,Let'sEncrypt将从多个位置下载域名的证书验证。Let'sEncrypt攻击的工作原理AndrewAyer在2015年发现了Let'sEncrypt攻击。在其中,Andrew提出了一种方法来控制已验证域(example-com)的Let'sEncrypt帐户。攻击是这样的:爱丽丝通过在example-com(example-com/.well-known/acme-challenge/some_file)上上传一些数据来上传签名,以注册并完成域验证。然后,成功从Let'sEncrypt获取证书。然后Eve使用新帐户和新的RSA公钥签署Let'sEncrypt,并请求恢复example-com域Let'sEncrypt要求Eve签署一些新数据并将其上传到example-com/.well-known/acme-challenge/一些_文件。Eve制作了一个新的假密钥对并在Let'sEncrypt上更新了它的公钥。然后她要求Let'sEncrypt检查签名。Let'sEncrypt从example-com获取签名文件,签名匹配,Eve被授予example-com域的所有权。攻击示意图如下:在上述攻击中,Eve设法创建了一个有效的公钥来验证给定的签名和消息。数字签名不能唯一标识密钥或消息根据RSA的工作原理(这是现代证书交换链的基础):对于固定签名签名和(PKCS#1v1.5)消息,公钥(e,N)必须满足以下等式以验证签名:可以很容易地制作一个(大多数情况下)满足以下等式的公钥:可以很容易地验证验证是否有效:根据定义,最后一行是正确的。数字签名的安全性是由于理论和应用领域之间的安全证明和实施协议之间的差距。密码学中的签名通常使用EUF-CMA模型进行分析,该模型表示自适应选择消息攻击下存在的不可伪造性。通过该模型,生成一个密钥对,然后要求对任意消息进行签名。在观察签名时,如果在某个时间点可以为未经请求的消息生成有效签名,则获胜。不幸的是,虽然现代签名方案似乎通过了EUF-CMA测试,但它们常常表现出一些令人惊讶的特性。DennisJackson、CasCremers、KatrielCohn-Gordon和RalfSasse的论文《Automated Analysis of Subtle Attacks on Protocols that Use Signatures》尝试使用签名自动分析对协议的微妙攻击,试图列出这些令人惊讶的属性和受它们影响的签名方案(然后找到一个一堆)使用正式验证的协议。保守排他性(CEO)/破坏性排他性(DEO):(1)密钥替换攻击(CEO),其中使用不同的密钥对或公钥来验证给定消息上的给定签名。(2)消息密钥替换攻击(DEO),其中使用不同的密钥对或公钥来验证新消息上的给定签名。延展性。大多数签名方案都是可延展的,这意味着给定一个有效的签名,它可以被篡改以使其成为一个不同但仍然有效的签名。请注意,如果我是签名者,我通常可以为同一封邮件创建不同的签名。目前尚不清楚这是否会对任何现实世界的协议产生影响,尽管比特币MtGox交易所将其资金损失归咎于该协议,并且在2014年2月,曾经最大的比特币交易所MtGox关闭并申请破产,指控攻击者利用可塑性攻击来耗尽他们的账户。请注意,一种新的安全模型SUF-CMA(针对强EUF-CMA)试图将这种行为包含在签名方案的安全定义中,并且最近的一些标准(例如指定Ed25519的RFC8032)正在减轻其签名可延展性攻击该计划。.可以重新签。这很容易解释。要验证消息上的签名,通常不需要消息本身,但需要摘要。这样,任何人都可以在不知道消息本身的可碰撞性的情况下使用自己的密钥重新签署消息。一些方案允许制作将在多个消息下验证的签名。更糟糕的是,Ed25519的设计允许人们制作公钥和签名,从而非常有可能验证任何消息。(在一些实现中,比如libsodium,已经修复了这个问题。)下图总结了证书替换攻击:最后一个好的签名方案会积累有效的安全方法,所以在使用的时候,选择主要的方法一般是no问题。而如果你想重新发明轮子,自己实现更复杂的加密协议,就需要考虑这些问题。
