/* */ #include "LibsslTLSContext.h" #include #include "LogFactory.h" #include "Logger.h" #include "fmt.h" #include "message.h" namespace aria2 { TLSContext* TLSContext::make(TLSSessionSide side) { return new OpenSSLTLSContext(side); } OpenSSLTLSContext::OpenSSLTLSContext(TLSSessionSide side) : sslCtx_(0), side_(side), verifyPeer_(true) { sslCtx_ = SSL_CTX_new(SSLv23_method()); if(sslCtx_) { good_ = true; } else { good_ = false; A2_LOG_ERROR(fmt("SSL_CTX_new() failed. Cause: %s", ERR_error_string(ERR_get_error(), 0))); } // Disable SSLv2 and enable all workarounds for buggy servers SSL_CTX_set_options(sslCtx_, SSL_OP_ALL | SSL_OP_NO_SSLv2 #ifdef SSL_OP_NO_COMPRESSION | SSL_OP_NO_COMPRESSION #endif // SSL_OP_NO_COMPRESSION ); SSL_CTX_set_mode(sslCtx_, SSL_MODE_AUTO_RETRY); SSL_CTX_set_mode(sslCtx_, SSL_MODE_ENABLE_PARTIAL_WRITE); #ifdef SSL_MODE_RELEASE_BUFFERS /* keep memory usage low */ SSL_CTX_set_mode(sslCtx_, SSL_MODE_RELEASE_BUFFERS); #endif } OpenSSLTLSContext::~OpenSSLTLSContext() { SSL_CTX_free(sslCtx_); } bool OpenSSLTLSContext::good() const { return good_; } bool OpenSSLTLSContext::addCredentialFile(const std::string& certfile, const std::string& keyfile) { if(SSL_CTX_use_PrivateKey_file(sslCtx_, keyfile.c_str(), SSL_FILETYPE_PEM) != 1) { A2_LOG_ERROR(fmt("Failed to load private key from %s. Cause: %s", keyfile.c_str(), ERR_error_string(ERR_get_error(), 0))); return false; } if(SSL_CTX_use_certificate_chain_file(sslCtx_, certfile.c_str()) != 1) { A2_LOG_ERROR(fmt("Failed to load certificate from %s. Cause: %s", certfile.c_str(), ERR_error_string(ERR_get_error(), 0))); return false; } A2_LOG_INFO(fmt("Credential files(cert=%s, key=%s) were successfully added.", certfile.c_str(), keyfile.c_str())); return true; } bool OpenSSLTLSContext::addSystemTrustedCACerts() { if(SSL_CTX_set_default_verify_paths(sslCtx_) != 1) { A2_LOG_INFO(fmt(MSG_LOADING_SYSTEM_TRUSTED_CA_CERTS_FAILED, ERR_error_string(ERR_get_error(), 0))); return false; } else { A2_LOG_INFO("System trusted CA certificates were successfully added."); return true; } } bool OpenSSLTLSContext::addTrustedCACertFile(const std::string& certfile) { if(SSL_CTX_load_verify_locations(sslCtx_, certfile.c_str(), 0) != 1) { A2_LOG_ERROR(fmt(MSG_LOADING_TRUSTED_CA_CERT_FAILED, certfile.c_str(), ERR_error_string(ERR_get_error(), 0))); return false; } else { A2_LOG_INFO("Trusted CA certificates were successfully added."); return true; } } } // namespace aria2