X509 TLS 客户端证书和服务器证书之间有什么区别吗?
我一直在实施基于证书的相互身份验证,因此尝试获取/使用物联网设备的证书。虽然我们对服务器证书非常清楚,但我想知道各个 IoT 设备将加载并呈现给服务器以进行身份验证的客户端证书是否与用于服务器的证书相同/相似。
客户端证书是否也将从 CA 获取,然后服务器将通过根 CA 证书对其进行验证,其方式与针对根 CA 验证服务器证书的方式相同?
X509 TLS 客户端证书和服务器证书之间有什么区别吗?
我一直在实施基于证书的相互身份验证,因此尝试获取/使用物联网设备的证书。虽然我们对服务器证书非常清楚,但我想知道各个 IoT 设备将加载并呈现给服务器以进行身份验证的客户端证书是否与用于服务器的证书相同/相似。
客户端证书是否也将从 CA 获取,然后服务器将通过根 CA 证书对其进行验证,其方式与针对根 CA 验证服务器证书的方式相同?
在结构上,客户端和服务器证书是相同的。两者都需要keyUsage: digitalSignature并且将包含相同类型的 RSA 或 ECDSA 密钥。它们以与服务器证书完全相同的方式通过Issuer和字段链接到中间 CA 和根 CA。AIA它们通过 CRL 或 OCSP 以与服务器证书完全相同的方式处理撤销。
但是,根据服务器中的强制/授权规则,您可能需要在客户端证书中放置不同的元数据。例如:
dNSName与可以访问服务器的公共域名匹配的 SubjectAltName 类型。这对客户来说绝对没有意义。通常,您会看到一个serialNumberDN 组件,或一种不太常见的 SAN 类型。extendedKeyUsage: id-kp-clientAuth.同样,这些都是“可能”类型的项目,取决于您构建服务器的方式;尽管我确实建议您考虑进行某种访问控制,而不是盲目地接受来自根 CA 的任何证书。
是的,在证书的构造和签名方式的技术方面,客户端和服务器证书非常相似。它们都只是公钥、一些任意元数据和 CA 签名,它们的构造方式几乎相同。服务器和客户端证书之间的唯一区别基本上只是将哪些元数据附加到证书以及如何针对实体验证这些元数据。
理论上,如果您在 TLS 库堆栈中禁用证书验证和使用约束检查,或者如果证书未指定使用约束,您实际上可以将任一客户端证书用作服务器证书,反之亦然。密码学实际上并不区分客户端和服务器证书,它只是关心使用限制的应用程序完成的验证,如果您同时控制客户端和服务器,您可以自由指定要强制执行的任何验证特定的连接。
对于服务器证书,证书元数据在 SAN 字段中指定证书有效的 DNS 名称,并根据 TCP 堆栈连接的服务器的域名验证证书。
对于客户端证书,证书包含 CA 已验证的用户属性。服务器根据其身份验证要求验证这些属性。例如,您可以添加一个属性,指定证书持有者的头发颜色为蓝色,并且您的服务器可能仅在客户端为绿色头发时才允许连接。
请注意,对于服务器和客户端证书,您不一定必须使用公共根 CA,但由于使用证书的方式,客户端证书使用私有根 CA 比使用服务器证书更常见。
当您使用私有根时,您可以定义您自己的认证实践声明 (CPS),它允许您指定您自己的身份验证要求以及任何需要包含在私有根颁发的证书中的自定义属性。这是公共根客户端 CA 所没有的控制级别,它通常只提供针对人名的电子邮件地址的简单标识,因为大多数公共根客户端 CA 用于电子邮件加密,而不是 IoT 设备标识。如果您为每个物联网设备提供自己的 DNS 名称,那么您可以使用具有公共根 CA 的服务器证书作为客户端证书,但这有点不寻常的安排。
请注意,一些销售针对公共根 CA 的服务器证书的 CA 还提供用于私有根管理的 CA 服务。如果您想要一个专业管理的私有根 CA,但又不想从头开始构建您自己的 CA 基础架构,则可以使用此选项。
作为补充说明,服务器证书始终是机器证书,而客户端证书通常是人类证书。
不同之处在于,服务器证书是在组织的已识别成员可以证明他们属于该组织并有权管理服务器证书之后授予他们的,而客户端证书通常是在他们可以证明其身份之后授予特定人员的. 一个不太严格的版本会提供给特定电子邮件地址的持有人,以后可以用作证明该持有人已签署某些东西的证据。
正如您所说的物联网,您的客户端证书既不会识别人类,也不会识别电子邮件持有人。这意味着重要的是您打算识别设备的方式。如果它们具有 DNS 名称或固定 IP 地址,则证书可以将其用作标识,与标识服务器名称完全相同。换句话说,它们将非常接近服务器证书。如果您在公共域中使用私有名称,它们将更接近于邮件持有人证书,只是该名称不是有效地址。