使用OpenSSL进行DSA签名

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;
}
2个回答

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

1

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

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

更新:

或者,如Hasturkun所指出的那样,您可以将空终止字符串作为第四个参数传递。引用官方文档

如果cb参数设置为NULL,并且u参数不为NULL,则u参数将被解释为用作口令的空终止字符串。如果cb和u都为NULL,则使用默认回调例程,该例程通常会在当前终端上关闭回显并提示输入口令。


第四个参数也可以传递指向以空字符结尾的字符串的指针。 - Hasturkun
@Hasturkun:没错,谢谢!已更新以提及此事。实际上,我并没有看到他的代码有任何问题(除了一个不必要的内存泄漏),所以我认为他的密钥受到密码保护,而他没有正确地提供密码。 - jweyrich
不,我避免使用密码以使它更简单。 - calamares

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接