使用openssl库获取x509证书哈希

我目前正在开发一个应用程序,它使用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

但实际上我的输出是不同的。 有谁知道我做错了什么?

但实际上我的输出是不同的。 有谁知道我做错了什么?

以下是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_hashX509_subject_name_hash_old

如果您正在使用或比较OpenSSL 0.9.8(在Mac OS X 10上),请参阅在Java中生成X509Certificate的主题哈希值 。 虽然它是Java,但它详细介绍了OpenSSL对主题哈希的处理。

你没有为字符串分配足够的内存,虽然我不能确定这是你的问题的原因。

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

将为字符串分配4个字节,但它显然需要保持8个字节加一个终结符,所以我建议

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