使用openssl库获取x509证书哈希

时间:2015-05-05 17:06:30

标签: c hash openssl x509 libcrypto

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

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

2 个答案:

答案 0 :(得分:4)

  

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

以下是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上),请参阅Generate Subject Hash of X509Certificate in Java。虽然它是Java,但它详细说明了OpenSSL对主题哈希的处理。

答案 1 :(得分:3)

您没有为字符串分配足够的内存,但我无法确定是否是导致问题的原因。

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

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

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