Skip to content

Commit 6d946cd

Browse files
UgnineSirdisCopilot
andcommitted
EXT-1270 Add --mon-key option with the same meaning as the --ic-key/--grpc-key options (#30296)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> (cherry picked from commit 76b153b)
1 parent e76c800 commit 6d946cd

File tree

8 files changed

+64
-16
lines changed

8 files changed

+64
-16
lines changed

ydb/core/config/init/init_impl.h

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <util/system/hostname.h>
3434
#include <util/stream/file.h>
3535
#include <util/system/file.h>
36+
#include <util/folder/path.h>
3637
#include <util/generic/maybe.h>
3738
#include <util/generic/map.h>
3839
#include <util/generic/string.h>
@@ -295,6 +296,7 @@ struct TCommonAppOptions {
295296
ui32 MonitoringThreads = 10;
296297
ui32 MonitoringMaxRequestsPerSecond = 0;
297298
TString MonitoringCertificateFile;
299+
TString MonitoringPrivateKeyFile;
298300
TString RestartsCountFile = "";
299301
size_t CompileInflightLimit = 100000; // MiniKQLCompileService
300302
TString UDFsDir;
@@ -385,7 +387,8 @@ struct TCommonAppOptions {
385387
.RequiredArgument("NAME").StoreResult(&TenantName);
386388
opts.AddLongOption("mon-port", "Monitoring port").OptionalArgument("NUM").StoreResult(&MonitoringPort);
387389
opts.AddLongOption("mon-address", "Monitoring address").OptionalArgument("ADDR").StoreResult(&MonitoringAddress);
388-
opts.AddLongOption("mon-cert", "Monitoring certificate (https)").OptionalArgument("PATH").StoreResult(&MonitoringCertificateFile);
390+
opts.AddLongOption("mon-cert", "Path to monitoring certificate file (https)").OptionalArgument("PATH").StoreResult(&MonitoringCertificateFile);
391+
opts.AddLongOption("mon-key", "Path to monitoring private key file (https)").OptionalArgument("PATH").StoreResult(&MonitoringPrivateKeyFile);
389392
opts.AddLongOption("mon-threads", "Monitoring http server threads").RequiredArgument("NUM").StoreResult(&MonitoringThreads);
390393
opts.AddLongOption("suppress-version-check", "Suppress version compatibility checking via IC").NoArgument().SetFlag(&SuppressVersionCheck);
391394

@@ -558,13 +561,12 @@ struct TCommonAppOptions {
558561
ConfigUpdateTracer.AddUpdate(NKikimrConsole::TConfigItem::MonitoringConfigItem, TConfigItemInfo::EUpdateKind::UpdateExplicitly);
559562
}
560563
if (MonitoringCertificateFile) {
561-
TString sslCertificate = TUnbufferedFileInput(MonitoringCertificateFile).ReadAll();
562-
if (!sslCertificate.empty()) {
563-
appConfig.MutableMonitoringConfig()->SetMonitoringCertificate(sslCertificate);
564-
ConfigUpdateTracer.AddUpdate(NKikimrConsole::TConfigItem::MonitoringConfigItem, TConfigItemInfo::EUpdateKind::UpdateExplicitly);
565-
} else {
566-
ythrow yexception() << "invalid ssl certificate file";
567-
}
564+
appConfig.MutableMonitoringConfig()->SetMonitoringCertificateFile(MonitoringCertificateFile);
565+
ConfigUpdateTracer.AddUpdate(NKikimrConsole::TConfigItem::MonitoringConfigItem, TConfigItemInfo::EUpdateKind::UpdateExplicitly);
566+
}
567+
if (MonitoringPrivateKeyFile) {
568+
appConfig.MutableMonitoringConfig()->SetMonitoringPrivateKeyFile(MonitoringPrivateKeyFile);
569+
ConfigUpdateTracer.AddUpdate(NKikimrConsole::TConfigItem::MonitoringConfigItem, TConfigItemInfo::EUpdateKind::UpdateExplicitly);
568570
}
569571
if (SqsHttpPort) {
570572
appConfig.MutableSqsConfig()->MutableHttpServerConfig()->SetPort(SqsHttpPort);
@@ -1148,6 +1150,7 @@ class TInitialConfiguratorImpl
11481150
Option(nullptr, TCfg::TTracingConfigFieldTag{});
11491151
Option(nullptr, TCfg::TFailureInjectionConfigFieldTag{});
11501152

1153+
ValidateCertPaths();
11511154
CommonAppOptions.ApplyFields(AppConfig, Env, ConfigUpdateTracer);
11521155

11531156
// MessageBus options.
@@ -1411,6 +1414,28 @@ class TInitialConfiguratorImpl
14111414
debugInfo.OldDynConfig.CopyFrom(InitDebug.OldConfig);
14121415
debugInfo.NewDynConfig.CopyFrom(InitDebug.YamlConfig);
14131416
}
1417+
1418+
void ValidateCertPaths() const {
1419+
auto ensureFileExists = [](const TString& path, TStringBuf optName) {
1420+
if (path.empty()) {
1421+
return;
1422+
}
1423+
TFsPath fspath(path);
1424+
TFileStat filestat;
1425+
if (!fspath.Stat(filestat) || !filestat.IsFile()) {
1426+
ythrow yexception() << "File passed to --" << optName << " does not exist: " << path;
1427+
}
1428+
};
1429+
1430+
ensureFileExists(CommonAppOptions.PathToInterconnectCertFile, "cert/ic-cert");
1431+
ensureFileExists(CommonAppOptions.PathToInterconnectPrivateKeyFile, "key/ic-key");
1432+
ensureFileExists(CommonAppOptions.PathToInterconnectCaFile, "ca/ic-ca");
1433+
ensureFileExists(CommonAppOptions.GrpcSslSettings.PathToGrpcCertFile, "grpc-cert");
1434+
ensureFileExists(CommonAppOptions.GrpcSslSettings.PathToGrpcPrivateKeyFile, "grpc-key");
1435+
ensureFileExists(CommonAppOptions.GrpcSslSettings.PathToGrpcCaFile, "grpc-ca");
1436+
ensureFileExists(CommonAppOptions.MonitoringCertificateFile, "mon-cert");
1437+
ensureFileExists(CommonAppOptions.MonitoringPrivateKeyFile, "mon-key");
1438+
}
14141439
};
14151440

14161441
std::unique_ptr<IInitialConfigurator> MakeDefaultInitialConfigurator(

ydb/core/driver_lib/run/config_parser.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <util/stream/file.h>
1313
#include <util/stream/format.h>
1414
#include <util/system/hostname.h>
15+
#include <util/folder/path.h>
1516
#include <util/string/printf.h>
1617

1718
#include <library/cpp/string_utils/parse_size/parse_size.h>
@@ -265,7 +266,8 @@ void TRunCommandConfigParser::ParseRunOpts(int argc, char **argv) {
265266
opts.AddLongOption("proxy", "Bind to proxy(-ies)").RequiredArgument("ADDR").AppendTo(&RunOpts.ProxyBindToProxy);
266267
opts.AddLongOption("mon-port", "Monitoring port").OptionalArgument("NUM").StoreResult(&RunOpts.MonitoringPort);
267268
opts.AddLongOption("mon-address", "Monitoring address").OptionalArgument("ADDR").StoreResult(&RunOpts.MonitoringAddress);
268-
opts.AddLongOption("mon-cert", "Monitoring certificate (https)").OptionalArgument("PATH").StoreResult(&RunOpts.MonitoringCertificateFile);
269+
opts.AddLongOption("mon-cert", "Path to monitoring certificate file (https)").OptionalArgument("PATH").StoreResult(&RunOpts.MonitoringCertificateFile);
270+
opts.AddLongOption("mon-key", "Path to monitoring private key file (https)").OptionalArgument("PATH").StoreResult(&RunOpts.MonitoringPrivateKeyFile);
269271
opts.AddLongOption("mon-threads", "Monitoring http server threads").RequiredArgument("NUM").StoreResult(&RunOpts.MonitoringThreads);
270272

271273
SetupLastGetOptForConfigFiles(opts);
@@ -304,6 +306,20 @@ void TRunCommandConfigParser::ParseRunOpts(int argc, char **argv) {
304306
}
305307

306308
void TRunCommandConfigParser::ApplyParsedOptions() {
309+
auto ensureFileExists = [](const TString& path, TStringBuf optName) {
310+
if (path.empty()) {
311+
return;
312+
}
313+
TFsPath fspath(path);
314+
TFileStat filestat;
315+
if (!fspath.Stat(filestat) || !filestat.IsFile()) {
316+
ythrow yexception() << "File passed to --" << optName << " does not exist: " << path;
317+
}
318+
};
319+
320+
ensureFileExists(RunOpts.MonitoringCertificateFile, "mon-cert");
321+
ensureFileExists(RunOpts.MonitoringPrivateKeyFile, "mon-key");
322+
307323
// apply global options
308324
Config.AppConfig.MutableInterconnectConfig()->SetStartTcp(GlobalOpts.StartTcp);
309325
auto logConfig = Config.AppConfig.MutableLogConfig();
@@ -371,7 +387,8 @@ void TRunCommandConfigParser::ApplyParsedOptions() {
371387
Config.AppConfig.MutableMonitoringConfig()->SetMonitoringThreads(RunOpts.MonitoringThreads);
372388
Config.AppConfig.MutableMonitoringConfig()->SetMaxRequestsPerSecond(RunOpts.MonitoringMaxRequestsPerSecond);
373389
Config.AppConfig.MutableMonitoringConfig()->SetInactivityTimeout(ToString(RunOpts.MonitoringInactivityTimeout.Seconds()));
374-
Config.AppConfig.MutableMonitoringConfig()->SetMonitoringCertificate(TUnbufferedFileInput(RunOpts.MonitoringCertificateFile).ReadAll());
390+
Config.AppConfig.MutableMonitoringConfig()->SetMonitoringCertificateFile(RunOpts.MonitoringCertificateFile);
391+
Config.AppConfig.MutableMonitoringConfig()->SetMonitoringPrivateKeyFile(RunOpts.MonitoringPrivateKeyFile);
375392
Config.AppConfig.MutableRestartsCountConfig()->SetRestartsCountFile(RunOpts.RestartsCountFile);
376393
}
377394

ydb/core/driver_lib/run/config_parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class TRunCommandConfigParser {
4949
ui32 MonitoringPort;
5050
TString MonitoringAddress;
5151
TString MonitoringCertificateFile;
52+
TString MonitoringPrivateKeyFile;
5253
ui32 MonitoringThreads;
5354
ui32 MonitoringMaxRequestsPerSecond;
5455
TDuration MonitoringInactivityTimeout;

ydb/core/driver_lib/run/run.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -461,9 +461,8 @@ void TKikimrRunner::InitializeMonitoring(const TKikimrRunConfig& runConfig, bool
461461
monConfig.Certificate = appConfig.GetMonitoringConfig().GetMonitoringCertificate();
462462
monConfig.MaxRequestsPerSecond = appConfig.GetMonitoringConfig().GetMaxRequestsPerSecond();
463463
monConfig.InactivityTimeout = TDuration::Parse(appConfig.GetMonitoringConfig().GetInactivityTimeout());
464-
if (appConfig.GetMonitoringConfig().HasMonitoringCertificateFile()) {
465-
monConfig.Certificate = TUnbufferedFileInput(appConfig.GetMonitoringConfig().GetMonitoringCertificateFile()).ReadAll();
466-
}
464+
monConfig.CertificateFile = appConfig.GetMonitoringConfig().GetMonitoringCertificateFile();
465+
monConfig.PrivateKeyFile = appConfig.GetMonitoringConfig().GetMonitoringPrivateKeyFile();
467466
monConfig.RedirectMainPageTo = appConfig.GetMonitoringConfig().GetRedirectMainPageTo();
468467
if (includeHostName) {
469468
if (appConfig.HasNameserviceConfig() && appConfig.GetNameserviceConfig().NodeSize() > 0) {

ydb/core/mon/mon.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1439,7 +1439,9 @@ std::future<void> TMon::Start(TActorSystem* actorSystem) {
14391439
"application/yaml",
14401440
};
14411441
addPort->SslCertificatePem = Config.Certificate;
1442-
addPort->Secure = !Config.Certificate.empty();
1442+
addPort->CertificateFile = Config.CertificateFile;
1443+
addPort->PrivateKeyFile = Config.PrivateKeyFile;
1444+
addPort->Secure = !Config.Certificate.empty() || !Config.CertificateFile.empty();
14431445
addPort->MaxRequestsPerSecond = Config.MaxRequestsPerSecond;
14441446

14451447
std::promise<void> promise;

ydb/core/mon/mon.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ class TMon {
3737
TRequestAuthorizer Authorizer = DefaultAuthorizer;
3838
TVector<TString> AllowedSIDs;
3939
TString RedirectMainPageTo;
40-
TString Certificate;
40+
TString Certificate; // certificate/private key data in PEM format
41+
TString CertificateFile; // certificate file path in PEM format (OpenSSL feature: may optionally contain both certificate chain and private key in the same PEM file if PrivateKeyFile is not set)
42+
TString PrivateKeyFile; // private key file path for the certificate in PEM format
4143
ui32 MaxRequestsPerSecond = 0;
4244
TDuration InactivityTimeout = TDuration::Minutes(2);
4345
TString AllowOrigin;

ydb/core/protos/config.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ message TMonitoringConfig {
582582
optional string RedirectMainPageTo = 13 [default = "monitoring/"];
583583
optional string MonitoringCertificate = 14 [(Ydb.sensitive) = true];
584584
optional string MonitoringCertificateFile = 15;
585+
optional string MonitoringPrivateKeyFile = 20;
585586
optional string MemAllocDumpPathPrefix = 16;
586587
optional uint32 MaxRequestsPerSecond = 17 [default = 0];
587588
optional string InactivityTimeout = 18 [default = "2m"];

ydb/library/actors/http/http_proxy_ssl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ struct TSslHelpers {
6161
// TODO(xenoxeno): more diagnostics?
6262
return nullptr;
6363
}
64-
res = SSL_CTX_use_PrivateKey_file(ctx.Get(), key.c_str(), SSL_FILETYPE_PEM);
64+
// Load key. The key can be set through explicit key field or with the same file with certificate
65+
res = SSL_CTX_use_PrivateKey_file(ctx.Get(), key.empty() ? certificate.c_str() : key.c_str(), SSL_FILETYPE_PEM);
6566
if (res < 0) {
6667
// TODO(xenoxeno): more diagnostics?
6768
return nullptr;

0 commit comments

Comments
 (0)