您的X509证书指南(适用于凡人)

如果你对X509证书有深刻的了解,请举手。现在我们承认没有人举手,让我们改变这一点。

证书是一个复杂的主题,通常不容易理解。本教程旨在通过展示X509证书示例、演示PKI证书等方式改变这种情况。

在本文中,你将对X509证书有一个良好的概述。到最后,你将对它们的高层工作原理有所了解。虽然一篇文章不能让你成为专家,但到文章结束时,你至少会熟悉正确的术语。

相关内容:使用Windows证书管理器和PowerShell管理证书

公钥和私钥:保护资产

任何解释X509证书的信息都不能忽略首先提到的密钥。当谈到密钥私钥公钥的术语时,你可能已经听说过密钥的概念。那么证书密钥有什么关系呢?

为了更容易理解这种联系,让我们通过一个老式的门锁来解释密钥的概念。

当你购买一个新的门锁时,该锁将配有一把门钥匙。该钥匙是唯一的,以确保没有其他人能够打开它。

把锁本身想象成一个公钥。当安装好后,你、你的家人或路人都可以看到门上的锁。任何人都可以自由查看甚至尝试解锁,但是他们不会成功。要解锁它,他们需要插入最初与锁一起提供的独特门钥匙。与锁一起提供的独特钥匙就是私钥

。私钥和公钥一起被称为密钥对

。密钥交换

当门钥匙插入锁时,你可以将这个动作看作是交换密钥。私钥(门钥匙)需要交换公钥(锁)才能解锁门

。在密码学领域,你可以自由地公开公钥,并保留私钥。毕竟,你不在乎谁看到锁,但你确实在乎谁可以解锁它(交换密钥)

。有几种不同的密钥交换算法,这些算法专注于推导和安全传输一个独特的共享密钥

。你可能听说过的两种流行的密钥交换算法是Diffie-Hellman(DH)和椭圆曲线Diffie-Hellman(ECDH)

。密钥信任

如果需要有人通过门进入,你会给他们钥匙(或原始独特钥匙的复制)。你只会把你的钥匙给那些你信任的人。持有私钥(门钥匙)的人已经被信任可以解锁门锁(公钥)

。密钥用途

密钥用途定义了X509证书的目的,这与证书将使用的算法一致。扩展密钥用途(EKU)定义了公钥在密钥用途之外的预期用途。

X509证书:公钥“容器”

私钥和公钥与X509证书的概念有何关系?把证书简单看作是公钥。证书是“容器”,其中包含公钥以及有关密钥的其他一些信息,如公钥的受让人,谁签署了密钥等。证书以文件的形式存储。

稍后我们将介绍一些优秀的X509证书示例。

你是否见过带有PEM或CER证书文件扩展名的文件?那些就是证书(公钥)。稍后你将更多地了解这些格式。

单独的公钥本质上并不被定义为证书。定义证书的是公钥和相关属性数据的组合。

A certificate provides a standardized and secure format to communicate with specific systems along with the attributes to help validate a key pair trust. How certificates are built are defined within the X.509 standards, as you will read about later.

指纹:证书的唯一标识符

每个X509证书都旨在提供对单个主体的识别。证书应确保每个公钥都是唯一可识别的。

A certificate thumbprint or fingerprint is a way to identify a certificate, that is shorter than the entire public key. Technically, a serial number is as well but you’ll learn about that when it comes to certification authorities (CAs). The thumbprint is a hash of a DER-encoded certificate in Windows.

通过较小的唯一标识符识别较大数据集的概念是指纹识别的一般计算主题。 Morgan Simonson的博客更深入地探讨了指纹识别。

主题:定义重要的X509证书属性

每个X509证书不仅需要有一个唯一标识符,还需要回答以下类似的问题。证书主题应该就是这样做。

  • 谁应该使用这个证书?
  • 应该信任哪个组织?
  • 哪个用户应该出示这个证书?

主题可以说是证书中最重要的部分。主题旨在具有由X.500定义的属性,代表证书发给谁或什么。它以专有名称(DN)格式表示。

A certificate subject is a string value that has a corresponding attribute type. For example, the DN for State or Province is st. This attribute type contains the full name of the state or province the subject resides in (e.g. ST=California).

