/* * Copyright 2004 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
std::unique_ptr<SSLIdentity> OpenSSLIdentity::CreateFromPEMStrings(
absl::string_view private_key,
absl::string_view certificate) {
std::unique_ptr<OpenSSLCertificate> cert(
OpenSSLCertificate::FromPEMString(certificate)); if (!cert) {
RTC_LOG(LS_ERROR) << "Failed to create OpenSSLCertificate from PEM string."; return nullptr;
}
auto key_pair = OpenSSLKeyPair::FromPrivateKeyPEMString(private_key); if (!key_pair) {
RTC_LOG(LS_ERROR) << "Failed to create key pair from PEM string."; return nullptr;
}
return absl::WrapUnique( new OpenSSLIdentity(std::move(key_pair), std::move(cert)));
}
std::unique_ptr<SSLIdentity> OpenSSLIdentity::CreateFromPEMChainStrings(
absl::string_view private_key,
absl::string_view certificate_chain) {
BIO* bio = BIO_new_mem_buf(certificate_chain.data(),
rtc::dchecked_cast<int>(certificate_chain.size())); if (!bio) return nullptr;
BIO_set_mem_eof_return(bio, 0);
std::vector<std::unique_ptr<SSLCertificate>> certs; while (true) {
X509* x509 =
PEM_read_bio_X509(bio, nullptr, nullptr, const_cast<char*>("\0")); if (x509 == nullptr) {
uint32_t err = ERR_peek_error(); if (ERR_GET_LIB(err) == ERR_LIB_PEM &&
ERR_GET_REASON(err) == PEM_R_NO_START_LINE) {
err = ERR_get_error(); break;
}
RTC_LOG(LS_ERROR) << "Failed to parse certificate from PEM string: "
<< ERR_reason_error_string(err);
BIO_free(bio); return nullptr;
}
certs.emplace_back(new OpenSSLCertificate(x509));
X509_free(x509);
}
BIO_free(bio); if (certs.empty()) {
RTC_LOG(LS_ERROR) << "Found no certificates in PEM string."; return nullptr;
}
auto key_pair = OpenSSLKeyPair::FromPrivateKeyPEMString(private_key); if (!key_pair) {
RTC_LOG(LS_ERROR) << "Failed to create key pair from PEM string."; return nullptr;
}
std::unique_ptr<SSLIdentity> OpenSSLIdentity::CloneInternal() const { // We cannot use std::make_unique here because the referenced OpenSSLIdentity // constructor is private. return absl::WrapUnique( new OpenSSLIdentity(key_pair_->Clone(), cert_chain_->Clone()));
}
bool OpenSSLIdentity::ConfigureIdentity(SSL_CTX* ctx) { // 1 is the documented success return code. const OpenSSLCertificate* cert = &certificate(); if (SSL_CTX_use_certificate(ctx, cert->x509()) != 1 ||
SSL_CTX_use_PrivateKey(ctx, key_pair_->pkey()) != 1) {
openssl::LogSSLErrors("Configuring key and certificate"); returnfalse;
} // If a chain is available, use it. for (size_t i = 1; i < cert_chain_->GetSize(); ++i) {
cert = static_cast<const OpenSSLCertificate*>(&cert_chain_->Get(i)); if (SSL_CTX_add1_chain_cert(ctx, cert->x509()) != 1) {
openssl::LogSSLErrors("Configuring intermediate certificate"); returnfalse;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.