首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenSSL进行DSA签名

使用OpenSSL进行DSA签名
EN

Stack Overflow用户
提问于 2011-05-03 18:04:34
回答 2查看 2.1K关注 0票数 7

我正试着用OpenSSL的DSA签名。我有包含公钥和私钥的文件。

首先,我建立了一个单播连接,一切正常。在那之后,我需要一个多播UDP连接,并且我想要对数据包进行签名。我尝试使用函数PEM_read_DSA_PUBKEY()从证书加载我的公钥,但它不起作用。它总是返回NULL而不是DSA struct。

这里有一个简化版本的代码。我是这样编译的:

代码语言:javascript
复制
gcc -Wall -g -lm prueba.c -o prueba -lcrypto

有什么想法吗?谢谢!

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

发布于 2011-05-03 21:35:03

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

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

更新:

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-01-18 22:48:51

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

试着这样做吧:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5867939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档