7

我正在尝试使用来自 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;
}
4

2 回答 2

1

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

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

更新:

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

如果 cb 参数设置为 NULL 并且 u 参数不为 NULL,则 u 参数被解释为以空字符结尾的字符串以用作密码。如果 cb 和 u 都为 NULL,则使用默认回调例程,该例程通常会在关闭回显的情况下提示当前终端上的密码。

于 2011-05-03T13:35:02.857 回答
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
于 2012-01-18T14:48:50.653 回答