network_service_allow_remote_certificate_verification_logic.patch 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Jeremy Apthorp <[email protected]>
  3. Date: Wed, 8 May 2019 17:25:55 -0700
  4. Subject: network_service_allow_remote_certificate_verification_logic.patch
  5. This adds a callback from the network service that's used to implement
  6. session.setCertificateVerifyCallback.
  7. diff --git a/services/network/network_context.cc b/services/network/network_context.cc
  8. index e5dfb9c6fd2032608ac32cd997fb027fd9b324e5..7e7e50880804583acf75206d3f5f1c6f4c3b158d 100644
  9. --- a/services/network/network_context.cc
  10. +++ b/services/network/network_context.cc
  11. @@ -95,6 +95,11 @@
  12. #include "services/network/url_loader.h"
  13. #include "services/network/url_request_context_builder_mojo.h"
  14. +// Electron
  15. +#include "net/cert/caching_cert_verifier.h"
  16. +#include "net/cert/cert_verify_proc.h"
  17. +#include "net/cert/multi_threaded_cert_verifier.h"
  18. +
  19. #if BUILDFLAG(IS_CT_SUPPORTED)
  20. #include "components/certificate_transparency/chrome_ct_policy_enforcer.h"
  21. #include "components/certificate_transparency/chrome_require_ct_delegate.h"
  22. @@ -330,6 +335,79 @@ std::string HashesToBase64String(const net::HashValueVector& hashes) {
  23. } // namespace
  24. +class RemoteCertVerifier : public net::CertVerifier {
  25. + public:
  26. + RemoteCertVerifier(std::unique_ptr<net::CertVerifier> upstream): upstream_(std::move(upstream)) {
  27. + }
  28. + ~RemoteCertVerifier() override = default;
  29. +
  30. + void Bind(
  31. + mojo::PendingRemote<mojom::CertVerifierClient> client_info) {
  32. + client_.reset();
  33. + if (client_info.is_valid()) {
  34. + client_.Bind(std::move(client_info));
  35. + }
  36. + }
  37. +
  38. + // CertVerifier implementation
  39. + int Verify(const RequestParams& params,
  40. + net::CertVerifyResult* verify_result,
  41. + net::CompletionOnceCallback callback,
  42. + std::unique_ptr<Request>* out_req,
  43. + const net::NetLogWithSource& net_log) override {
  44. + out_req->reset();
  45. +
  46. + net::CompletionOnceCallback callback2 = base::BindOnce(
  47. + &RemoteCertVerifier::OnRequestFinished, base::Unretained(this),
  48. + params, std::move(callback), verify_result);
  49. + int result = upstream_->Verify(params, verify_result,
  50. + std::move(callback2), out_req, net_log);
  51. + if (result != net::ERR_IO_PENDING) {
  52. + // Synchronous completion
  53. + }
  54. +
  55. + return result;
  56. + }
  57. +
  58. +
  59. + void SetConfig(const Config& config) override {
  60. + upstream_->SetConfig(config);
  61. + }
  62. +
  63. + void OnRequestFinished(const RequestParams& params, net::CompletionOnceCallback callback, net::CertVerifyResult* verify_result, int error) {
  64. + if (client_.is_bound()) {
  65. + client_->Verify(error, *verify_result, params.certificate(),
  66. + params.hostname(), params.flags(), params.ocsp_response(),
  67. + base::BindOnce(&RemoteCertVerifier::OnRemoteResponse,
  68. + base::Unretained(this), params, verify_result, error,
  69. + std::move(callback)));
  70. + } else {
  71. + std::move(callback).Run(error);
  72. + }
  73. + }
  74. +
  75. + void OnRemoteResponse(
  76. + const RequestParams& params,
  77. + net::CertVerifyResult* verify_result,
  78. + int error,
  79. + net::CompletionOnceCallback callback,
  80. + int error2,
  81. + const net::CertVerifyResult& verify_result2) {
  82. + if (error2 == net::ERR_ABORTED) {
  83. + // use the default
  84. + std::move(callback).Run(error);
  85. + } else {
  86. + // use the override
  87. + verify_result->Reset();
  88. + verify_result->verified_cert = verify_result2.verified_cert;
  89. + std::move(callback).Run(error2);
  90. + }
  91. + }
  92. + private:
  93. + std::unique_ptr<net::CertVerifier> upstream_;
  94. + mojo::Remote<mojom::CertVerifierClient> client_;
  95. +};
  96. +
  97. constexpr uint32_t NetworkContext::kMaxOutstandingRequestsPerProcess;
  98. NetworkContext::PendingCertVerify::PendingCertVerify() = default;
  99. @@ -516,6 +594,13 @@ void NetworkContext::SetClient(
  100. client_.Bind(std::move(client));
  101. }
  102. +void NetworkContext::SetCertVerifierClient(
  103. + mojo::PendingRemote<mojom::CertVerifierClient> client) {
  104. + if (remote_cert_verifier_) {
  105. + remote_cert_verifier_->Bind(std::move(client));
  106. + }
  107. +}
  108. +
  109. void NetworkContext::CreateURLLoaderFactory(
  110. mojo::PendingReceiver<mojom::URLLoaderFactory> receiver,
  111. mojom::URLLoaderFactoryParamsPtr params) {
  112. @@ -1661,6 +1746,7 @@ URLRequestContextOwner NetworkContext::MakeURLRequestContext(
  113. base::CommandLine::ForCurrentProcess();
  114. std::unique_ptr<net::CertVerifier> cert_verifier;
  115. + std::unique_ptr<net::CertVerifier> temp_verifier;
  116. if (g_cert_verifier_for_testing) {
  117. cert_verifier = std::make_unique<WrappedTestingCertVerifier>();
  118. } else {
  119. @@ -1714,8 +1800,8 @@ URLRequestContextOwner NetworkContext::MakeURLRequestContext(
  120. }
  121. #endif
  122. #if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
  123. - if (!cert_verifier) {
  124. - cert_verifier = std::make_unique<net::CachingCertVerifier>(
  125. + if (!temp_verifier) {
  126. + temp_verifier = std::make_unique<net::CachingCertVerifier>(
  127. std::make_unique<net::CoalescingCertVerifier>(
  128. std::make_unique<net::MultiThreadedCertVerifier>(
  129. params_->use_builtin_cert_verifier
  130. @@ -1725,12 +1811,19 @@ URLRequestContextOwner NetworkContext::MakeURLRequestContext(
  131. cert_net_fetcher_))));
  132. }
  133. #endif
  134. - if (!cert_verifier)
  135. - cert_verifier = net::CertVerifier::CreateDefault(cert_net_fetcher_);
  136. + if (!temp_verifier) {
  137. + temp_verifier = std::make_unique<net::MultiThreadedCertVerifier>(
  138. + net::CertVerifyProc::CreateSystemVerifyProc(std::move(cert_net_fetcher_)));
  139. + }
  140. + auto remote_cert_verifier = std::make_unique<RemoteCertVerifier>(std::move(temp_verifier));
  141. + remote_cert_verifier_ = remote_cert_verifier.get();
  142. + cert_verifier = std::make_unique<net::CachingCertVerifier>(std::move(remote_cert_verifier));
  143. }
  144. - builder.SetCertVerifier(IgnoreErrorsCertVerifier::MaybeWrapCertVerifier(
  145. - *command_line, nullptr, std::move(cert_verifier)));
  146. + cert_verifier = IgnoreErrorsCertVerifier::MaybeWrapCertVerifier(
  147. + *command_line, nullptr, std::move(cert_verifier));
  148. +
  149. + builder.SetCertVerifier(std::move(cert_verifier));
  150. std::unique_ptr<NetworkServiceNetworkDelegate> network_delegate =
  151. std::make_unique<NetworkServiceNetworkDelegate>(
  152. diff --git a/services/network/network_context.h b/services/network/network_context.h
  153. index 23a5fe596b2607fa2b95f601cb621e4e11f81d50..67f0e98426345beac34bfd41be384210be5911e4 100644
  154. --- a/services/network/network_context.h
  155. +++ b/services/network/network_context.h
  156. @@ -87,6 +87,7 @@ class DomainReliabilityMonitor;
  157. namespace network {
  158. class CertVerifierWithTrustAnchors;
  159. +class RemoteCertVerifier;
  160. class CookieManager;
  161. class ExpectCTReporter;
  162. class HostResolver;
  163. @@ -184,6 +185,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
  164. void CreateURLLoaderFactory(
  165. mojo::PendingReceiver<mojom::URLLoaderFactory> receiver,
  166. mojom::URLLoaderFactoryParamsPtr params) override;
  167. + void SetCertVerifierClient(
  168. + mojo::PendingRemote<mojom::CertVerifierClient> client) override;
  169. void ResetURLLoaderFactories() override;
  170. void GetCookieManager(
  171. mojo::PendingReceiver<mojom::CookieManager> receiver) override;
  172. @@ -621,6 +624,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
  173. std::unique_ptr<network::NSSTempCertsCacheChromeOS> nss_temp_certs_cache_;
  174. #endif
  175. + RemoteCertVerifier* remote_cert_verifier_ = nullptr;
  176. +
  177. // CertNetFetcher used by the context's CertVerifier. May be nullptr if
  178. // CertNetFetcher is not used by the current platform.
  179. scoped_refptr<cert_verifier::CertNetFetcherURLLoader> cert_net_fetcher_;
  180. diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
  181. index 32a60d94e488b12acb27700416da90cd578bbd57..b3a2dd03807bc8deb867c5168af5251a818389a2 100644
  182. --- a/services/network/public/mojom/network_context.mojom
  183. +++ b/services/network/public/mojom/network_context.mojom
  184. @@ -191,6 +191,17 @@ struct HttpAuthStaticNetworkContextParams {
  185. = DefaultCredentials.ALLOW_DEFAULT_CREDENTIALS;
  186. };
  187. +interface CertVerifierClient {
  188. + Verify(
  189. + int32 default_error,
  190. + CertVerifyResult default_result,
  191. + X509Certificate certificate,
  192. + string hostname,
  193. + int32 flags,
  194. + string? ocsp_response
  195. + ) => (int32 error_code, CertVerifyResult result);
  196. +};
  197. +
  198. // Parameters for constructing a network context.
  199. struct NetworkContextParams {
  200. // Name used by memory tools to identify the context.
  201. @@ -808,6 +819,9 @@ interface NetworkContext {
  202. // Sets a client for this network context.
  203. SetClient(pending_remote<NetworkContextClient> client);
  204. + // Sets a certificate verifier client for this network context.
  205. + SetCertVerifierClient(pending_remote<CertVerifierClient>? client);
  206. +
  207. // Creates a new URLLoaderFactory with the given |params|.
  208. CreateURLLoaderFactory(pending_receiver<URLLoaderFactory> url_loader_factory,
  209. URLLoaderFactoryParams params);