DSA Подписание с OpenSSL - PullRequest
7 голосов
/ 03 мая 2011

Я пытаюсь подписать, используя DSA из OpenSSL.У меня есть файлы, содержащие открытый и закрытый ключи.

Прежде всего, я устанавливаю одноадресное соединение, и все в порядке.После этого мне нужно многоадресное 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 голос
/ 18 января 2012

Содержит ли ваш cert.pem сертификат X.509? Похоже, что PEM_read_DSA_PUBKEY ожидает открытый ключ DSA в кодировке PEM без контейнера 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
1 голос
/ 03 мая 2011

Вы используете открытый ключ, защищенный паролем?

Если да, вы должны передать функцию обратного вызова в качестве третьего аргумента PEM_read_DSA_PUBKEY, поэтому, если указанный пароль совпадает, он сможет правильно загрузить ваш ключ.

Обновление:

В качестве альтернативы, как указано Hasturkun , вы можете передать строку с нулевым символом в конце в качестве четвертого аргумента. Цитирование официальной документации :

Если для параметров cb установлено значение NULL и тогда параметр u не равен NULL параметр u интерпретируется как строка с нулевым символом в конце для использования в качестве ключевая фраза. Если оба cb и u равны NULL тогда процедура обратного вызова по умолчанию используется, который обычно запрашивает кодовая фраза на текущем терминале с отключенным эхом.

...