Использование 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.
Спасибо за вашу помощь. Я знаю, что пока предоставил очень мало информации, в основном из-за неопределенных ошибок и их окружения. Если вам нужна дополнительная информация, пожалуйста, спросите.
Всего наилучшего, Даниэль