c - 如何确定连接是否使用 apache2 httpd 模块的加密/SSL?

标签 c apache https apache-modules

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

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

最佳答案

在您自己的模块中定义

#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)modules/ssl/ssl_engine_vars.c:ssl_var_register() 中注册函数 ssl_is_https() 。此函数接受一个连接 (conn_rec *),如果该连接使用 SSL/TLS 加密 (HTTPS),则返回非零值。

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

关于c - 如何确定连接是否使用 apache2 httpd 模块的加密/SSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51257887/

相关文章:

android https - 在缺少证书验证时演示 MITM

ssl - 托管在谷歌云平台上的 Aruba 域的 HTTPS

将 char* 的一部分转换为 int

c - 关于填充同步结构

c - 错误 : called object is not a function

apache - 内容安全策略 : allowing all external images?

c - 我写了一个程序来打印所有素数直到给定一个数字

php - mysql 未在 php 5.3.1 的 phpinfo() 中启用

php - .htaccess php_value display_errors 设置因错误 500 而中断

javascript - 让 src 属性使用与页面相同的协议(protocol)