我試圖從OpenSSL使用EVP_ * API,但在嘗試從EVP_PKEY結構中轉儲公鑰/私鑰時遇到了奇怪的奇怪行爲。調用OpenSSL的PEM_write_PUBKEY || PEM_write_PrivateKey API使程序突然退出並顯示消息「no OPENSSL_Applink」
問題 ::填充EVP_PKEY結構體後,調用PEM_write_PUBKEY
API(請參閱TRIAL1)後,程序將退出。在調用PEM_write_PrivateKey
API時也會發生同樣的情況(請參閱TRIAL2)。
輸出:我留下了一個temp.pem
0字節的文件,並說OPENSSL_Uplink(5D8C7000,08): no OPENSSL_Applink
#define TRIAL1
void InitOpenSSLLib(void)
{
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
}
int main(int argc, char** argv)
{
EVP_PKEY_CTX* ctx = NULL;
EVP_PKEY* pKeyPair = EVP_PKEY_new();
BIO *mem = BIO_new(BIO_s_mem());
FILE* fp = fopen("temp.pem", "wb");
InitOpenSSLLib();
ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, 0);
EVP_PKEY_keygen_init(ctx);
EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048);
EVP_PKEY_keygen(ctx, &pKeyPair);
// Succeeds till here... all of the above called APIs return value greater than 0
#ifdef TRIAL1
// Program exits even before printing any error
if (PEM_write_PUBKEY(fp, pKeyPair) <= 0)
printf("PEM_write_PUBKEY failed\n");
#elif TRIAL2
// same behavior with this API too
PEM_write_PrivateKey(fp, pKeyPair, NULL, NULL, 0, 0, NULL);
#endif
// Tried this too.... but the control never reaches here
fflush(fp);
// Tried this too... most of the mem struct members are NULL.
EVP_PKEY_print_private(mem, pKeyPair, 0, 0);
//.... Cleanup codes
fclose(fp);
BIO_free_all(mem);
return 0;
}
任何指針在命令提示符的消息?我在這裏做錯了什麼?有沒有其他方法可以將私鑰/公鑰或PEM格式轉換爲文件?
我使用VC++ 2015此外,在打擊按Ctrl + F5 ,提示顯示消息:: OPENSSL_Uplink(5D8C7000,08):無OPENSSL_Applink
回答我的問題了未來的開發者
那麼,結果究竟是什麼?一個帶有0字節的文件「temp.pem」? – Ctx
@Ctx:的確是.. – Abhineet
這有幫助嗎? https://www.openssl.org/docs/faq.html#PROG2 – Ctx