DSA使用OpenSSL签名

时间:2011-05-03 10:04:34

标签: c load openssl key dsa

我尝试使用OpenSSL中的DSA进行签名。我有包含公钥和私钥的文件。

首先,我建立了一个单播连接,一切都很好。之后,我需要一个多播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;
}

2 个答案:

答案 0 :(得分:1)

您使用的是受密码保护的公钥吗?

如果是,则需要将回调函数作为第三个参数传递给PEM_read_DSA_PUBKEY,因此如果提供的密码匹配,则可以正确加载密钥。

<强>更新

或者,正如Hasturkun所指出的,您可以传递一个以null结尾的字符串作为第四个参数。引用official documentation

  

如果cb参数设置为NULL   那么u参数不是NULL   u参数被解释为a   null终止要用作的字符串   密码。如果cb和u都为NULL   那么默认的回调例程就是   使用通常会提示   当前终端上的密码短语   回声关闭。

答案 1 :(得分: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