【问题标题】:Members of SSL structureSSL结构的成员
【发布时间】:2016-09-06 21:02:11
【问题描述】:

在 OpenSSL 的 SSL/TLS 客户端 implementation 中,定义了一个结构 SSL。例如,这里通常是前几行(来自链接)。

SSL_CTX* ctx = NULL;
BIO *web = NULL, *out = NULL;
SSL *ssl = NULL;

init_openssl_library();

我无法在 OpenSSL 库的头文件中找到它的结构。 SSL * ssl的内容如何学习?

【问题讨论】:

  • 它是一个不透明的结构,应用程序不需要知道内容。
  • 无论出于何种原因你认为你必须知道它的内容:你不知道。如果您好奇或想帮助开发:请阅读源代码。
  • 就像你使用stdio时不需要知道FILE的结构一样。
  • 我现在只是好奇,在头文件中找不到它的定义(github.com/openssl/openssl)。我检查了 openssl/include/openssl/ssl.h 和一堆其他文件。基本上我想知道哪个结构保存了握手结束时生成的密钥。
  • @Olaf - “无论出于何种原因你认为你必须知道它的内容:你不知道” - 有很多原因可能希望看到内容。我可以在不尝试的情况下想到一些,例如会话的日志记录和离线分析。其他原因包括研究和追踪源头以解决由于缺少文档而导致的问题。

标签: c ssl openssl


【解决方案1】:

我一直无法在 openssl 库的头文件中找到它的结构类型。

目前还不清楚您指的是哪个版本的 openssl 以及您看起来如何,但 grep -r ' SSL;' /usr/include/openssl/ 很快在 openssl/ossl_typ.h 中找到了 openssl 1.0.2 的匹配项:

   typedef struct ssl_st SSL;

“ssl_st”的以下 grep 导致其在 openssl/ssl.h 中的定义:

#ifndef OPENSSL_NO_SSL_INTERN

struct ssl_st
        {
        /* protocol version
         * (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION, DTLS1_VERSION)
         */
        int version;
        int type; /* SSL_ST_CONNECT or SSL_ST_ACCEPT */
...

请注意,结构的位置和内容在其他版本的 openssl 中可能有所不同。

【讨论】:

  • 我不知何故错过了一个明确的警告,不要在用户代码中使用这个struct。通常有充分的理由从应用程序代码中隐藏 struct 的实现细节。
  • @Olaf:首先这些是在 openssl 安装过程中安装的头文件,因此这些信息不会对应用程序隐藏。然后我写道:“请注意,结构的位置和内容在其他版本的 openssl 中可能有所不同。”。除此之外 - 根据 OpenSSL 的版本,代码所需的几个内部结构只能通过使用未记录的函数或进入内部结构来访问。他们在 1.1.0 中发生了很大变化,既降低了内部结构的可见性,又为以前只能通过内部结构提供的东西发布了稳定的 API。
  • "根据 OpenSSL 的版本,代码需要的几个内部结构只能通过使用未记录的函数或进入内部结构来访问。" - 好的,这是唯一正当的理由。这是 lib 中的一个设计缺陷,但不符合惯例。
  • @Olaf:当然,如果有适合解决特定问题的 API,则应始终使用它,而不是深入研究内部。否则代码维护将是一场噩梦。
【解决方案2】:

在 openssl 1.1.1 ssl_st 中定义在 /ssl/ssl_local.h 的第 1080 行。

由于某种原因,这似乎是一个隐藏的定义,即使某些回调需要此结构作为参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多