在C中打开SSL证书指纹

时间:2011-11-15 10:54:44

标签: certificate openssl signing fingerprint

我正在使用来自C的OpenSSL生成自签名证书。我的代码主要基于demos / X509文件夹(在OpenSSL中)中的示例演示代码,并且工作正常。

我需要从我的C代码生成我的证书(和X509结构)的指纹以供稍后验证,但OpenSSL文档有点缺乏,我还没有设法解决如何执行此操作。我一直在寻找信息,我所发现的就是如何从命令行使用OpenSSL。

感谢您的任何建议!

2 个答案:

答案 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");
}