7

OpenSSL から DSA を使用して署名しようとしています。公開鍵と秘密鍵を含むファイルがあります。

まず、ユニキャスト接続を行い、すべて問題ありません。その後、マルチキャスト UDP 接続が必要になり、パケットに署名したいと考えています。証明書から公開鍵をロードするために関数を使用しようとしていますが、機能PEM_read_DSA_PUBKEY()しません。NULLDSA 構造体の代わりに常に戻ります。

ここにコードの単純化されたバージョンがあります。私は次のようにコンパイルします:

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

cert.pem に X.509 証明書が含まれていますか? PEM_read_DSA_PUBKEYX.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 に答える
1

パスワードで保護された公開鍵を使用していますか?

はいの場合、コールバック関数を の 3 番目の引数として渡す必要があるPEM_read_DSA_PUBKEYため、提供されたパスワードが一致すれば、キーを適切にロードできます。

アップデート:

または、 Hasturkunで指摘されているように、null で終わる文字列を 4 番目の引数として渡すことができます。公式ドキュメントの引用:

cb パラメータが NULL に設定されていて、u パラメータが NULL でない場合、u パラメータはパスフレーズとして使用するヌル終了文字列として解釈されます。cb と u の両方が NULL の場合、デフォルトのコールバック ルーチンが使用されます。これは通常、エコーがオフになっている現在の端末でパスフレーズを要求します。

于 2011-05-03T13:35:02.857 に答える