【问题标题】:Embed SSL keys inside application在应用程序中嵌入 SSL 密钥
【发布时间】:2012-08-01 00:06:29
【问题描述】:

是否可以通过 C/C++ API 将简单服务器应用程序的私钥和公钥嵌入其中?最好不要先破解整个 OpenSSL 库。

嵌入是指将字符串或 char* 之类的东西传递给 API,而不是直接从文件中读取。

谢谢。

【问题讨论】:

    标签: c++ c openssl


    【解决方案1】:

    您可以使用 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().

    【讨论】:

    • 我最终使用了这种方法和'objcopy'的组合
    【解决方案2】:

    一般来说(不限于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 声明并获取它们的地址,以便在内存中找到资源。瞧!

    【讨论】:

    • 这看起来很有希望,碰巧知道如何为 x86_64 做到这一点?我自己尝试时遇到了一些问题。
    【解决方案3】:

    是的。您使用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, ...);
    

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      相关资源
      最近更新 更多