Получить хэш сертификата 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);
Выход: 1817886а
Но на самом деле мой вывод другой. Кто-нибудь знает, что я делаю не так?
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), см. " Создание хеша объекта X509Certificate в Java". Хотя это Java, он детализирует OpenSSL-обработку предметного хэша.
Вы не выделяете достаточно памяти для строки, хотя я не могу быть уверен, что это является причиной вашей проблемы.
char *mdString = malloc(sizeof(long));
выделит 4 байта для строки, но она явно должна содержать 8 байтов плюс терминатор, поэтому я предлагаю
char *mdString = malloc(sizeof(long)*2 + 1);