2012-08-01 74 views
3

是否可以通過C/C++ API將簡單服務器應用程序的私鑰和公鑰嵌入到其中?最好不要先攻擊整個OpenSSL庫。在應用程序中嵌入SSL密鑰

而嵌入我的意思是通過傳遞類似字符串或char *的東西到API而不是直接從文件中讀取。

謝謝。

回答

3

可以使用d2i_X509()函數直接轉換DER編碼的證書從unsigned char *緩衝器到X509對象:

const unsigned char cert_DER[] = /* ... */; 

const unsigned char *p = cert_DER; 
X509 *cert_X509 = d2i_X509(NULL, &p, sizeof cert_DER); 

存在用於其他OpenSSL的對象類似d2i_*()功能,如鍵 - 例如。 d2i_RSAPrivateKey()

+0

我結束了使用這種方法和'objcopy' – Schoentoon 2012-08-29 15:39:58

0

是的。您使用BIO_new_mem_buf爲讀取例程創建輸入BIO,然後調用相應的PEM_read_bio_*函數來提取密鑰和證書。

BIO *in = BIO_new_mem_buf(pkey, pkey_len); 
EVP_PKEY *ep = PEM_read_bio_PrivateKey(in, ...); 

BIO *in = BIO_new_mem_buf(certs, cert_len); 
X509 *x = PEM_read_bio_X509_AUX(in, ...); 
3

一般來說(不限於openssl),當我發現需要編碼像一個文件到內存中,我不希望有open/readmmap它,我通常使用objcopy(提供我可以訪問給定項目的GNU binutils)。這非常有效。

例如:

objcopy --input binary --output elf32-i386 --binary-architecture i386 resource.img resource.o 

objcopy創建包含在resource.img數據對象代碼,並創建符號稱爲_binary_resource_img_start_binary_data_txt_end(和... length)。我可以對這些變量進行extern聲明並獲取它們的地址以便在內存中查找資源。瞧!

+0

這看起來很有希望,碰巧知道如何爲x86_64做到這一點?我自己嘗試時遇到了一些問題。 – Schoentoon 2012-08-01 09:01:01