Skip to content

Commit eb174f1

Browse files
committed
Merge pull request nwjs#2561 from fancycode/additional_trust_anchors
Support setting additional root certificates on supported platforms.
2 parents 724ed41 + 2c545d8 commit eb174f1

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

src/net/shell_url_request_context_getter.cc

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include "content/nw/src/nw_shell.h"
3838
#include "content/nw/src/shell_content_browser_client.h"
3939
#include "net/cert/cert_verifier.h"
40+
#include "net/cert/cert_verify_proc.h"
41+
#include "net/cert/multi_threaded_cert_verifier.h"
4042
#include "net/dns/host_resolver.h"
4143
#include "net/dns/mapped_host_resolver.h"
4244
#include "net/ssl/ssl_config_service_defaults.h"
@@ -205,7 +207,14 @@ net::URLRequestContext* ShellURLRequestContextGetter::GetURLRequestContext() {
205207
scoped_ptr<net::HostResolver> host_resolver(
206208
net::HostResolver::CreateDefaultResolver(NULL));
207209

208-
storage_->set_cert_verifier(net::CertVerifier::CreateDefault());
210+
net::CertVerifyProc *verify_proc = net::CertVerifyProc::CreateDefault();
211+
if (!verify_proc->SupportsAdditionalTrustAnchors()) {
212+
LOG(WARNING)
213+
<< "Additional trust anchors not supported on the current platform!";
214+
}
215+
net::MultiThreadedCertVerifier *verifier = new net::MultiThreadedCertVerifier(verify_proc);
216+
verifier->SetCertTrustAnchorProvider(this);
217+
storage_->set_cert_verifier(verifier);
209218
storage_->set_transport_security_state(new net::TransportSecurityState);
210219

211220
net::ProxyService* proxy_service;
@@ -296,6 +305,17 @@ net::HostResolver* ShellURLRequestContextGetter::host_resolver() {
296305
return url_request_context_->host_resolver();
297306
}
298307

308+
void ShellURLRequestContextGetter::SetAdditionalTrustAnchors(const net::CertificateList& trust_anchors)
309+
{
310+
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
311+
trust_anchors_ = trust_anchors;
312+
}
313+
314+
const net::CertificateList& ShellURLRequestContextGetter::GetAdditionalTrustAnchors() {
315+
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
316+
return trust_anchors_;
317+
}
318+
299319
net::HttpAuthHandlerFactory* ShellURLRequestContextGetter::CreateDefaultAuthHandlerFactory(
300320
net::HostResolver* resolver) {
301321
net::HttpAuthFilterWhitelist* auth_filter_default_credentials = NULL;

src/net/shell_url_request_context_getter.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "base/memory/ref_counted.h"
2727
#include "base/memory/scoped_ptr.h"
2828
#include "content/public/browser/content_browser_client.h"
29+
#include "net/cert/cert_trust_anchor_provider.h"
2930
#include "net/url_request/url_request_context_getter.h"
3031
#include "net/url_request/url_request_job_factory.h"
3132

@@ -47,7 +48,7 @@ namespace content {
4748

4849
class ShellBrowserContext;
4950

50-
class ShellURLRequestContextGetter : public net::URLRequestContextGetter {
51+
class ShellURLRequestContextGetter : public net::URLRequestContextGetter, public net::CertTrustAnchorProvider {
5152
public:
5253
ShellURLRequestContextGetter(
5354
bool ignore_certificate_errors,
@@ -69,6 +70,11 @@ class ShellBrowserContext;
6970

7071
net::HostResolver* host_resolver();
7172

73+
void SetAdditionalTrustAnchors(const net::CertificateList& trust_anchors);
74+
75+
// net::CertTrustAnchorProvider implementation.
76+
virtual const net::CertificateList& GetAdditionalTrustAnchors() OVERRIDE;
77+
7278
protected:
7379
virtual ~ShellURLRequestContextGetter();
7480
net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory(net::HostResolver* resolver);
@@ -85,6 +91,7 @@ class ShellBrowserContext;
8591
std::string auth_delegate_whitelist_;
8692
std::string gssapi_library_name_;
8793
// std::vector<GURL> spdyproxy_auth_origins_;
94+
net::CertificateList trust_anchors_;
8895

8996
base::MessageLoop* io_loop_;
9097
base::MessageLoop* file_loop_;

src/shell_browser_context.cc

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "content/nw/src/common/shell_switches.h"
3636
#include "content/nw/src/net/shell_url_request_context_getter.h"
3737
#include "content/nw/src/nw_package.h"
38+
#include "net/cert/x509_certificate.h"
3839

3940
#if defined(OS_WIN)
4041
#include "base/base_paths_win.h"
@@ -190,6 +191,36 @@ net::URLRequestContextGetter* ShellBrowserContext::CreateRequestContext(
190191
auth_schemes, auth_server_whitelist, auth_delegate_whitelist,
191192
gssapi_library_name);
192193

194+
const base::ListValue *additional_trust_anchors = NULL;
195+
if (package_->root()->GetList("additional_trust_anchors", &additional_trust_anchors)) {
196+
net::CertificateList trust_anchors;
197+
for (size_t i=0; i<additional_trust_anchors->GetSize(); i++) {
198+
std::string certificate_string;
199+
if (!additional_trust_anchors->GetString(i, &certificate_string)) {
200+
LOG(WARNING)
201+
<< "Could not get string from entry " << i;
202+
continue;
203+
}
204+
205+
net::CertificateList loaded =
206+
net::X509Certificate::CreateCertificateListFromBytes(
207+
certificate_string.c_str(), certificate_string.size(),
208+
net::X509Certificate::FORMAT_AUTO);
209+
if (loaded.empty() && !certificate_string.empty()) {
210+
LOG(WARNING)
211+
<< "Could not load certificate from entry " << i;
212+
continue;
213+
}
214+
215+
trust_anchors.insert(trust_anchors.end(), loaded.begin(), loaded.end());
216+
}
217+
if (!trust_anchors.empty()) {
218+
LOG(INFO)
219+
<< "Added " << trust_anchors.size() << " certificates to trust anchors.";
220+
url_request_getter_->SetAdditionalTrustAnchors(trust_anchors);
221+
}
222+
}
223+
193224
resource_context_->set_url_request_context_getter(url_request_getter_.get());
194225
return url_request_getter_.get();
195226
}

0 commit comments

Comments
 (0)