Открыть сертификат SSL-отпечатка в C - PullRequest
3 голосов
/ 15 ноября 2011

Я создаю самозаверяющий сертификат с использованием OpenSSL из C. Мой код в значительной степени основан на примере демонстрационного кода в папке demos / X509 (в OpenSSL) и работает нормально.

Мне нужно сгенерироватьОтпечаток моего сертификата (и структуры X509) из моего кода C для последующей проверки, но документации OpenSSL несколько не хватает, и мне не удалось решить, как это сделать.Я искал информацию, и все, что я когда-либо нашел, это как сделать это, используя OpenSSL из командной строки.

Спасибо за любой совет!

Ответы [ 2 ]

5 голосов
/ 08 января 2016

Если у вас уже есть структура X509, можно просто использовать X509_digest (...) в структуре X509, как описано в https://stackoverflow.com/a/9749567/2131459

const EVP_MD *digest = EVP_get_digestbyname("sha1");
X509_digest(x, digest, buff, &n);

Кроме того, структура X509 дажеимеет член с именем sha1_hash (если openSSL был скомпилирован с поддержкой SHA).Однако я не знаю, можно ли использовать это свойство безопасно или нужно предпринять какие-то действия.

(Извините, что выкопал эту старую тему, но это был первый удар в Google при поиске отпечатка openssl.)

2 голосов
/ 15 ноября 2011

Вы можете использовать крипто API Openssl для генерации хеша. Обратитесь к крипто-документации openssl по адресу http://www.openssl.org/docs/crypto/EVP_DigestInit.html. Ниже приведен пример программы. Замените образец текста в следующей программе на текст вашего сертификата PEM.

#include <stdio.h>
#include <openssl/evp.h>

main(int argc, char *argv[])
{
    EVP_MD_CTX mdctx;
    const EVP_MD *md;
    char mess1[] = "Test Message\n";
    char mess2[] = "Hello World\n";
    unsigned char md_value[EVP_MAX_MD_SIZE];
    int md_len, i;

    OpenSSL_add_all_digests();

    if(!argv[1]) {
       printf("Usage: mdtest digestname\n");
       exit(1);
    }

    md = EVP_get_digestbyname(argv[1]);

    if(!md) {
       printf("Unknown message digest %s\n", argv[1]);
       exit(1);
    }

    EVP_MD_CTX_init(&mdctx);
    EVP_DigestInit_ex(&mdctx, md, NULL);
    EVP_DigestUpdate(&mdctx, mess1, strlen(mess1));
    EVP_DigestUpdate(&mdctx, mess2, strlen(mess2));
    EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
    EVP_MD_CTX_cleanup(&mdctx);

    printf("Digest is: ");
    for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);
    printf("\n");
}
...