2011-11-15 95 views
2

我使用C中的OpenSSL生成自簽名證書。我的代碼主要基於demo/X509文件夾(在OpenSSL中)中的示例演示代碼,並且工作正常。在C中打開SSL證書指紋

我需要從我的C代碼中生成我的證書(和X509結構)的指紋以供日後驗證,但是OpenSSL文檔有點缺乏,我還沒有設法解決如何做到這一點。我搜索了各地的信息,所有我發現的是如何從命令行使用OpenSSL進行操作。

感謝您的任何建議!

回答

2

您可以使用openssl crypto 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"); 
} 
+0

謝謝您的回答。請原諒我的無知,但我目前有一個X509結構,並且需要從命令行工具中獲取相同的指紋。我知道我可以用PEM_Write_X509獲得證書,但是這給了我格式化(------ BEGIN CERTIFICATE ----等)。是否有簡單的方法來獲取證書數據? – JamieH

+0

是的。 PEM證書文本以「--- BEGIN CERTIFICATE--」短語開頭。這是標準的base64編碼格式。 PEM證書文本包含證書的所有信息,您應該使用此文本計算散列值。 – Drona

+0

您也可以很好地使用其他二進制形式的證書。處理PEM格式有點簡單,但您可以根據自己的興趣選擇格式。 – Drona

3

當你已經有一個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的指紋時,它是在谷歌的第一擊。)

+0

Upvoted ..和/ headdesk。我不相信我只是實現了一大堆代碼來完成這個非常簡單的事情。儘管我使用了'BIO_f_md()'和'i2d_X509_bio',這比在這裏發佈的'EVP_MD_CTX'方法更簡單。 – davenpcj

+0

您可能需要在調用'EVP_get_digestbyname'之前使用'OpenSSL_add_all_digests()'加載所有摘要 – bikram990