我使用C中的OpenSSL生成自簽名證書。我的代碼主要基於demo/X509文件夾(在OpenSSL中)中的示例演示代碼,並且工作正常。在C中打開SSL證書指紋
我需要從我的C代碼中生成我的證書(和X509結構)的指紋以供日後驗證,但是OpenSSL文檔有點缺乏,我還沒有設法解決如何做到這一點。我搜索了各地的信息,所有我發現的是如何從命令行使用OpenSSL進行操作。
感謝您的任何建議!
我使用C中的OpenSSL生成自簽名證書。我的代碼主要基於demo/X509文件夾(在OpenSSL中)中的示例演示代碼,並且工作正常。在C中打開SSL證書指紋
我需要從我的C代碼中生成我的證書(和X509結構)的指紋以供日後驗證,但是OpenSSL文檔有點缺乏,我還沒有設法解決如何做到這一點。我搜索了各地的信息,所有我發現的是如何從命令行使用OpenSSL進行操作。
感謝您的任何建議!
您可以使用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");
}
當你已經有一個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的指紋時,它是在谷歌的第一擊。)
謝謝您的回答。請原諒我的無知,但我目前有一個X509結構,並且需要從命令行工具中獲取相同的指紋。我知道我可以用PEM_Write_X509獲得證書,但是這給了我格式化(------ BEGIN CERTIFICATE ----等)。是否有簡單的方法來獲取證書數據? – JamieH
是的。 PEM證書文本以「--- BEGIN CERTIFICATE--」短語開頭。這是標準的base64編碼格式。 PEM證書文本包含證書的所有信息,您應該使用此文本計算散列值。 – Drona
您也可以很好地使用其他二進制形式的證書。處理PEM格式有點簡單,但您可以根據自己的興趣選擇格式。 – Drona