Использование openssl в пользовательском модуле apache

Я разрабатываю (для моей магистерской работы) модуль для веб-сервера Apache (httpd) и поэтому хотел бы использовать реализацию HMAC, предпочтительно предоставляемую OpenSSL.

К сожалению, как только я добавляю вызов в библиотеки OpenSSL и пытаюсь запустить, Apache вылетает с сообщением, что не может найти указанный модуль. (Только для Windows, в Linux нет сообщений). Когда я закомментирую звонок, все снова работает нормально.

В настоящее время я занимаюсь разработкой с использованием Windows и Visual Studio (для удобства я знаю, что это не очень хорошая установка), но я мог воспроизвести почти то же поведение в Debian 9, где я использовал apxs. Вот почему я предполагаю, что проблема не имеет ничего общего с настройкой или IDE.

mod_example.c:

#include "apr_dbd.h"
#include "http_core.h"
#include "http_log.h"
#include "mod_example.h"
#include "mod_dbd.h"
#include "apr_strings.h"
#include "openssl/hmac.h"
#include "example_utils.c"

module AP_MODULE_DECLARE_DATA example_module;

static apr_status_t example_filter(ap_filter_t* f, apr_bucket_brigade* bb)
{
    ...
}

static apr_status_t example_init(ap_filter_t *f)
{
    ...
    /* Calculate hash */
    // http://www.askyb.com/cpp/openssl-hmac-hasing-example-in-cpp/
    char *hash = "undefined";
    char key[] = "012345678";
    char data[] = "hello world";
    unsigned char* digest;

    // This is the offending call
    digest = HMAC(EVP_sha1(), key, strlen(key), (unsigned char*)data, strlen(data), NULL, NULL);

    ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, "Digest: %s", digest);
    ...
}

static void* example_create_conf(apr_pool_t* pool, server_rec* svr) {
    ...
}

static int example_post_config(apr_pool_t *pool, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
{
    ...
}

static const char* example_set_server_name(cmd_parms* cmd, void* cfg, const char* val) {
   ...
}

static const command_rec example_cmds[] =
{
    AP_INIT_TAKE1("exampleServerName", example_set_server_name, (void*)APR_OFFSETOF(example_conf, name), RSRC_CONF | OR_ALL, "Specifies a name to for a server or part in the configuration to link database entries to config."),
    {NULL}
};

static void register_hooks(apr_pool_t *pool)
{
    /* Register our hooks */
    ap_register_output_filter_protocol("example", example_filter, example_init, AP_FTYPE_CONTENT_SET, AP_FILTER_PROTO_CHANGE | AP_FILTER_PROTO_NO_CACHE | AP_FILTER_PROTO_CHANGE_LENGTH);
    ap_hook_post_config(example_post_config, NULL, NULL, APR_HOOK_MIDDLE);
}

AP_DECLARE_MODULE(example) =
{
    STANDARD20_MODULE_STUFF,
    NULL,               /* Per-directory configuration handler */
    NULL,               /* Merge handler for per-directory configurations */
    example_create_conf,               /* Per-server configuration handler */
    NULL,               /* Merge handler for per-server configurations */
    example_cmds,       /* Any directives we may have for httpd */
    register_hooks      /* Our hook registering function */
};

Мои основные вопросы сейчас:

  • Кто-нибудь сталкивался с подобными проблемами? Как, где они решены?
  • Apache вообще запрещает встраивание сторонних библиотек или только OpenSSL несовместим?
  • Если в Windows и Linux должно быть две разные проблемы, кто-нибудь знает, что изменить в Linux (установил apache2, apache2-dev, openssl, libssl-dev и использовал apxs -i -c -a mod_example.c), чтобы заставить его работать?
  • Кто-нибудь нашел удобную альтернативу реализации HMAC в OpenSSL? В случае крайней необходимости, я буду придерживаться SHA1 APR.

Спасибо за вашу помощь. Я знаю, что пока предоставил очень мало информации, в основном из-за неопределенных ошибок и их окружения. Если вам нужна дополнительная информация, пожалуйста, спросите.

Всего наилучшего, Даниэль

0 ответов

Другие вопросы по тегам