我正在使用来自C的OpenSSL生成自签名证书。我的代码主要基于demos / X509文件夹(在OpenSSL中)中的示例演示代码,并且工作正常。
我需要从我的C代码生成我的证书(和X509结构)的指纹以供稍后验证,但OpenSSL文档有点缺乏,我还没有设法解决如何执行此操作。我一直在寻找信息,我所发现的就是如何从命令行使用OpenSSL。
感谢您的任何建议!
答案 0 :(得分:5)
当你已经拥有X509结构时,可以在X509结构上使用X509_digest(...),如https://stackoverflow.com/a/9749567/2131459
中所述const EVP_MD *digest = EVP_get_digestbyname("sha1");
X509_digest(x, digest, buff, &n);
此外,X509结构甚至有一个名为sha1_hash的成员(如果openSSL已经使用SHA支持编译)。但是我不知道这个属性是否可以安全使用或者必须采取一些措施。
(很抱歉挖掘这个老话题,但这是谷歌在寻找openssl指纹时首次点击。)
答案 1 :(得分:2)
您可以使用openssl加密API生成哈希。请参阅http://www.openssl.org/docs/crypto/EVP_DigestInit.html处的openssl加密文档。以下是示例程序。使用您的PEM证书文本替换以下程序中的示例文本。
#include <stdio.h>
#include <openssl/evp.h>
main(int argc, char *argv[])
{
EVP_MD_CTX mdctx;
const EVP_MD *md;
char mess1[] = "Test Message\n";
char mess2[] = "Hello World\n";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;
OpenSSL_add_all_digests();
if(!argv[1]) {
printf("Usage: mdtest digestname\n");
exit(1);
}
md = EVP_get_digestbyname(argv[1]);
if(!md) {
printf("Unknown message digest %s\n", argv[1]);
exit(1);
}
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, md, NULL);
EVP_DigestUpdate(&mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(&mdctx, mess2, strlen(mess2));
EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
EVP_MD_CTX_cleanup(&mdctx);
printf("Digest is: ");
for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);
printf("\n");
}