diff --git a/rippled-example.cfg b/rippled-example.cfg index f744233b2..dff63f24a 100644 --- a/rippled-example.cfg +++ b/rippled-example.cfg @@ -194,6 +194,12 @@ # If you need a certificate chain, specify the path to the certificate chain # here. The chain may include the end certificate. # +# [ssl_verify_file] +# [ssl_verify_dir] +# Specify the path to a file or directory containing the root certificates +# that the server will accept for verifying HTTP servers. Used only for +# outbound HTTPS client connections. +# # [validation_seed]: # To perform validation, this section should contain either a validation seed # or key. The validation seed is used to generate the validation diff --git a/src/cpp/ripple/Config.cpp b/src/cpp/ripple/Config.cpp index 3d1c9f3ac..6f9772f84 100644 --- a/src/cpp/ripple/Config.cpp +++ b/src/cpp/ripple/Config.cpp @@ -46,6 +46,8 @@ #define SECTION_RPC_PASSWORD "rpc_password" #define SECTION_RPC_STARTUP "rpc_startup" #define SECTION_SNTP "sntp_servers" +#define SECTION_SSL_VERIFY_FILE "ssl_verify_file" +#define SECTION_SSL_VERIFY_DIR "ssl_verify_dir" #define SECTION_VALIDATORS_FILE "validators_file" #define SECTION_VALIDATION_QUORUM "validation_quorum" #define SECTION_VALIDATION_SEED "validation_seed" @@ -155,10 +157,22 @@ void Config::setup(const std::string& strConf, bool bTestNet, bool bQuiet) } } - SSL_CONTEXT.set_default_verify_paths(ec); - if (ec) - throw std::runtime_error(boost::str(boost::format("Failed to set_default_verify_paths: %s") % ec.message())); + if (SSL_VERIFY_FILE.empty()) + { + SSL_CONTEXT.set_default_verify_paths(ec); + if (ec && SSL_VERIFY_DIR.empty()) + throw std::runtime_error(boost::str(boost::format("Failed to set_default_verify_paths: %s") % ec.message())); + } + else + SSL_CONTEXT.load_verify_file(SSL_VERIFY_FILE); + + if (!SSL_VERIFY_DIR.empty()) + { + SSL_CONTEXT.add_verify_path(SSL_VERIFY_DIR, ec); + if (ec) + throw std::runtime_error(boost::str(boost::format("Failed to add verify path: %s") % ec.message())); + } // Update default values load(); @@ -381,6 +395,9 @@ void Config::load() sectionSingleB(secConfig, SECTION_WEBSOCKET_SSL_CHAIN, WEBSOCKET_SSL_CHAIN); sectionSingleB(secConfig, SECTION_WEBSOCKET_SSL_KEY, WEBSOCKET_SSL_KEY); + sectionSingleB(secConfig, SECTION_SSL_VERIFY_FILE, SSL_VERIFY_FILE); + sectionSingleB(secConfig, SECTION_SSL_VERIFY_DIR, SSL_VERIFY_DIR); + if (sectionSingleB(secConfig, SECTION_VALIDATION_SEED, strTemp)) { VALIDATION_SEED.setSeedGeneric(strTemp); @@ -473,6 +490,8 @@ int Config::getSize(SizedItemName item) { siNodeCacheAge, { 30, 60, 90, 300, 600 } }, { siLedgerSize, { 32, 64, 128, 1024, 0 } }, { siLedgerAge, { 30, 60, 120, 300, 600 } }, + { siLineCacheSize, { 8192, 32768, 131072, 1048576, 0 } }, + { siLineCacheAge, { 500, 600, 1800, 3600, 7200 } } }; for (int i = 0; i < (sizeof(sizeTable) / sizeof(SizedItem)); ++i) diff --git a/src/cpp/ripple/Config.h b/src/cpp/ripple/Config.h index bff35fcc2..96e9eebe9 100644 --- a/src/cpp/ripple/Config.h +++ b/src/cpp/ripple/Config.h @@ -63,6 +63,8 @@ enum SizedItemName siLedgerSize, siLedgerAge, siLedgerFetch, + siLineCacheSize, + siLineCacheAge }; struct SizedItem @@ -176,6 +178,8 @@ public: uint32 SIGN_PROPOSAL; boost::asio::ssl::context SSL_CONTEXT; // Generic SSL context. + std::string SSL_VERIFY_FILE; + std::string SSL_VERIFY_DIR; Config();