这些属性类型和值格式由ITU-T X.520建议定义。另一个参考是RFC 4519,用于特定属性类型和值格式的建议。

由于X509证书标准不是规则,只是强烈建议,许多人在定义主题时会运用自己的判断。主题应该明确标识您信任的最终实体。如果主题没有表现出这一点,您如何能够信任使用提供的公钥的任何内容?

换句话说,如果您允许多个人使用相同的用户名访问系统,您就无法追究任何特定人员的行为责任。这种做法使证书旨在符合的信任模型变得复杂。

您可以在下面的截图中看到 Windows 如何表示 X509 证书,更具体地说是证书主体。

X509 certificate example

使用 Cryptext.dll 查看证书的属性。

主题备用名称(SAN)

A SAN is a certificate extension that allows you to use one certificate for multiple subjects that’s typically identified with a Subject Key Identifier (SKI). The example below shows some of the SANs Google uses. Adding more domains to a certificate essentially tells the certificate to trust each subject to use the same private key.

A SAN can also have several types other than DNS names called GeneralNames. GeneralNames require the client reading the certificate to support SANs using GeneralNames. Most clients such as web browsers only focus on the DNS name SAN.

您可以在此 X509 证书示例中看到 SAN。

Subject Alternative Name in a Windows certificate

与 Google 证书关联的一些 SAN 属性。

理解编码

我们用许多语言进行交流,同样,计算机也有自己的语言。这种语言是二进制的,不同的编码方法是我们使二进制更易于他人使用的方式,就像我们将英语翻译成其他语言一样。

编码有特定的目的。编码使人可读的扩展值以一种计算机也能使用的方式存储。编码格式使计算机更容易存储和传输 X509 证书,同时也允许我们阅读其内容。

计算机擅长处理整数,编码使您能够将数值转换为字母数字值或甚至二进制块。这种转换对于与计算机一起工作至关重要,证书依赖编码来正确传达与计算机的适当信息。编码格式定义了执行这些转换的标准。

  • ASN.1 – 抽象语法表示一标准是证书中各字段的序列化格式。
  • ASCII美国信息交换标准代码(ASCII)为计算机控制字符和用于大多数人类可读通信的可打印字符定义了二进制值。
  • Base64 – Base64定义了一种在ASCII字符集中对二进制内容进行编码的方案。这些是您可以在文本编辑器中打开并看到“BEGIN CERTIFICATE”或其他引用文本的证书。
  • DER – 专为ASN.1数据定义的Distinguished Encoding Rules(DER)另一种编码方案,将数据表示为顺序八位字节。对DER的重要考虑是编码输出不可视为ASCII。

您可以在下面看到编码方案的差异。注意,首先显示的certificate.crt文件具有——-BEGIN CERTIFICATE——-,后跟一堆随机字母和数字,并以——-END CERTIFICATE——-结束。所有字符都是人类可读的。第一个证书是Base64编码的。

现在看看certificate.cer文件的第二个例子。这个文件的内容看起来与Base64证书大不相同。这个X509证书是DER编码的。

DER-encoded certificate shown in PowerShell

Base64和DER编码文件之间的区别。

理解X509证书文件类型

请记住,证书只是一个公钥和一些元数据的表示文件。您会发现许多不同类型的文件在野外代表着许多不同类型的证书。每种类型的文件都通过其文件扩展名来区分。例如,当我们提到一个KEY文件时,我们指的是其文件扩展名。

下面是您可能要处理的所有常见类型的证书,以及它们的文件扩展名定义和用途。

