2015-05-05 3 views
1

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

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

openssl x509 -hash -in cert.pem -noout 

Выход: 01da0e2b

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

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

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

+1

просто используйте 'printf (« 0x% 08lx », hash)', не может понять, в чем причина сериализации его в char *, что также неверно, поскольку размер буфера должен зависеть от количества цифр – cmidi

ответ

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 (скажем, Mac OS X 10), а затем просмотрите Generate Subject Hash of X509Certificate in Java. Хотя его Java, он детализирует обработку OpenSSL для хеша объекта.

+0

Да, это работает. Фактически я обнаружил, что сервер использовал старую библиотеку openssl. Поэтому мне пришлось использовать X509_subject_name_hash_old (cert); Спасибо за ваш ответ! – Sn0wfreeze

3

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

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

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

char *mdString = malloc(sizeof(long)*2 + 1); 
+0

Я думаю, что вы правы, но на самом деле я получаю тот же результат. "1817886a" – Sn0wfreeze

Смежные вопросы