Skip to content

Commit 19844ee

Browse files
committed
LOG-8968: Enhance TLS config of OpenSSL to allow setting curves
1 parent 2db0167 commit 19844ee

File tree

5 files changed

+29
-10
lines changed

5 files changed

+29
-10
lines changed

lib/vector-core/src/tls/incoming.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ use crate::tcp::{self, TcpKeepaliveConfig};
2929
impl TlsSettings {
3030
pub fn acceptor(&self) -> crate::tls::Result<SslAcceptor> {
3131
if self.identity.is_some() {
32-
let mut acceptor = if self.min_tls_version.is_some() || self.ciphersuites.is_some() {
33-
SslAcceptor::custom(SslMethod::tls(), &self.min_tls_version, &self.ciphersuites)
32+
let mut acceptor = if self.min_tls_version.is_some() || self.ciphersuites.is_some() || self.curves.is_some() {
33+
SslAcceptor::custom(SslMethod::tls(), &self.min_tls_version, &self.ciphersuites, &self.curves)
3434
.map_err(|error_ex| match error_ex {
3535
ErrorEx::OpenSslError { error_stack: e } => {
3636
TlsError::CreateAcceptor { source: e }

lib/vector-core/src/tls/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ pub fn tls_connector_builder(settings: &MaybeTlsSettings) -> Result<SslConnector
185185
if let Some(settings) = settings.tls() {
186186
settings.apply_context(&mut builder)?;
187187
builder
188-
.set_min_tls_version_and_ciphersuites(&settings.min_tls_version, &settings.ciphersuites)
188+
.set_min_tls_version_and_ciphersuites(&settings.min_tls_version, &settings.ciphersuites, &settings.curves)
189189
.map_err(|error_ex| match error_ex {
190190
ErrorEx::OpenSslError { error_stack: e } => TlsError::SslBuildError { source: e },
191191
ErrorEx::InvalidTlsVersion => TlsError::InvalidTlsVersion,

lib/vector-core/src/tls/settings.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,13 @@ pub struct TlsConfig {
163163

164164
/// TLS ciphersuites to enable.
165165
pub ciphersuites: Option<String>,
166+
167+
/// Elliptic curve groups to enable.
168+
///
169+
/// Comma-separated list of supported elliptic curve groups (e.g., "P-256", "P-384", "P-521").
170+
/// Only available with OpenSSL 1.1.1+, BoringSSL, or LibreSSL 2.5.1+.
171+
#[configurable(metadata(docs::examples = "P-256,P-384"))]
172+
pub curves: Option<String>,
166173
}
167174

168175
impl TlsConfig {
@@ -187,6 +194,7 @@ pub struct TlsSettings {
187194
server_name: Option<String>,
188195
pub min_tls_version: Option<String>,
189196
pub ciphersuites: Option<String>,
197+
pub curves: Option<String>,
190198
}
191199

192200
#[derive(Clone)]
@@ -224,6 +232,7 @@ impl TlsSettings {
224232
server_name: options.server_name.clone(),
225233
min_tls_version: options.min_tls_version.clone(),
226234
ciphersuites: options.ciphersuites.clone(),
235+
curves: options.curves.clone(),
227236
})
228237
}
229238

@@ -889,7 +898,7 @@ mod test {
889898
},
890899
];
891900
for t in tests {
892-
match builder.set_min_tls_version_and_ciphersuites(&t.text, &None) {
901+
match builder.set_min_tls_version_and_ciphersuites(&t.text, &None, &None) {
893902
Ok(()) => {
894903
assert!(t.want.is_ok());
895904
assert_eq!(builder.min_proto_version(), t.num);
@@ -930,7 +939,7 @@ mod test {
930939
},
931940
];
932941
for t in tests {
933-
match builder.set_min_tls_version_and_ciphersuites(&t.min_tls_version, &t.ciphersuite) {
942+
match builder.set_min_tls_version_and_ciphersuites(&t.min_tls_version, &t.ciphersuite, &None) {
934943
Ok(()) => assert!(t.want.is_ok()),
935944
Err(e) => assert_eq!(t.want.err().unwrap(), e),
936945
}

patch/openssl/src/ssl/connector.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,14 +320,17 @@ impl SslAcceptor {
320320
Ok(SslAcceptorBuilder(ctx))
321321
}
322322

323-
/// Creates a new builder configured with a minimum supported TLS version and a set of ciphersuites
323+
/// Creates a new builder configured with a minimum supported TLS version, ciphersuites, and curves
324324
///
325-
pub fn custom(method: SslMethod, min_tls_version: &Option<String>, ciphersuites: &Option<String>) -> Result<SslAcceptorBuilder, ErrorEx> {
325+
pub fn custom(method: SslMethod, min_tls_version: &Option<String>, ciphersuites: &Option<String>, curves: &Option<String>) -> Result<SslAcceptorBuilder, ErrorEx> {
326326
let mut ctx = ctx(method).map_err(|e| ErrorEx::OpenSslError { error_stack: e })?;
327327
let dh = Dh::params_from_pem(FFDHE_2048.as_bytes()).map_err(|e| ErrorEx::OpenSslError { error_stack: e })?;
328328
ctx.set_tmp_dh(&dh).map_err(|e| ErrorEx::OpenSslError { error_stack: e })?;
329-
setup_curves(&mut ctx).map_err(|e| ErrorEx::OpenSslError { error_stack: e })?;
330-
ctx.set_min_tls_version_and_ciphersuites(min_tls_version, ciphersuites)?;
329+
// Only setup default curves if no custom curves are specified
330+
if curves.is_none() {
331+
setup_curves(&mut ctx).map_err(|e| ErrorEx::OpenSslError { error_stack: e })?;
332+
}
333+
ctx.set_min_tls_version_and_ciphersuites(min_tls_version, ciphersuites, curves)?;
331334
Ok(SslAcceptorBuilder(ctx))
332335
}
333336

patch/openssl/src/ssl/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1788,7 +1788,7 @@ impl SslContextBuilder {
17881788

17891789
/// Sets the context's minimal TLS version, specified as "VersionTLS1[0..3]", and a comma-separated list of ciphersuites.
17901790
///
1791-
pub fn set_min_tls_version_and_ciphersuites(&mut self, min_tls_version: &Option<String>, ciphersuites: &Option<String>) -> Result<(), ErrorEx>{
1791+
pub fn set_min_tls_version_and_ciphersuites(&mut self, min_tls_version: &Option<String>, ciphersuites: &Option<String>, curves: &Option<String>) -> Result<(), ErrorEx>{
17921792
let mut min_proto_version = SslVersion::TLS1;
17931793
if let Some(min_tls_version) = min_tls_version {
17941794
min_proto_version = match min_tls_version.as_str() {
@@ -1812,6 +1812,13 @@ impl SslContextBuilder {
18121812
return Err(ErrorEx::InvalidCiphersuite);
18131813
}
18141814
}
1815+
#[cfg(any(ossl111, boringssl, libressl251, awslc))]
1816+
if let Some(curves) = curves {
1817+
if !curves.is_empty() {
1818+
let curves = &curves.replace(",", ":");
1819+
self.set_groups_list(&curves).map_err(|e| ErrorEx::OpenSslError { error_stack: e })?;
1820+
}
1821+
}
18151822
Ok(())
18161823
}
18171824
}

0 commit comments

Comments
 (0)