【问题标题】:DSA Signing with OpenSSL使用 OpenSSL 进行 DSA 签名
【发布时间】:2011-08-17 14:21:37
【问题描述】:

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

【问题讨论】:

    标签: c load openssl key dsa


    【解决方案1】:

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

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

    更新:

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

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

    【讨论】:

    • 也可以将指向空终止字符串的指针作为第四个参数传递
    • @Hasturkun:真的,谢谢!更新提及。事实是我没有看到他的代码有任何问题(除了不必要的内存泄漏),所以我认为他的密钥受密码保护并且他没有正确提供密码。
    • 没有。为了更简单,我避免使用密码。
    【解决方案2】:

    您的 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
    

    【讨论】:

      猜你喜欢
      • 2013-11-27
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2012-08-28
      • 2011-10-24
      • 1970-01-01
      • 2017-05-16
      相关资源
      最近更新 更多