X509 证书如何用于加密

信息安全 密码学 AES 不对称
2021-09-08 07:04:59

我对X509的进程有一点怀疑。我知道 OpenPGP 加密/解密,我们在其中生成公钥和私钥。我们可以与供应商共享公钥,他们可以用密钥加密数据,我们可以使用私钥解密数据。这对我来说很简单直接。

说到X509,我有点困惑。我的客户想要使用 X509 证书在两个人之间 [在客户和他的供应商之间] 传输敏感信息 [已经使用 AES 等对称加密进行了加密]。如果我们只能使用公钥生成证书,X509 是如何工作的。

假设,如果我使用 AES 和一个随机生成的密钥加密数据。如何使用 X509 将此数据与密钥一起传输给供应商,以便任何第三方在网络传输过程中不会拦截。

有人可以解释一下吗?顺便说一句,我们在 SOAP 消息中传输数据,包括证书信息

2个回答

X.509是一种证书格式:证书是一个字节序列,其中包含特定格式的名称公钥,在其上计算数字签名并将其嵌入证书中。签名者是一个证书颁发机构,它断言公钥确实由以该名称已知的实体所有。通过验证签名,您可以确定证书是真实的,即真的是 CA 颁发的;并且,通过这种方式,您在名称与公钥的绑定中获得信任(只要您相信 CA 诚实且不太容易上当受骗,并且您知道用于签名验证的 CA 密钥,这可能需要为CA,并验证该证书,等等,直到信任锚又名根证书)。

因此,X.509 是一种分发公钥的方法,我的意思是:一种允许各种参与者(例如您)知道的方法,并保证恶意第三方(即“攻击者”)不会更改公钥的其他演员。

OpenPGP是很多事情的标准格式。OpenPGP 定义的其中一件事是将公钥与“名称”(电子邮件地址)以及对这两者的签名进行编码的方法。这实际上就是一个证书本身(尽管其格式与 X.509 不兼容)。但是 OpenPGP 还定义了如何使用给定个人(我们称他为 Butch)的公钥来加密一堆只有 Butch 使用他的私钥才能解密的字节。从技术上讲,这使用随机生成的会话密钥,与 AES(或类似方法)一起使用来加密原始数据,并且该会话密钥是使用接收者的公钥(通常为 RSA 或 ElGamal 类型)加密的。

因此,对于您的问题,您不想“使用 X.509 加密”。X.509 对加密没有任何定义。您想要的是使用一种标准格式,该格式描述使用收件人的公钥进行加密,并基于 X.509 证书进行公钥分发。这种标准格式与 X.509 相结合,类似于 OpenPGP。这种标准格式存在,称为CMS(以前称为“PKCS#7”)。当 CMS 对象通过电子邮件发送时,这将成为另一层标准,称为S/MIME

CMS(或 S/MIME)是异步通信所需的:准备一个 blob,稍后发送给接收者,就像使用 OpenPGP 所做的一样。如果您可以进行同步通信(发送者和接收者同时“在线”),那么您可以使用SSL/TLS(或其 Web 对应物HTTPS)。在 SSL 中,服务器有一个公钥,它作为 X.509 证书发送给客户端。客户端验证证书,然后使用其中包含的公钥与服务器建立会话密钥,并使用该会话密钥加密数据。

无论如何,众所周知,将密码算法组装成协议很难正确完成,几乎不可能测试安全性,并且充满危险。所以不要想象你可以建立自己的混音;你真的应该依赖现有的标准,比如 CMS 或 SSL。

X509 证书是一种交换公钥的方法。听起来供应商可能希望您继续进行 AES 加密,然后用他们的公钥加密 AES 密钥,这样您就可以传输 AES 密钥而不会被截获。到目前为止,非对称(公钥/私钥)密码学最常见的用途是签名和对称密钥交换。

我主要担心的是您提到您在 SOAP 请求中获取证书,这让我质疑验证是如何发生的。这一步对我来说没有多大意义,因为如果您事先不知道证书(因此没有必要发送它),那么我不确定您将如何验证它应该有权访问数据并且没有受到中间人攻击的适当用户。

更可取的方法是让 X509 证书成为您已签名的证书,这样您的系统就可以知道证书是有效的,并且对于发送它的用户来说是有效的。然后,即使中间有人提出请求,只要他们没有证书的私钥,他们就无法解密 AES 密钥,数据对他们来说毫无用处。