Сбой в d2i_RSAPrivateKey_fp ()

1

У меня есть небольшой VC++ код для загрузки файла ASN.1 .der и чтения его private ключа. Он компилируется и работает нормально, но он падает с функцией d2i_RSAPrivateKey_fp.

Используемые инструменты:

  • Visual Studio 2008 [V90]
  • OpenSSL 1.0.2d 9 июля 2015 г.

Я также проверил сертификат, чтобы проверить, не поврежден ли он

Сертификат тестирования:

C:\OpenSSL-Win32\bin>openssl rsa -in  private.der -check -inform DER
RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC/4V4jxRYeFBDh8XBNq2EMs3hXWW5IIN51lM/Oyz0U/Bw8HF0m
/VBJU3SCy2FzoYPa2o3HHYWDMnjmOlXb9aXR3hyLHnvgvE/0YkMXlxh58H1srjw4
FL7cLXe+lwFbZYtxRaHyn/3U3NIkZkCzR74oxHwyWJ1/zz+TzpmNx8AfyQIDAQAB
AoGAMn+9puxXxdLCHrTMOaTBBfa11UdUHueHpKplhqc2jC9NvwQ3/+rrFmFAaKve
GfCIIzEh3yWF3eGKsAzqS9l6qiyAT+LaCPcn7FbAsaMdVGPc4G290/3maASjQMj6
YfNTcmvPaqfq2+B+aNunS0pi6XGv3917KdGo4hTa2xFXwAECQQDfm5Rh0CjDwhjh
urghbvBgGVRJiAFowgp9xdJj8Hm/U+zXK9Tz2SwVcbEKbcqSVZqB8Keb11TEfF3W
JGIHGdOJAkEA260wKNAdWxgEXiSCEx/tSV3bcRQg4ypTqODc0cWtM295/lhV2Hgx
3zWQ5NiBYZsU104DLWlxnqulJKyBECmaQQJAFAjskpcEEAYkFJWWSeiWwQWD99Kn
zasVJY/D+hBh2DK81cqnmfGrcYBuTHDp5ZKl9V6Kpfv1LGW4Qqef4OL/gQJAb1Mp
IMW22r8lF4Bw2rhHS/LgjkGhGP4OP3sU7Mm8qGBJ9ndVqcnfnDpNH2wIxSoOOb4z
JgRVrA9YNWmmTkaHAQJBANiY3RDyEouYoNKN0oWXsZ/N6BwSFOYAAknmdY5uRwu2
tUQHFiW7u2wZCFmIZVqSBZc5XBdZcmffZeEiO1nVYH4=
-----END RSA PRIVATE KEY-----

C:\OpenSSL-Win32\bin>

Ниже приведен код проекта.

Я попробовал:

  • Win32OpenSSL-0_9_8zg (но такая же проблема), OpenSSL 1.0.1
  • Пробовал связывать libeay с MD, MDd, MT
  • Установите флаги для создания /MAP,/MAPINFO: ЭКСПОРТ,/ASSEMBLYDEBUG
  • экспортируется в VS2010 проект и скомпилирован с openssl32 для VS2010
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <stdio.h>

int main()
{
    int ret;
    RSA *pkey=NULL;//RSA_new();
    RSA *rsa =NULL;//RSA_new();

    unsigned char text[2048/8] = "this is a test string";
    unsigned char  encrypted[4098]={};
    unsigned char decrypted[4098]={};

    OpenSSL_add_all_algorithms();   
    OpenSSL_add_all_ciphers();  
    OpenSSL_add_all_digests();  
    ERR_load_ERR_strings();

    FILE *fp;
    fp = fopen("C:/Users/Public/private.der","rb");

    if (fp != NULL) 
    {
        rsa = d2i_RSAPrivateKey_fp(fp, &pkey);   // <<< CRASH
    }
    else
    {
        //return "Error::Unable to read private key file";
    }

    if (rsa)
    {
        // RSA is good
        ret = RSA_private_encrypt(RSA_size(pkey), text, encrypted, pkey, RSA_NO_PADDING);
        if (ret == -1)
        {
            fclose(fp);
            //return "Error::Failed to encrypt the data";
        }
    }
    else
    {
        fclose(fp);
        //return "Error::Failed to get *RSA Handle1";
    }
    fclose(fp);
}

Вторая попытка

Я столкнулся с проблемой импорта частного ключа из файла ASN.1 .der файл .pem.

C:\OpenSSL-Win32\bin>openssl rsa -in private.der -inform DER -out privatepem.pem -outform PEM 

writing RSA key

Теперь у меня есть.PEM файл, который имеет закрытый ключ в Base64 Form, который я преобразую в RSA * rsa; состав.

int main()
{
    int ret;
    RSA *pkey=NULL;//RSA_new();
    RSA *rsa =NULL;//RSA_new();

    FILE *fp;
    fp = fopen("C:/Users/Public/privatepem.pem","r");

    if(PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL) == NULL)  // <<<CRASH
    {
        printf("\n%s\n", "Error Reading public key");
    }
    else
    {
        printf("\n%s\n", "Private key Imported");
    }

    return 0;
}

Но новый код, работающий с файлами .pem имеет сбой при копировании в структуру RSA в PEM_read_RSAPrivateKey.

Почему я получаю крах? Есть ли что-то, чего мне не хватает, может быть какая-то инициализация или что-то не так с ключом?

  • 0
    Вы можете прочитать эту почтовую ветку , особенно эту конкретную почту .
  • 0
    Я только что попробовал комбинацию, поскольку Стив объяснил поведение OPENSSL_malloc в почте, но оно все еще имеет ту же точку сбоя.
Теги:
visual-c++
openssl
visual-studio-2008

2 ответа

0
Лучший ответ

Проблема была решена путем замены двоичных файлов OpenSSL.

Код работал без каких-либо изменений. В проекте были предустановленные зависимости OpenSSL, которые были из неизвестного источника.

Таким образом, просто заменив зависимости от " https://slproweb.com/products/Win32OpenSSL.html ", он работал как шарм.

:) Спасибо, парни

1

См. Предупреждения на d2i_X509. Этот код попытается освободить (или повторно использовать части) объект pkey:

if (fp != NULL) 
    rsa = d2i_RSAPrivateKey_fp(fp, &pkey);   /* CRASH */

OpenSSL точно не известен для проверки параметров, прежде чем предпринимать действия по ним :)

Вместо этого используйте:

if (fp != NULL) 
    rsa = d2i_RSAPrivateKey_fp(fp, NULL);

Или:

RSA* pkey = RSA_new();
...

if (fp != NULL) 
    rsa = d2i_RSAPrivateKey_fp(fp, &pkey);

Также см. Seg fault из d2i_RSAPrivateKey_fp в списке рассылки OpenSSL Users.


Что касается сбоя после использования API по назначению, то это звучит так, как будто у вас есть другие проблемы. Так как OpenSSL является cross-platofrm, его "пишите один раз, бегите везде". Портируйте логику TLS на основе OpenSSL для Linux и получите на ней проверку памяти, такую как Valgrind.

  • 0
    Меньше ожидалось, что ошибка будет в репозитории OpenSSL. Ваше решение очень точное, оно очень помогло бы найти основную причину пару дней назад.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню