对于使用可信 CA 的服务器验证,用于签署服务器证书的 ca-public 密钥是否会提供回服务器?

For Server validation using a trusted CA, will the ca-public key that was used to sign the server certificate be provided back to the server?

我正在开发一个示例 TLS client/server 程序来执行证书验证。

对于自签名证书验证,这些是我遵循的步骤。

@服务器端:

  1. 生成了服务器密钥文件serverkey.key
  2. 从密钥文件生成了 CSR 证书servercert.csr。
  3. 数字签名(使用 openssl x509 实用程序)servercert.csr 使用 生成 rootCA.key 和 rootCA.cert。服务器证书文件 servercert.cert 生成。
  4. 加载证书文件(servercert.cert)和密钥文件(serverkey.key)使用 SSL_CTX_use_certificate_fileSSL_CTX_use_PrivateKey openssl apis.

@客户端:

  1. 加载服务器 ca 文件 --> rootCA.cert(手动复制到 客户端)使用 SSL_CTX_load_verify_locations api.
  2. 使用 SSL_get_verify_result() api 验证服务器的证书 发送证书消息。

我的问题是,如果我使用受信任的 CA(如 godaddy)签署服务器 CSR 证书,CA 是否会提供其 public 密钥文件(类似于 rootCA.cert) 以及哪个用于签名? 通过它我可以使用 SSL_CTX_load_verify_locations api.

将相同的内容加载到客户端的受信任列表

我的意图是保持代码不变,无论是自签名证书还是有效的 CA 提供的证书。

生成(任何)x509 证书时,会发生以下情况:

  1. 生成私钥
  2. Public 密钥(与上面提到的私钥相关联)嵌入 在新证书中(成为其中的一个组成部分)
  3. 新证书使用颁发者的私钥(读取:CA)签署

为了验证证书的完整性(检查是否没有人篡改它)- 您需要验证签名(使用颁发者的私钥创建 - 参见 3))。为了能够做到这一点,您需要(以某种方式)获得发行者的 public 密钥。此密钥 嵌入在颁发者的证书中 (请参阅 2))。通常受信任的 CA 的证书存储在所谓的 受信任的证书库 中。在 OpenSSL 的情况下,您可以使用 SSL_CTX_load_verify_locations 函数(以及其他一些类似的函数 - 请参阅 OpenSSL 文档)来指定此“存储”。

总结一下: 在您的情况下,SSL_CTX_load_verify_locations 指向的位置应该包含您的 CA 证书 - 所有这些 - 整个证书链到自签名根证书。您可以从您的 CA(在您的情况下是 GoDaddy)获取链中的所有证书。

希望对您有所帮助。 如果我能澄清更多,请询问。