使用 OpenSSL 进行 DSA 签名

发布于 2024-11-04 21:53:11 字数 746 浏览 1 评论 0原文

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

I'm tryng to sign using DSA from OpenSSL. I have the files containing public and private keys.

First of all I make an unicast connection and every thing is fine. After that I need a multicast UDP connection and I want to sign the packets. I'm trying to use function PEM_read_DSA_PUBKEY() in order to load my public key from my cert but it doesn't work. It returns always NULL instead of a DSA struct.

Here you have a simplistic version of the code. I compile like this:

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

Any idea? Thank you!

#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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

暗恋未遂 2024-11-11 21:53:11

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

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

更新:

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

如果cb参数设置为NULL
并且 u 参数不为 NULL
u 参数被解释为
以 null 结尾的字符串用作
密码。如果 cb 和 u 都为 NULL
那么默认的回调例程是
使用这通常会提示
当前终端上的密码
关闭回显。

Are you using a password-protected public key?

If yes, you are required to pass a callback function as the third argument to PEM_read_DSA_PUBKEY, so if the provided password matches, it will be able to properly load your key.

Update:

Alternatively, as pointed by Hasturkun, you can pass a null-terminated string as the fourth argument. Quoting the official documentation:

If the cb parameters is set to NULL
and the u parameter is not NULL then
the u parameter is interpreted as a
null terminated string to use as the
passphrase. If both cb and u are NULL
then the default callback routine is
used which will typically prompt for
the passphrase on the current terminal
with echoing turned off.

唐婉 2024-11-11 21:53:11

您的 cert.pem 是否包含 X.509 证书?看起来 PEM_read_DSA_PUBKEY 需要 PEM 编码的 DSA 公钥,而无需 X.509 容器。

尝试类似的方法:

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

Does your cert.pem contains a X.509 certificate ? It looks like PEM_read_DSA_PUBKEY expects a PEM-encoded DSA public key without the X.509 container.

Try something like that instead:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文