Получить хэш сертификата x509 с библиотекой openssl

В настоящее время я работаю над приложением, которое использует библиотеку openssl (libcrypto) для создания сертификатов. Теперь мне нужно получить хэш уже существующего сертификата.

Когда я использую свой терминал, я могу сгенерировать хеш-значение, используя

openssl x509 -hash -in cert.pem -noout

Выход: 01da0e2b

Это мой код, в котором я пытаюсь сгенерировать хеш-значение, используя библиотеку на C.

X509 *cert = NULL;
FILE *fp = fopen(currentCert.UTF8String, "r");
PEM_read_X509(fp, &cert, NULL, NULL);

long hash = X509_subject_name_hash(cert);
char *mdString = malloc(sizeof(long));
sprintf(mdString, "%lx",hash);
printf(mdString);

Выход: 1817886a

Но на самом деле мой результат другой. Кто-нибудь знает, что я делаю неправильно?


person Sn0wfreeze    schedule 05.05.2015    source источник
comment
просто используйте printf("0x%08lx",hash), не могу понять, в чем причина его сериализации в char *, что тоже неверно, потому что размер буфера должен зависеть от количества цифр   -  person cmidi    schedule 06.05.2015


Ответы (2)


Но на самом деле мой результат другой. Кто-нибудь знает, что я делаю неправильно?

Вот как это использует OpenSSL...

$ cd openssl-1.0.2-src
$ grep -R X509_subject_name_hash *
apps/x509.c:                BIO_printf(STDout, "%08lx\n", X509_subject_name_hash(x));
apps/x509.c:                BIO_printf(STDout, "%08lx\n", X509_subject_name_hash_old(x));
crypto/x509/x509.h:unsigned long X509_subject_name_hash(X509 *x);
crypto/x509/x509.h:unsigned long X509_subject_name_hash_old(X509 *x);
crypto/x509/x509_cmp.c:unsigned long X509_subject_name_hash(X509 *x)
crypto/x509/x509_cmp.c:unsigned long X509_subject_name_hash_old(X509 *x)
...

Затем, глядя на apps/x509.c:

...
} else if (subject_hash == i) {
    BIO_printf(STDout, "%08lx\n", X509_subject_name_hash(x));
}
...

И ваша декларация должна быть:

unsigned long hash = X509_subject_name_hash(cert);

Затем:

fprintf(stdout, "%08lx\n", hash);

Кроме того, OpenSSL изменил способ вычисления хэша субъекта где-то в OpenSSL 1.0.1. Вот почему есть X509_subject_name_hash и X509_subject_name_hash_old.

Если вы используете OpenSSL 0.9.8 или сравниваете его с OpenSSL 0.9.8 (например, в Mac OS X 10), см. раздел Создание хэша темы X509Certificate в Java. . Хотя это Java, в нем подробно описывается обработка OpenSSL хэша субъекта.

person jww    schedule 06.05.2015
comment
Да, это работает. На самом деле я обнаружил, что сервер использует старую библиотеку openssl. Поэтому мне пришлось использовать X509_subject_name_hash_old(cert); Спасибо за ваш ответ! - person Sn0wfreeze; 06.05.2015

Вы не выделяете достаточно памяти для строки, хотя я не уверен, что это является причиной вашей проблемы.

char *mdString = malloc(sizeof(long));

выделит 4 байта для строки, но явно должно содержать 8 байтов плюс терминатор, поэтому я предлагаю

char *mdString = malloc(sizeof(long)*2 + 1);
person Weather Vane    schedule 05.05.2015
comment
Я думаю, что вы правы, но на самом деле я получаю тот же результат. 1817886а - person Sn0wfreeze; 05.05.2015