Skip to content

Commit bfec433

Browse files
Huilin Chenmeta-codesync[bot]
authored andcommitted
Fix hostname validations for unit testings
Summary: - This diff disables the hostname validation when the inner verifier is a InsecureCertificateVerifier. There's no need to perform hostname validation when the certificate verifier is being disabled. - Lots of hostname validation failure in unit testings, since they use loopback or other IPs. This change also skips hostname validation for these unit tests, since they all use the InsecureCertificateVerifier already. Reviewed By: mingtaoy Differential Revision: D116676469 fbshipit-source-id: af86c2f6243d5abd32b2ffa14f8cb48c5bc4b4f3
1 parent a751da1 commit bfec433

5 files changed

Lines changed: 31 additions & 5 deletions

File tree

proxygen/httpserver/samples/hq/InsecureVerifierDangerousDoNotUseInProduction.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@ namespace proxygen {
1616
// used in production. Using it in production would mean that this will
1717
// leave everyone insecure.
1818
class InsecureVerifierDangerousDoNotUseInProduction
19-
: public fizz::CertificateVerifier {
19+
: public fizz::InsecureCertificateVerifier {
2020
public:
21+
InsecureVerifierDangerousDoNotUseInProduction()
22+
: fizz::InsecureCertificateVerifier(fizz::VerificationContext::Client) {
23+
}
24+
2125
~InsecureVerifierDangerousDoNotUseInProduction() override = default;
2226

2327
fizz::Status verify(std::shared_ptr<const fizz::Cert>& ret,

proxygen/lib/http/coro/client/ProxygenCertVerifier.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,15 @@ std::optional<folly::IPAddress> ExpectedIdentity::getIp() const {
162162
return std::nullopt;
163163
}
164164

165-
std::shared_ptr<fizz::CertificateVerifier> makeVerifier(
165+
std::shared_ptr<const fizz::CertificateVerifier> makeVerifier(
166166
std::shared_ptr<const fizz::CertificateVerifier> verifier,
167167
ExpectedIdentity expectedIdentity,
168168
ValidationPolicy policy,
169169
CertVerifyLogFn logFn) {
170+
if (std::dynamic_pointer_cast<const fizz::InsecureCertificateVerifier>(
171+
verifier)) {
172+
return verifier;
173+
}
170174
return std::make_shared<ProxygenCertVerifier>(std::move(verifier),
171175
std::move(expectedIdentity),
172176
policy,

proxygen/lib/http/coro/client/ProxygenCertVerifier.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,13 @@ struct ExpectedIdentity {
6767
* Creates a fizz::CertificateVerifier that validates the peer certificate chain
6868
* with `verifier` and, on top of that, verifies that the leaf certificate
6969
* matches `expectedIdentity`, handling a mismatch according to `policy`.
70+
* An InsecureCertificateVerifier is returned directly without identity
71+
* verification.
7072
*
7173
* `verifier` must not be null. `logFn`, if set, is invoked with
7274
* CertVerifyResult and error message if applicable.
7375
*/
74-
std::shared_ptr<fizz::CertificateVerifier> makeVerifier(
76+
std::shared_ptr<const fizz::CertificateVerifier> makeVerifier(
7577
std::shared_ptr<const fizz::CertificateVerifier> verifier,
7678
ExpectedIdentity expectedIdentity,
7779
ValidationPolicy policy,

proxygen/lib/http/coro/client/test/ProxygenCertVerifierTest.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class ProxygenCertVerifierTest : public testing::Test {
3434
}
3535

3636
protected:
37-
std::shared_ptr<fizz::CertificateVerifier> makeVerifier(
37+
std::shared_ptr<const fizz::CertificateVerifier> makeVerifier(
3838
ExpectedIdentity expectedIdentity, ValidationPolicy policy) {
3939
folly::ssl::X509StoreUniquePtr store(X509_STORE_new());
4040
EXPECT_EQ(X509_STORE_add_cert(store.get(), rootCertAndKey_.cert.get()), 1);
@@ -109,6 +109,18 @@ TEST_F(ProxygenCertVerifierTest, UnderlyingVerifierFailure) {
109109
Status::Fail);
110110
}
111111

112+
TEST_F(ProxygenCertVerifierTest, InsecureVerifierReturnedDirectly) {
113+
auto insecureVerifier = std::make_shared<InsecureCertificateVerifier>(
114+
VerificationContext::Client);
115+
116+
auto verifier = coro::makeVerifier(insecureVerifier,
117+
ExpectedIdentity::expectDNS("example.com"),
118+
ValidationPolicy::Enforcing,
119+
nullptr);
120+
121+
EXPECT_EQ(verifier, insecureVerifier);
122+
}
123+
112124
TEST_F(ProxygenCertVerifierTest, NullInnerVerifierFailsAtConstruction) {
113125
EXPECT_DEATH(coro::makeVerifier(nullptr,
114126
ExpectedIdentity::expectDNS("example.com"),

proxygen/lib/http/coro/test/TestUtils.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@ namespace proxygen::coro::test {
1515
// used in production. Using it in production would mean that this will
1616
// leave everyone insecure.
1717
class InsecureVerifierDangerousDoNotUseInProduction
18-
: public fizz::CertificateVerifier {
18+
: public fizz::InsecureCertificateVerifier {
1919
public:
20+
InsecureVerifierDangerousDoNotUseInProduction()
21+
: fizz::InsecureCertificateVerifier(fizz::VerificationContext::Client) {
22+
}
23+
2024
~InsecureVerifierDangerousDoNotUseInProduction() override = default;
2125

2226
fizz::Status verify(std::shared_ptr<const fizz::Cert>& ret,

0 commit comments

Comments
 (0)