从字符串而不是从文件加载SSL CA.

时间:2014-01-26 05:49:18

标签: ssl openssl

我想将我的CA存储在我的二进制文件中的字符串中,而不是通过SSL_CTX_load_verify_locations加载它,这会接收文件路径和文件夹路径。

但是,我找不到一种方法可以让我接受一个字符串。

2 个答案:

答案 0 :(得分:2)

我不知道有记录的方法可以做到这一点。我知道的唯一方法是推出自己的验证,例如使用X509_STORE_CTX_new创建商店,使用X509_STORE_CTX_trusted_stack添加可信CA,使用X509_STORE_CTX_set_cert添加证书添加一些其他链证书和具有类似功能的CRL,最后在X509_STORE_CTX上调用X509_verify_cert。

答案 1 :(得分:2)

好的,我想出了怎么做。 OpenSSL有许多方法来处理加载证书,其中许多方法将证书添加到不可信链。您必须结合使用SSL_CTX_get_cert_store和X509_STORE_add_cert。这两个函数接受X509指针,可以从原始c字符串创建。由于这两个函数的文档几乎不存在,所以我想我会在这里分享代码:

编辑:除了使用X509_STORE_add_cert之外,这基本上是Steffen Ulrich的方法。

#include <openssl/ssl.h>
#include <openssl/bio.h>
#include <openssl/x509.h>

void read_cert_into_ctx(istream &some_stream, SSL_CTX *ctx) {
    // Add a stream of PEM formatted certificate strings to the trusted store
    // of the ctx.
    string line;
    string buffer;
    while(getline(some_stream, line)) {
        buffer.append(line);
        buffer.append("\n");
        if(line == "-----END CERTIFICATE-----") {
            BIO *bio;
            X509 *certificate;
            bio = BIO_new(BIO_s_mem());
            BIO_puts(bio, buffer.c_str());
            certificate = PEM_read_bio_X509(bio, NULL, 0, NULL);
            if(certificate == NULL)
                throw std::runtime_error("could not add certificate to trusted\
                                          CAs");
            X509_STORE* store = SSL_CTX_get_cert_store(ctx);
            int result = X509_STORE_add_cert(store, certificate);
            BIO_free(bio);
            buffer = "";
        }
    }
}