Skip to content

Commit 77147c2

Browse files
authored
Add separate SPIFFE integeration test build target. (#15324)
Signed-off-by: Takeshi Yoneda <takeshi@tetrate.io>
1 parent f10ead4 commit 77147c2

File tree

6 files changed

+214
-103
lines changed

6 files changed

+214
-103
lines changed

test/extensions/transport_sockets/tls/cert_validator/spiffe/BUILD

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
load(
22
"//bazel:envoy_build_system.bzl",
3-
"envoy_cc_test",
43
"envoy_package",
54
)
5+
load(
6+
"//test/extensions:extensions_build_system.bzl",
7+
"envoy_extension_cc_test",
8+
)
69

710
licenses(["notice"]) # Apache 2
811

912
envoy_package()
1013

11-
envoy_cc_test(
14+
envoy_extension_cc_test(
1215
name = "spiffe_validator_test",
1316
srcs = [
1417
"spiffe_validator_test.cc",
1518
],
1619
data = [
1720
"//test/extensions/transport_sockets/tls/test_data:certs",
1821
],
22+
extension_name = "envoy.tls.cert_validator.spiffe",
1923
deps = [
2024
"//source/extensions/transport_sockets/tls/cert_validator/spiffe:config",
2125
"//test/extensions/transport_sockets/tls:ssl_test_utils",
@@ -26,3 +30,20 @@ envoy_cc_test(
2630
"//test/test_common:utility_lib",
2731
],
2832
)
33+
34+
envoy_extension_cc_test(
35+
name = "spiffe_validator_integration_test",
36+
srcs = [
37+
"spiffe_validator_integration_test.cc",
38+
"spiffe_validator_integration_test.h",
39+
],
40+
data = [
41+
"//test/config/integration/certs",
42+
"//test/extensions/transport_sockets/tls/test_data:certs",
43+
],
44+
extension_name = "envoy.tls.cert_validator.spiffe",
45+
deps = [
46+
"//source/extensions/transport_sockets/tls/cert_validator/spiffe:config",
47+
"//test/integration:http_integration_lib",
48+
],
49+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
#include "spiffe_validator_integration_test.h"
2+
3+
#include <memory>
4+
5+
#include "extensions/transport_sockets/tls/context_manager_impl.h"
6+
7+
#include "test/integration/integration.h"
8+
9+
#include "gtest/gtest.h"
10+
11+
namespace Envoy {
12+
namespace Ssl {
13+
14+
void SslSPIFFECertValidatorIntegrationTest::initialize() {
15+
config_helper_.addSslConfig(
16+
ConfigHelper::ServerSslOptions().setRsaCert(true).setTlsV13(true).setCustomValidatorConfig(
17+
custom_validator_config_));
18+
HttpIntegrationTest::initialize();
19+
20+
context_manager_ =
21+
std::make_unique<Extensions::TransportSockets::Tls::ContextManagerImpl>(timeSystem());
22+
registerTestServerPorts({"http"});
23+
}
24+
25+
void SslSPIFFECertValidatorIntegrationTest::TearDown() {
26+
HttpIntegrationTest::cleanupUpstreamAndDownstream();
27+
codec_client_.reset();
28+
context_manager_.reset();
29+
}
30+
31+
Network::ClientConnectionPtr SslSPIFFECertValidatorIntegrationTest::makeSslClientConnection(
32+
const ClientSslTransportOptions& options) {
33+
ClientSslTransportOptions modified_options{options};
34+
modified_options.setTlsVersion(tls_version_);
35+
36+
Network::Address::InstanceConstSharedPtr address = getSslAddress(version_, lookupPort("http"));
37+
auto client_transport_socket_factory_ptr =
38+
createClientSslTransportSocketFactory(modified_options, *context_manager_, *api_);
39+
return dispatcher_->createClientConnection(
40+
address, Network::Address::InstanceConstSharedPtr(),
41+
client_transport_socket_factory_ptr->createTransportSocket({}), nullptr);
42+
}
43+
44+
void SslSPIFFECertValidatorIntegrationTest::checkVerifyErrorCouter(uint64_t value) {
45+
Stats::CounterSharedPtr counter =
46+
test_server_->counter(listenerStatPrefix("ssl.fail_verify_error"));
47+
EXPECT_EQ(value, counter->value());
48+
counter->reset();
49+
}
50+
51+
INSTANTIATE_TEST_SUITE_P(
52+
IpVersionsClientVersions, SslSPIFFECertValidatorIntegrationTest,
53+
testing::Combine(
54+
testing::ValuesIn(TestEnvironment::getIpVersionsForTest()),
55+
testing::Values(envoy::extensions::transport_sockets::tls::v3::TlsParameters::TLSv1_2,
56+
envoy::extensions::transport_sockets::tls::v3::TlsParameters::TLSv1_3)),
57+
SslSPIFFECertValidatorIntegrationTest::ipClientVersionTestParamsToString);
58+
59+
// clientcert.pem's san is "spiffe://lyft.com/frontend-team" so it should be accepted.
60+
TEST_P(SslSPIFFECertValidatorIntegrationTest, ServerRsaSPIFFEValidatorAccepted) {
61+
auto typed_conf = new envoy::config::core::v3::TypedExtensionConfig();
62+
TestUtility::loadFromYaml(TestEnvironment::substitute(R"EOF(
63+
name: envoy.tls.cert_validator.spiffe
64+
typed_config:
65+
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.SPIFFECertValidatorConfig
66+
trust_domains:
67+
- name: lyft.com
68+
trust_bundle:
69+
filename: "{{ test_rundir }}/test/config/integration/certs/cacert.pem"
70+
)EOF"),
71+
*typed_conf);
72+
73+
custom_validator_config_ = typed_conf;
74+
ConnectionCreationFunction creator = [&]() -> Network::ClientConnectionPtr {
75+
return makeSslClientConnection({});
76+
};
77+
testRouterRequestAndResponseWithBody(1024, 512, false, false, &creator);
78+
checkVerifyErrorCouter(0);
79+
}
80+
81+
// clientcert.pem's san is "spiffe://lyft.com/frontend-team" so it should be rejected.
82+
TEST_P(SslSPIFFECertValidatorIntegrationTest, ServerRsaSPIFFEValidatorRejected1) {
83+
auto typed_conf = new envoy::config::core::v3::TypedExtensionConfig();
84+
TestUtility::loadFromYaml(TestEnvironment::substitute(R"EOF(
85+
name: envoy.tls.cert_validator.spiffe
86+
typed_config:
87+
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.SPIFFECertValidatorConfig
88+
trust_domains:
89+
- name: example.com
90+
trust_bundle:
91+
filename: "{{ test_rundir }}/test/config/integration/certs/cacert.pem"
92+
)EOF"),
93+
*typed_conf);
94+
custom_validator_config_ = typed_conf;
95+
initialize();
96+
auto conn = makeSslClientConnection({});
97+
if (tls_version_ == envoy::extensions::transport_sockets::tls::v3::TlsParameters::TLSv1_2) {
98+
auto codec = makeRawHttpConnection(std::move(conn), absl::nullopt);
99+
EXPECT_FALSE(codec->connected());
100+
} else {
101+
auto codec = makeHttpConnection(std::move(conn));
102+
ASSERT_TRUE(codec->waitForDisconnect());
103+
codec->close();
104+
}
105+
checkVerifyErrorCouter(1);
106+
}
107+
108+
// clientcert.pem's san is "spiffe://lyft.com/frontend-team" but the corresponding trust bundle does
109+
// not match with the client cert. So this should also be rejected.
110+
TEST_P(SslSPIFFECertValidatorIntegrationTest, ServerRsaSPIFFEValidatorRejected2) {
111+
auto typed_conf = new envoy::config::core::v3::TypedExtensionConfig();
112+
TestUtility::loadFromYaml(TestEnvironment::substitute(R"EOF(
113+
name: envoy.tls.cert_validator.spiffe
114+
typed_config:
115+
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.SPIFFECertValidatorConfig
116+
trust_domains:
117+
- name: lyft.com
118+
trust_bundle:
119+
filename: "{{ test_rundir }}/test/extensions/transport_sockets/tls/test_data/fake_ca_cert.pem"
120+
- name: example.com
121+
trust_bundle:
122+
filename: "{{ test_rundir }}/test/config/integration/certs/cacert.pem"
123+
)EOF"),
124+
*typed_conf);
125+
custom_validator_config_ = typed_conf;
126+
initialize();
127+
auto conn = makeSslClientConnection({});
128+
if (tls_version_ == envoy::extensions::transport_sockets::tls::v3::TlsParameters::TLSv1_2) {
129+
auto codec = makeRawHttpConnection(std::move(conn), absl::nullopt);
130+
EXPECT_FALSE(codec->connected());
131+
} else {
132+
auto codec = makeHttpConnection(std::move(conn));
133+
ASSERT_TRUE(codec->waitForDisconnect());
134+
codec->close();
135+
}
136+
checkVerifyErrorCouter(1);
137+
}
138+
139+
} // namespace Ssl
140+
} // namespace Envoy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#pragma once
2+
3+
#include <string>
4+
5+
#include "test/integration/http_integration.h"
6+
#include "test/integration/server.h"
7+
#include "test/integration/ssl_utility.h"
8+
9+
#include "gtest/gtest.h"
10+
11+
namespace Envoy {
12+
namespace Ssl {
13+
14+
class SslSPIFFECertValidatorIntegrationTest
15+
: public testing::TestWithParam<
16+
std::tuple<Network::Address::IpVersion,
17+
envoy::extensions::transport_sockets::tls::v3::TlsParameters::TlsProtocol>>,
18+
public HttpIntegrationTest {
19+
public:
20+
SslSPIFFECertValidatorIntegrationTest()
21+
: HttpIntegrationTest(Http::CodecClient::Type::HTTP1, std::get<0>(GetParam())) {}
22+
23+
void initialize() override;
24+
void TearDown() override;
25+
26+
virtual Network::ClientConnectionPtr
27+
makeSslClientConnection(const ClientSslTransportOptions& options);
28+
void checkVerifyErrorCouter(uint64_t value);
29+
30+
static std::string ipClientVersionTestParamsToString(
31+
const ::testing::TestParamInfo<
32+
std::tuple<Network::Address::IpVersion,
33+
envoy::extensions::transport_sockets::tls::v3::TlsParameters::TlsProtocol>>&
34+
params) {
35+
return fmt::format("{}_TLSv1_{}",
36+
std::get<0>(params.param) == Network::Address::IpVersion::v4 ? "IPv4"
37+
: "IPv6",
38+
std::get<1>(params.param) - 1);
39+
}
40+
41+
protected:
42+
envoy::config::core::v3::TypedExtensionConfig* custom_validator_config_{nullptr};
43+
std::unique_ptr<ContextManager> context_manager_;
44+
const envoy::extensions::transport_sockets::tls::v3::TlsParameters::TlsProtocol tls_version_{
45+
std::get<1>(GetParam())};
46+
};
47+
48+
} // namespace Ssl
49+
} // namespace Envoy

test/extensions/transport_sockets/tls/integration/BUILD

-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ envoy_cc_test(
1616
],
1717
data = [
1818
"//test/config/integration/certs",
19-
"//test/extensions/transport_sockets/tls/test_data:certs",
2019
],
2120
deps = [
2221
"//source/common/event:dispatcher_includes",
@@ -27,7 +26,6 @@ envoy_cc_test(
2726
"//source/extensions/transport_sockets/tls:context_config_lib",
2827
"//source/extensions/transport_sockets/tls:context_lib",
2928
"//source/extensions/transport_sockets/tls:ssl_handshaker_lib",
30-
"//source/extensions/transport_sockets/tls/cert_validator/spiffe:config",
3129
"//test/extensions/common/tap:common",
3230
"//test/integration:http_integration_lib",
3331
"//test/mocks/secret:secret_mocks",

test/extensions/transport_sockets/tls/integration/ssl_integration_test.cc

+2-98
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ void SslIntegrationTestBase::initialize() {
4242
.setEcdsaCertOcspStaple(server_ecdsa_cert_ocsp_staple_)
4343
.setOcspStapleRequired(ocsp_staple_required_)
4444
.setTlsV13(server_tlsv1_3_)
45-
.setExpectClientEcdsaCert(client_ecdsa_cert_)
46-
.setCustomValidatorConfig(custom_validator_config_));
45+
.setExpectClientEcdsaCert(client_ecdsa_cert_));
46+
4747
HttpIntegrationTest::initialize();
4848

4949
context_manager_ =
@@ -354,102 +354,6 @@ TEST_P(SslCertficateIntegrationTest, ServerRsa) {
354354
checkStats();
355355
}
356356

357-
// Server configured on SPIFFE certificate validation for mTLS
358-
// clientcert.pem's san is "spiffe://lyft.com/frontend-team" so it should be accepted.
359-
TEST_P(SslCertficateIntegrationTest, ServerRsaSPIFFEValidatorAccepted) {
360-
auto typed_conf = new envoy::config::core::v3::TypedExtensionConfig();
361-
TestUtility::loadFromYaml(TestEnvironment::substitute(R"EOF(
362-
name: envoy.tls.cert_validator.spiffe
363-
typed_config:
364-
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.SPIFFECertValidatorConfig
365-
trust_domains:
366-
- name: lyft.com
367-
trust_bundle:
368-
filename: "{{ test_rundir }}/test/config/integration/certs/cacert.pem"
369-
)EOF"),
370-
*typed_conf);
371-
372-
custom_validator_config_ = typed_conf;
373-
server_rsa_cert_ = true;
374-
ConnectionCreationFunction creator = [&]() -> Network::ClientConnectionPtr {
375-
return makeSslClientConnection({});
376-
};
377-
testRouterRequestAndResponseWithBody(1024, 512, false, false, &creator);
378-
checkStats();
379-
Stats::CounterSharedPtr counter =
380-
test_server_->counter(listenerStatPrefix("ssl.fail_verify_error"));
381-
EXPECT_EQ(0, counter->value());
382-
counter->reset();
383-
}
384-
385-
// Server configured on SPIFFE certificate validation for mTLS
386-
// clientcert.pem's san is "spiffe://lyft.com/frontend-team" so it should be rejected.
387-
TEST_P(SslCertficateIntegrationTest, ServerRsaSPIFFEValidatorRejected1) {
388-
auto typed_conf = new envoy::config::core::v3::TypedExtensionConfig();
389-
TestUtility::loadFromYaml(TestEnvironment::substitute(R"EOF(
390-
name: envoy.tls.cert_validator.spiffe
391-
typed_config:
392-
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.SPIFFECertValidatorConfig
393-
trust_domains:
394-
- name: example.com
395-
trust_bundle:
396-
filename: "{{ test_rundir }}/test/config/integration/certs/cacert.pem"
397-
)EOF"),
398-
*typed_conf);
399-
custom_validator_config_ = typed_conf;
400-
server_rsa_cert_ = true;
401-
initialize();
402-
auto conn = makeSslClientConnection({});
403-
if (tls_version_ == envoy::extensions::transport_sockets::tls::v3::TlsParameters::TLSv1_2) {
404-
auto codec = makeRawHttpConnection(std::move(conn), absl::nullopt);
405-
EXPECT_FALSE(codec->connected());
406-
} else {
407-
auto codec = makeHttpConnection(std::move(conn));
408-
ASSERT_TRUE(codec->waitForDisconnect());
409-
codec->close();
410-
}
411-
Stats::CounterSharedPtr counter =
412-
test_server_->counter(listenerStatPrefix("ssl.fail_verify_error"));
413-
EXPECT_EQ(1, counter->value());
414-
counter->reset();
415-
}
416-
417-
// Server configured on SPIFFE certificate validation for mTLS
418-
// clientcert.pem's san is "spiffe://lyft.com/frontend-team" but the corresponding trust bundle does
419-
// not match with the client cert. So this should also be rejected.
420-
TEST_P(SslCertficateIntegrationTest, ServerRsaSPIFFEValidatorRejected2) {
421-
auto typed_conf = new envoy::config::core::v3::TypedExtensionConfig();
422-
TestUtility::loadFromYaml(TestEnvironment::substitute(R"EOF(
423-
name: envoy.tls.cert_validator.spiffe
424-
typed_config:
425-
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.SPIFFECertValidatorConfig
426-
trust_domains:
427-
- name: lyft.com
428-
trust_bundle:
429-
filename: "{{ test_rundir }}/test/extensions/transport_sockets/tls/test_data/fake_ca_cert.pem"
430-
- name: example.com
431-
trust_bundle:
432-
filename: "{{ test_rundir }}/test/config/integration/certs/cacert.pem"
433-
)EOF"),
434-
*typed_conf);
435-
custom_validator_config_ = typed_conf;
436-
server_rsa_cert_ = true;
437-
initialize();
438-
auto conn = makeSslClientConnection({});
439-
if (tls_version_ == envoy::extensions::transport_sockets::tls::v3::TlsParameters::TLSv1_2) {
440-
auto codec = makeRawHttpConnection(std::move(conn), absl::nullopt);
441-
EXPECT_FALSE(codec->connected());
442-
} else {
443-
auto codec = makeHttpConnection(std::move(conn));
444-
ASSERT_TRUE(codec->waitForDisconnect());
445-
codec->close();
446-
}
447-
Stats::CounterSharedPtr counter =
448-
test_server_->counter(listenerStatPrefix("ssl.fail_verify_error"));
449-
EXPECT_EQ(1, counter->value());
450-
counter->reset();
451-
}
452-
453357
// Server with an ECDSA certificate and a client with RSA/ECDSA cipher suites works.
454358
TEST_P(SslCertficateIntegrationTest, ServerEcdsa) {
455359
server_rsa_cert_ = false;

test/extensions/transport_sockets/tls/integration/ssl_integration_test.h

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ class SslIntegrationTestBase : public HttpIntegrationTest {
2929
void checkStats();
3030

3131
protected:
32-
envoy::config::core::v3::TypedExtensionConfig* custom_validator_config_{nullptr};
3332
bool server_tlsv1_3_{false};
3433
bool server_rsa_cert_{true};
3534
bool server_rsa_cert_ocsp_staple_{false};

0 commit comments

Comments
 (0)