在d2i_rsprivvatekey_fp()中崩溃
Crash in d2i_RSAPrivateKey_fp()
我有一个小的VC++
代码来加载ASN.1 .der
文件并读取其private
密钥。它编译和运行得很好,但是在函数d2i_RSAPrivateKey_fp
时崩溃了。
工具使用:
- Visual Studio 2008 [V90]
- OpenSSL 1.0.2d 2015年7月9日
我还测试了证书以检查它是否已损坏
测试证书:
C:OpenSSL-Win32bin>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-Win32bin>
下面是该项目的代码。
Thing I have try :
- Win32OpenSSL-0_9_8zg(但同样的问题),OpenSSL 1.0.1
- 尝试链接到MD, MDd, MT
- 设置生成/MAP,/MAPINFO:EXPORTS,/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-Win32bin>openssl rsa -in private.der -inform DER -out privatepem.pem -outform PEM
writing RSA key
现在,我有。pem文件,其中有Base64格式的私钥,我会将其转换为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%sn", "Error Reading public key");
}
else
{
printf("n%sn", "Private key Imported");
}
return 0;
}
但是在.pem
文件上操作的新代码在复制到PEM_read_RSAPrivateKey
的RSA结构时崩溃了。
为什么我崩溃了?是否有一些我错过了做,可能是某种类型的初始化或一些错误的关键?
请参阅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);
也可以参见OpenSSL用户邮件列表中的d2i_rsprivvatekey_fp中的Seg fault。
至于按指示使用API后的崩溃,那么听起来你有其他问题。由于OpenSSL是跨平台的,它的"一次编写,到处运行"。将基于openssl的TLS逻辑移植到Linux上,并在其上安装一个内存检查器,如Valgrind。
问题已通过替换OpenSSL二进制文件解决。
代码在没有任何更改的情况下工作。项目有来自未知来源的OpenSSL的预构建依赖。
所以仅仅通过替换"https://slproweb.com/products/Win32OpenSSL.html"中的依赖项,它就像一个魅力一样工作。
:)由于人
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 在构造函数[C ]中的FP分配上崩溃