在下面的列表中,您会注意到各种对PKCS的引用。PKCS或公钥密码学标准是一组标准,用于定义各种证书的创建方式。有关更多信息,请参阅这篇信息丰富的维基百科文章

  • PFX – 这些通常在Windows环境中找到,但无论操作系统如何,都是一种标准格式。PFX文件包含一个证书、公钥和扩展,以及使用密码加密的私钥。PFX由PKCS #12标准定义。
  • P12 – 与PFX类似,P12由PKCS #12标准定义。形式上,PKCS #12是PFX格式的继任者,尽管这两种文件类型在现代加密实现中表示相同的格式。
  • P7B – 这是一个ASN.1证书的容器,专门用于证书颁发机构链的所有层级的公钥,如下文所述。PKCS #7文件提供了一个单个文件来分发多个公钥,通常用于手动与私有PKI中的CA建立信任。
  • P7C – P7C文件类型在功能上与P7B相同,只是另一种常见的扩展名,用于表示PKCS#7文件。
  • DER – DER文件是DER编码的公钥。
  • CER – 一个公钥可以是DER或Base64编码的。CER文件通常是DER编码的。通常
  • CRT – CRT通常是Base64编码的,但不能保证。通常
  • KEY – KEY文件通常是Base64编码的私钥,无论是否加密。
  • PEM – 引用Base64编码的证书,尽管多个密钥可以在单个PEM文件中,通常假定PEM文件包含私钥。最常用于PEM Base64编码的私钥文件,可以是加密或未加密的。
  • CSR – 用于向CA提交公钥以进行签名,并发出其他字段,如序列号,由PKCS#10定义。在大多数情况下,CSR将包含以Base64编码的请求的ASN.1结构。
  • REQ – 在Windows中用于指定生成CSR时使用的登记政策设置。
  • CRL – CRL是列出CA撤销的证书的特定文件,包括它们的撤销状态以及被撤销的原因。

公钥基础设施(PKI):X509证书生态系统

回想一下之前有人拿着门锁的钥匙。那个时候,你只有一扇门。但是如果你突然发现自己是几十个甚至几百个公寓的房东呢?管理那么多门锁的钥匙会变得很麻烦!

此外,租户不会永远住在那间公寓里。会有一些人保留钥匙或者未经授权地复制钥匙。你需要更换门锁以防止他们进入。你不再信任前任租户了。

如果你需要管理数百个经常进进出出的公寓,你该如何管理所有这些呢?答案是公钥基础设施(PKI)。

PKI是一个完整的生态系统,围绕公钥管理构建了一整套角色、政策和流程。PKI代表了一组全面的、涉及多个不同领域的焦点,用于分发、使用、管理和撤销X509证书。它实质上覆盖了处理和管理大规模证书所需的一切。

在接下来的章节中,我们将详细介绍PKI的许多常见组成部分,并解释每个组件的作用。

证书颁发机构(CAs):你的父母

A PKI is primarily built around the concept of managing trust. But since it’s not economical to directly manage hundreds or thousands of trust relationships, you need a mediator.

你需要一个已经得到原始方的认可的第三方。这些第三方调解者称为证书颁发机构(CAs),由用于签署给定证书的公钥派生的权威密钥标识(AKI)扩展进行标识。

当你把自己想象成一个X509证书时,可以把自己看作是一个孩子。你可能被你的父母教导过不要相信陌生人。但是如果你的父母(那些你信任的人)向你介绍一个陌生人并告诉你可以相信他们,你可能会同意并信任这个陌生人。毕竟,如果你的父母信任他们,你也可以信任他们。

A CA plays the role of your parents. You trust your parents (a CA) and they introduce you to strangers. They do so by signing the stranger’s public key to let you know that you can trust them.

CA的主要角色是充当可信的中介。

颁发X509证书:建立信任

作为一个知名的可信实体,CA使间接参与方之间建立了信任。为了在参与方之间建立信任,CA会“颁发”证书。当我们谈论CA的颁发时,实际上是指CA正在验证请求的扩展并附加CA生成的扩展以创建证书。

当CA颁发X509证书时,它将使用自己的私钥对证书的公钥进行数字签名。通过签名过程,CA标记证书的方式告诉所有人它信任这个公钥。DocuSign提供了一个很好的概述,并附有一个良好的图表,解释了这个特定的概念。

CA生成扩展的另一个例子是每个证书的序列号,每个序列号需要根据RFC设计规范对于给定的CA是唯一的。

现代新闻中意外信任的一个例子是恶意使用带有恶意软件的PKI。创建者收到了有效证书,这些证书被大多数系统隐式信任,使得您的系统更难以识别恶意的二进制文件。

吊销X509证书:撤销信任

CA还负责吊销不再受信任的X509证书。这些吊销由CA发布到证书吊销列表(CRL)中。吊销是CA主动使证书无效的一种方式,而不是等待有效期到期。

信任是证书正常运行所必需的关键组成部分。分发点通过提供参考点来帮助确保信任,证书和吊销列表可以从发行者那里下载,并与您使用的证书进行比较。

