2011-05-03 90 views
6

我嘗試使用來自OpenSSL的DSA進行簽名。我有包含公鑰和私鑰的文件。DSA使用OpenSSL簽名

首先我做一個單播連接,每件事情都很好。之後,我需要一個組播UDP連接,我想簽署數據包。我試圖使用功能PEM_read_DSA_PUBKEY()爲了從我的證書加載我的公鑰,但它不起作用。它總是返回NULL而不是DSA結構。

在這裏你有一個簡單的代碼版本。我這樣編譯:

gcc -Wall -g -lm prueba.c -o prueba -lcrypto 

有什麼想法嗎?謝謝!

#include <stdio.h> 
#include <openssl/dsa.h> 
#include <openssl/pem.h> 

int main() 
{ 
    FILE *DSA_cert_file = fopen("./certs/cert.pem", "r"); 
    if (DSA_cert_file == NULL) 
     return 1; 

    printf("Certificate read\n"); 

    DSA *dsa = DSA_new(); 
    if((dsa = PEM_read_DSA_PUBKEY(DSA_cert_file, 0, 0, 0)) == NULL) 
     return 1; 

    printf("DSA public key read\n"); 

    return 0; 
} 

回答

1

是否使用密碼保護的公鑰呢?

如果是,則需要將回調函數作爲第三個參數傳遞給PEM_read_DSA_PUBKEY,所以如果提供的密碼匹配,它將能夠正確加載密鑰。

更新:

另外,通過Hasturkun如指出,你可以傳遞一個空結束的字符串作爲第四個參數。引述official documentation

如果CB參數設置爲NULL 和u參數不爲NULL,則 作爲 空值終止字符串作爲密碼 使用u參數進行解釋。如果cb和u均爲NULL 則默認回調例程爲 ,使用該默認回調例程,通常會在當前終端 上提示輸入 關閉回顯。

+0

它也可以將指針傳遞到一個空結束的字符串作爲第四個參數 – Hasturkun 2011-05-03 13:40:19

+0

@Hasturkun:真的,謝謝!更新提到。事實是,我沒有看到他的代碼有任何問題(除了不必要的內存泄漏),所以我假設他的密鑰受密碼保護,並且他沒有正確提供密碼。 – jweyrich 2011-05-03 13:46:51

+0

不,我已經避免使用密碼,以使其更簡單。 – calamares 2011-05-03 13:54:24

1

您的cert.pem是否包含X.509證書?它看起來像PEM_read_DSA_PUBKEY需要沒有X.509容器的PEM編碼的DSA公鑰。

嘗試類似的東西來代替:

X509 *cert; 
EVP_PKEY *pk; 
DSA *dsa; 

cert = PEM_read_X509(DSA_cert_file,NULL,NULL,NULL); 
if (!cert) { /* error */ } 
pk = X509_get_pubkey(cert); 
if (!pk) { /* error */ } 
if (pk->type != 116) { /* not a dsa key */ } 
dsa = pk->pkey.dsa