【问题标题】:How to determine if a connection used encryption/SSL from apache2 httpd module?如何确定连接是否使用了来自 apache2 httpd 模块的加密/SSL?
【发布时间】:2018-07-10 05:38:38
【问题描述】:

在用 C 编写的 Apache2 模块的上下文中,如何确定请求 (request_rec *r) 是否已加密?我见过似乎可以做到这一点的代码,但我要么无法弄清楚如何实现它,要么它总是返回“true”,即使在未加密的连接上也是如此。

在 PHP 中,如果使用 HTTPS,$_SERVER['HTTPS'] 将设置为“开启”。

【问题讨论】:

    标签: c apache https apache-modules


    【解决方案1】:

    在你自己的模块中,定义

    #include <mod_ssl.h>
    
    static int is_https(conn_rec *c)
    {
        int (*is_https_conn)(conn_rec *c);
        is_https_conn = APR_RETRIEVE_OPTIONAL_FN(ssl_is_https);
        if (is_https_conn)
            return is_https_conn(c);
        return 0;
    }
    

    因此您可以测试请求 request_rec *r 是否使用 SSL/TLS 连接,使用

    if (is_https(r->connection)) {
       /* Yes, request is via an SSL/TLS-encrypted connection */
    } else {
       /* No, the request is not via an encrypted connection */
    }
    

    该逻辑基于 SSL/TLS 模块使用APR_REGISTER_OPTIONAL_FN(ssl_is_https) 将函数ssl_is_https() 注册到modules/ssl/ssl_engine_vars.c:ssl_var_register() 中。此函数接受一个连接 (conn_rec *),如果连接使用 SSL/TLS 加密 (HTTPS),则返回非零值。

    我们使用APR_RETRIEVE_OPTIONAL_FN(ssl_is_https) 来检索指向所述函数的指针。如果它没有被注册,这将返回 NULL(显然没有连接可以被加密)。如果它返回一个非 NULL 指针,我们调用该函数。如果连接是 HTTPS,它将返回非零值。

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 2017-07-30
      • 2021-12-09
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多