A CRL Distribution Point (CDP) supplies the protocols and locations to obtain CRLs. Updating CRLs is a passive revocation validation method, with pulling updates at scheduled intervals. Online Certificate Status Protocol (OCSP) actively requests the revocation status of a specific certificate by maintaining caches of the CRLs.

虽然通过CRL或OCSP进行吊销验证是可用的,但它是由客户端需要支持和执行的,并且并非总是如此。

分层

A PKI can be made up of multiple CAs or a single CA, these are commonly referred to as tiers.

X509证书链接

正如您所了解的,信任是使用证书时的一个主要焦点。参与方必须能够信任或验证由受信任的CA颁发的证书。

A great example of how this scales is the The United States Federal PKI public documents. These provide a great reference into maintaining an inter-organization trust relationship using CAs.

X509证书签名

您经常会听到一个叫做证书签名的概念,但这究竟是什么意思呢?正如您已经了解的那样,证书关乎信任。为了建立信任,X509 证书由 CA 进行签名。签署证书会为证书分配一个独特的密码散列,告诉所有阅读它的各方,他们可以信任它。这是由一个受信任的 CA 签名的。

在 PKI 层次结构中,证书由 CA 签署,但这些证书的用途取决于由什么类型的 CA 对其进行签名。

当 PKI 中只有一个 CA 时,该 CA 就是根。由于不存在其他 CA,该 CA 必须生成自己的自签名证书。然后,该 CA 发布由其自己的证书签名的证书。

如果 PKI 中有多个 CA,则所有 CA 都由根 CA 或链回根 CA 的中间 CA 签署。

通常,当设备在生成 X509 证书时使用与公钥相对应的私钥时,这被称为自签名证书。但是,您也可以请求 CA 使用其自己的私钥签署您的证书。

签名算法

签名算法侧重于验证远程对等方消息的真实性。数字签名是使用发送者的私钥加密的散列函数的消息摘要。接收方使用发送者公钥的副本解密数字签名。然后,接收方可以将接收到的消息的摘要与从数字签名解密的摘要进行比较。当摘要匹配时,消息的真实性就是有效的。

非对称加密是能够生成密文而无需先前已知的密钥的能力。密钥交换算法与签名算法的组合是非对称加密的基础。

以下是数字签名中使用的主要算法。

  • RSA算法(Rivest–Shamir–Adleman)
  • DSA算法(Digital Signature Algorithm)
  • ECDSA算法(Elliptic Curve DSA)

证书签名请求(CSRs)

签发CA使用证书签名请求(CSR),允许客户端向CA提交公钥以进行签发。CA接受CSR并将基于配置的签发政策签发已签名的X509证书。这意味着,你信任的每个CA也意味着对其签名的公钥的信任。

哈希

哈希是一个复杂的话题,在这篇文章中我甚至不会尝试完全解释它。Computerphile团队在他们的YouTube频道上有一个很好的概述。哈希集中于将输入对象转换为该唯一输入的唯一输出哈希。输出哈希称为摘要。这意味着即使是最微小地更改输入对象,也会创建一个不同的唯一且不相关的摘要。

现代实现将侧重于安全哈希算法(SHA)2算法。需要注意的是,SHA 256、SHA 384和SHA 512被称为SHA 2。

以下是你会看到的常见哈希算法列表。

  • SHA 256
  • SHA 384
  • SHA 512
  • 信息摘要(MD)5

证书策略

证书策略(CP)扩展提供了对维护CA的组织的引用,记录了他们针对给定PKI的实际政策,并应当与证书实践声明(CPS)对齐,提供组织维护给定PKI的政策。

分发点

证书中确定的另一种分发点是权威信息访问(AIA)。这些AIA提供了获取证书颁发者信息副本的协议和位置,通常指的是颁发CA的公钥。

摘要

希望现在当你被问到类似文章开头的问题时,你能更自信地举手。但老实说,希望本文帮助你理解X509证书的复杂性,以及Windows对这些标准的实现。在帮助你理解未来处理证书时的一些基本组件。

至少现在,当有人要求你的证书的公钥时,你可以确认他们想要DER编码还是Base64编码,而他们不会知道,所以你仍然会同时发送两者。

进一步阅读

Source:
https://adamtheautomator.com/x509-certificates/