Это очень похоже на другие вопросы, но те, на которые я смотрел, либо не имеют ответа, либо не задают один и тот же вопрос. У меня есть самоподписанный сертификат ЦС и два других сертификата, подписанных с этим сертификатом ЦС. Я уверен, что сертификаты верны, потому что работает "openssl verify":
$ openssl verify -CAfile ca.pem server.pem
server.pem: OK
(Вышеизложенное из памяти, я не имею их передо мной, так что это может быть немного отключено).
Теперь я хочу проверить сертификаты программно. У меня есть функция утилиты с псевдокодом ниже:
int verify_cert(X509 *cert, X509 *cacert)
{
int ret;
X509_STORE *store;
X509_STORE_CTX *ctx;
store = X509_STORE_new();
X590_STORE_add_cert(store, cacert);
ctx = X509_STORE_CTX_new();
X509_STORE_CTX_init(ctx, store, cert, NULL);
ret = X590_verify_cert(ctx);
/* check for errors and clean up */
}
Моя проблема заключается в том, что вышеуказанный код всегда возвращает "не удалось найти сертификат эмитента". Что я сделал не так? Я считаю, что создаю новый магазин, добавляя cacert, создавая новый контекст и добавляя дочерний cert для проверки в контекст с указателем на хранилище, которое содержит CA. Я, очевидно, делаю что-то неправильно, но я не уверен, что.
Любые идеи?
Обновление:. Я знаю, что могу сохранить эти сертификаты на диске и использовать что-то вроде X509_LOOKUP_file или что-то подобное. Я ищу решение, которое не трогает диск без необходимости.