我想将我的CA存储在我的二进制文件中的字符串中,而不是通过SSL_CTX_load_verify_locations加载它,这会接收文件路径和文件夹路径。
但是,我找不到一种方法可以让我接受一个字符串。
答案 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 = "";
}
}
}