【问题标题】:OpenSSL certificate revocation check in client program using OCSP stapling使用 OCSP 装订在客户端程序中检查 OpenSSL 证书吊销
【发布时间】:2012-03-25 08:05:39
【问题描述】:

我有一个嵌入式 C 客户端程序,它使用 OpenSSL 安全地连接到服务器。服务器在握手期间提供其证书,客户端必须检查此证书的吊销状态。目前我通过使用 OCSP 来做到这一点。

所有这些都有效,但现在我需要使用OCSP stapling 重新实现客户端的撤销检查(假设服务器将开始提供此功能)。

目前我使用X509 *cert = SSL_get_peer_certificate(ssl) 获取服务器证书,以根据我的服务器域检查subjectAltName 并获取authorityInfoAccess(用于OCSP URI)。

假设我有一个SSL * ssl; 并且我成功设置了所有内容并通过SSL_connect(ssl); 连接,此时我该怎么做才能获取 OCSP 装订信息并验证我刚刚收到的证书?我找不到任何关于如何使用 OpenSSL 库实际实现它的示例代码。

【问题讨论】:

    标签: c ssl openssl certificate ocsp


    【解决方案1】:

    有几个步骤:

    1. 让客户端通过SSL_set_tlsext_status_type(ssl, TLSEXT_STATUSTYPE_ocsp)发送status_request扩展。

    2. 注册回调(和参数)以通过SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb)SSL_CTX_set_tlsext_status_arg(ctx, arg) 来检查OCSP 响应

    3. 编写回调函数。 s_client 使用的那个演示了如何获取响应信息:

      static int ocsp_resp_cb(SSL *s, void *arg)
      {
      const unsigned char *p;
      int len;
      OCSP_RESPONSE *rsp;
      len = SSL_get_tlsext_status_ocsp_resp(s, &p);
      BIO_puts(arg, "OCSP response: ");
      if (!p)
          {
          BIO_puts(arg, "no response sent\n");
          return 1;
          }
      rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
      if (!rsp)
          {
          BIO_puts(arg, "response parse error\n");
          BIO_dump_indent(arg, (char *)p, len, 4);
      return 0;
      }
      BIO_puts(arg, "\n======================================\n");
      OCSP_RESPONSE_print(arg, rsp, 0);
      BIO_puts(arg, "======================================\n");
      OCSP_RESPONSE_free(rsp);
      return 1;
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 2017-05-26
      • 2019-04-23
      • 2016-11-13
      • 1970-01-01
      相关资源
      最近更新 更多