【问题标题】:Open SSL certificate fingerprint in C在 C 中打开 SSL 证书指纹
【发布时间】:2011-11-15 10:54:44
【问题描述】:

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

我需要从我的 C 代码中生成我的证书(和 X509 结构)的指纹以供以后验证,但 OpenSSL 文档有些缺乏,我还没有设法弄清楚如何做到这一点。我四处搜索信息,我所找到的只是如何在命令行中使用 OpenSSL。

感谢您的建议!

【问题讨论】:

    标签: certificate openssl signing fingerprint


    【解决方案1】:

    当您已经有一个 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 指纹时的第一个热门话题。)

    【讨论】:

    • 赞成.. 和 /headdesk。我不敢相信我刚刚实现了一大堆代码来完成这个非常简单的事情。不过,我使用了BIO_f_md()i2d_X509_bio,它们比这里发布的EVP_MD_CTX 方法更简单。
    • 您可能需要在调用EVP_get_digestbyname之前使用OpenSSL_add_all_digests()加载所有摘要
    • 可以直接调用EVP_sha1()EVP_sha256()获取EVP_MD *digest对象。
    【解决方案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");
    }
    

    【讨论】:

    • 感谢您的回答。请原谅我的无知,但我目前有一个 X509 结构,需要从与命令行工具相同的结构中获取指纹。我知道我可以使用 PEM_Write_X509 获得证书,但这给了我格式(-----BEGIN CERTIFICATE---- 等)。有没有一种简单的方法来获取证书数据。
    • 是的。 PEM 证书文本以“---BEGIN CERTIFICATE--”短语开头。这是标准的 base64 编码格式。 PEM 证书文本包含证书的所有信息,您应该使用此文本来计算哈希。
    • 您也可以很好地使用其他二进制形式的证书。处理 PEM 格式稍微简单一些,但您可以根据自己的兴趣选择格式。
    猜你喜欢
    • 2011-09-19
    • 2012-07-12
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多