Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(604)

Side by Side Diff: chrome/browser/ssl/ssl_browser_tests.cc

Issue 2753123002: Add --ignore-certificate-errors-spki-list switch and UMA histogram. (Closed)
Patch Set: Move test for --user-data-dir into unittest; add bad flags prompt. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <utility> 5 #include <utility>
6 6
7 #include "base/base64.h"
7 #include "base/base_switches.h" 8 #include "base/base_switches.h"
8 #include "base/bind.h" 9 #include "base/bind.h"
9 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
10 #include "base/callback.h" 11 #include "base/callback.h"
11 #include "base/command_line.h" 12 #include "base/command_line.h"
12 #include "base/location.h" 13 #include "base/location.h"
13 #include "base/macros.h" 14 #include "base/macros.h"
14 #include "base/metrics/field_trial.h" 15 #include "base/metrics/field_trial.h"
15 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
16 #include "base/strings/string_split.h" 17 #include "base/strings/string_split.h"
(...skipping 29 matching lines...) Expand all
46 #include "chrome/browser/ui/browser_commands.h" 47 #include "chrome/browser/ui/browser_commands.h"
47 #include "chrome/browser/ui/browser_finder.h" 48 #include "chrome/browser/ui/browser_finder.h"
48 #include "chrome/browser/ui/browser_navigator.h" 49 #include "chrome/browser/ui/browser_navigator.h"
49 #include "chrome/browser/ui/browser_navigator_params.h" 50 #include "chrome/browser/ui/browser_navigator_params.h"
50 #include "chrome/browser/ui/browser_tabstrip.h" 51 #include "chrome/browser/ui/browser_tabstrip.h"
51 #include "chrome/browser/ui/tabs/tab_strip_model.h" 52 #include "chrome/browser/ui/tabs/tab_strip_model.h"
52 #include "chrome/common/chrome_paths.h" 53 #include "chrome/common/chrome_paths.h"
53 #include "chrome/common/chrome_switches.h" 54 #include "chrome/common/chrome_switches.h"
54 #include "chrome/common/pref_names.h" 55 #include "chrome/common/pref_names.h"
55 #include "chrome/test/base/in_process_browser_test.h" 56 #include "chrome/test/base/in_process_browser_test.h"
57 #include "chrome/test/base/test_launcher_utils.h"
56 #include "chrome/test/base/ui_test_utils.h" 58 #include "chrome/test/base/ui_test_utils.h"
57 #include "components/content_settings/core/browser/host_content_settings_map.h" 59 #include "components/content_settings/core/browser/host_content_settings_map.h"
58 #include "components/network_time/network_time_test_utils.h" 60 #include "components/network_time/network_time_test_utils.h"
59 #include "components/network_time/network_time_tracker.h" 61 #include "components/network_time/network_time_tracker.h"
60 #include "components/prefs/testing_pref_service.h" 62 #include "components/prefs/testing_pref_service.h"
61 #include "components/security_interstitials/core/controller_client.h" 63 #include "components/security_interstitials/core/controller_client.h"
62 #include "components/security_interstitials/core/metrics_helper.h" 64 #include "components/security_interstitials/core/metrics_helper.h"
63 #include "components/security_state/core/security_state.h" 65 #include "components/security_state/core/security_state.h"
64 #include "components/security_state/core/switches.h" 66 #include "components/security_state/core/switches.h"
65 #include "components/ssl_errors/error_classification.h" 67 #include "components/ssl_errors/error_classification.h"
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 } // namespace 312 } // namespace
311 313
312 class SSLUITest : public InProcessBrowserTest { 314 class SSLUITest : public InProcessBrowserTest {
313 public: 315 public:
314 SSLUITest() 316 SSLUITest()
315 : https_server_(net::EmbeddedTestServer::TYPE_HTTPS), 317 : https_server_(net::EmbeddedTestServer::TYPE_HTTPS),
316 https_server_expired_(net::EmbeddedTestServer::TYPE_HTTPS), 318 https_server_expired_(net::EmbeddedTestServer::TYPE_HTTPS),
317 https_server_mismatched_(net::EmbeddedTestServer::TYPE_HTTPS), 319 https_server_mismatched_(net::EmbeddedTestServer::TYPE_HTTPS),
318 wss_server_expired_(net::SpawnedTestServer::TYPE_WSS, 320 wss_server_expired_(net::SpawnedTestServer::TYPE_WSS,
319 SSLOptions(SSLOptions::CERT_EXPIRED), 321 SSLOptions(SSLOptions::CERT_EXPIRED),
320 net::GetWebSocketTestDataDirectory()) { 322 net::GetWebSocketTestDataDirectory()),
323 wss_server_mismatched_(net::SpawnedTestServer::TYPE_WSS,
324 SSLOptions(SSLOptions::CERT_MISMATCHED_NAME),
325 net::GetWebSocketTestDataDirectory()) {
321 https_server_.AddDefaultHandlers(base::FilePath(kDocRoot)); 326 https_server_.AddDefaultHandlers(base::FilePath(kDocRoot));
322 327
323 https_server_expired_.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED); 328 https_server_expired_.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
324 https_server_expired_.AddDefaultHandlers(base::FilePath(kDocRoot)); 329 https_server_expired_.AddDefaultHandlers(base::FilePath(kDocRoot));
325 330
326 https_server_mismatched_.SetSSLConfig( 331 https_server_mismatched_.SetSSLConfig(
327 net::EmbeddedTestServer::CERT_MISMATCHED_NAME); 332 net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
328 https_server_mismatched_.AddDefaultHandlers(base::FilePath(kDocRoot)); 333 https_server_mismatched_.AddDefaultHandlers(base::FilePath(kDocRoot));
329 334
330 // Sometimes favicons load before tests check the authentication 335 // Sometimes favicons load before tests check the authentication
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 } else { 629 } else {
625 base::RunLoop().RunUntilIdle(); 630 base::RunLoop().RunUntilIdle();
626 EXPECT_EQ(std::string(), reporter_callback.GetLatestHostnameReported()); 631 EXPECT_EQ(std::string(), reporter_callback.GetLatestHostnameReported());
627 } 632 }
628 } 633 }
629 634
630 net::EmbeddedTestServer https_server_; 635 net::EmbeddedTestServer https_server_;
631 net::EmbeddedTestServer https_server_expired_; 636 net::EmbeddedTestServer https_server_expired_;
632 net::EmbeddedTestServer https_server_mismatched_; 637 net::EmbeddedTestServer https_server_mismatched_;
633 net::SpawnedTestServer wss_server_expired_; 638 net::SpawnedTestServer wss_server_expired_;
639 net::SpawnedTestServer wss_server_mismatched_;
634 640
635 protected: 641 protected:
636 // Navigates to an interstitial and clicks through the certificate 642 // Navigates to an interstitial and clicks through the certificate
637 // error; then navigates to a page at |path| that loads unsafe content. 643 // error; then navigates to a page at |path| that loads unsafe content.
638 void SetUpUnsafeContentsWithUserException(const std::string& path) { 644 void SetUpUnsafeContentsWithUserException(const std::string& path) {
639 ASSERT_TRUE(https_server_.Start()); 645 ASSERT_TRUE(https_server_.Start());
640 // Note that it is necessary to user https_server_mismatched_ here over the 646 // Note that it is necessary to user https_server_mismatched_ here over the
641 // other invalid cert servers. This is because the test relies on the two 647 // other invalid cert servers. This is because the test relies on the two
642 // servers having different hosts since SSL exceptions are per-host, not per 648 // servers having different hosts since SSL exceptions are per-host, not per
643 // origin, and https_server_mismatched_ uses 'localhost' rather than 649 // origin, and https_server_mismatched_ uses 'localhost' rather than
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 class SSLUITestIgnoreCertErrors : public SSLUITest { 688 class SSLUITestIgnoreCertErrors : public SSLUITest {
683 public: 689 public:
684 SSLUITestIgnoreCertErrors() : SSLUITest() {} 690 SSLUITestIgnoreCertErrors() : SSLUITest() {}
685 691
686 void SetUpCommandLine(base::CommandLine* command_line) override { 692 void SetUpCommandLine(base::CommandLine* command_line) override {
687 // Browser will ignore certificate errors. 693 // Browser will ignore certificate errors.
688 command_line->AppendSwitch(switches::kIgnoreCertificateErrors); 694 command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
689 } 695 }
690 }; 696 };
691 697
698 static std::string MakeCertSPKIFingerprint(net::X509Certificate* cert) {
699 net::HashValue hash = GetSPKIHash(cert);
700 std::string hash_base64;
701 base::Base64Encode(
702 base::StringPiece(reinterpret_cast<const char*>(hash.data()),
703 hash.size()),
704 &hash_base64);
705 return hash_base64;
706 }
707
708 class SSLUITestIgnoreCertErrorsBySPKIHTTPS : public SSLUITest {
709 protected:
710 void SetUpCommandLine(base::CommandLine* command_line) override {
711 std::string whitelist_flag = MakeCertSPKIFingerprint(
712 https_server_mismatched_.GetCertificate().get());
713 command_line->AppendSwitchASCII(switches::kIgnoreCertificateErrorsSPKIList,
714 whitelist_flag);
715 }
716 };
717
718 class SSLUITestIgnoreCertErrorsBySPKIWSS : public SSLUITest {
719 public:
720 SSLUITestIgnoreCertErrorsBySPKIWSS() : SSLUITest() {}
721
722 void SetUpCommandLine(base::CommandLine* command_line) override {
723 std::string whitelist_flag =
724 MakeCertSPKIFingerprint(wss_server_expired_.GetCertificate().get());
725 // Browser will ignore certificate errors for chains matching one of the
726 // public keys from the list.
estark 2017/05/17 18:04:18 optional nit: just for consistency, include this c
martinkr 2017/05/23 18:30:43 Done.
727 command_line->AppendSwitchASCII(switches::kIgnoreCertificateErrorsSPKIList,
728 whitelist_flag);
729 }
730 };
731
692 class SSLUITestIgnoreLocalhostCertErrors : public SSLUITest { 732 class SSLUITestIgnoreLocalhostCertErrors : public SSLUITest {
693 public: 733 public:
694 SSLUITestIgnoreLocalhostCertErrors() : SSLUITest() {} 734 SSLUITestIgnoreLocalhostCertErrors() : SSLUITest() {}
695 735
696 void SetUpCommandLine(base::CommandLine* command_line) override { 736 void SetUpCommandLine(base::CommandLine* command_line) override {
697 // Browser will ignore certificate errors on localhost. 737 // Browser will ignore certificate errors on localhost.
698 command_line->AppendSwitch(switches::kAllowInsecureLocalhost); 738 command_line->AppendSwitch(switches::kAllowInsecureLocalhost);
699 } 739 }
700 }; 740 };
701 741
(...skipping 1955 matching lines...) Expand 10 before | Expand all | Expand 10 after
2657 .ReplaceComponents(replacements)); 2697 .ReplaceComponents(replacements));
2658 2698
2659 // We shouldn't have an interstitial page showing here. 2699 // We shouldn't have an interstitial page showing here.
2660 2700
2661 // Test page run a WebSocket wss connection test. The result will be shown 2701 // Test page run a WebSocket wss connection test. The result will be shown
2662 // as page title. 2702 // as page title.
2663 const base::string16 result = watcher.WaitAndGetTitle(); 2703 const base::string16 result = watcher.WaitAndGetTitle();
2664 EXPECT_TRUE(base::LowerCaseEqualsASCII(result, "pass")); 2704 EXPECT_TRUE(base::LowerCaseEqualsASCII(result, "pass"));
2665 } 2705 }
2666 2706
2707 // Visit a page and establish a WebSocket connection over bad https with
estark 2017/05/17 18:04:18 Question: are you testing WebSockets because they
martinkr 2017/05/23 18:30:43 I was actually just aping SSLUITestIgnoreCertError
2708 // --disable-certificate-errors-spki-list. The connection should be established
estark 2017/05/17 18:04:18 nit: s/disable/ignore? (same on line 2735)
martinkr 2017/05/23 18:30:43 Done.
2709 // without interstitial page showing.
2710 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIWSS, TestWSSExpired) {
2711 ASSERT_TRUE(embedded_test_server()->Start());
estark 2017/05/17 18:04:19 Do you need this? Doesn't look like you use it unl
martinkr 2017/05/23 18:30:43 Done.
2712 ASSERT_TRUE(wss_server_expired_.Start());
2713
2714 // Setup page title observer.
2715 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
2716 content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS"));
2717 watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL"));
2718
2719 // Visit bad HTTPS page.
2720 GURL::Replacements replacements;
2721 replacements.SetSchemeStr("https");
2722 ui_test_utils::NavigateToURL(browser(),
2723 wss_server_expired_.GetURL("connect_check.html")
2724 .ReplaceComponents(replacements));
2725
2726 // We shouldn't have an interstitial page showing here.
2727
2728 // Test page run a WebSocket wss connection test. The result will be shown
2729 // as page title.
2730 const base::string16 result = watcher.WaitAndGetTitle();
2731 EXPECT_TRUE(base::LowerCaseEqualsASCII(result, "pass"));
2732 }
2733
2734 // Test that HTTPS pages with a bad certificate don't show an interstitial if
2735 // the public key matches a value from --disable-certificate-errors-spki-list.
2736 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIHTTPS, TestHTTPS) {
2737 ASSERT_TRUE(https_server_mismatched_.Start());
2738
2739 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
2740
2741 ui_test_utils::NavigateToURL(
2742 browser(),
2743 https_server_mismatched_.GetURL("/ssl/page_with_subresource.html"));
2744
2745 // We should see no interstitial. The script tag in the page should have
2746 // loaded and ran (and wasn't blocked by the certificate error).
2747 CheckAuthenticatedState(tab, AuthState::NONE);
2748 base::string16 title;
2749 ui_test_utils::GetCurrentTabTitle(browser(), &title);
2750 EXPECT_EQ(title, base::ASCIIToUTF16("This script has loaded"));
2751 }
2752
2667 // Verifies that the interstitial can proceed, even if JavaScript is disabled. 2753 // Verifies that the interstitial can proceed, even if JavaScript is disabled.
2668 // http://crbug.com/322948 2754 // http://crbug.com/322948
2669 #if defined(OS_LINUX) 2755 #if defined(OS_LINUX)
2670 // flaky http://crbug.com/396458 2756 // flaky http://crbug.com/396458
2671 #define MAYBE_TestInterstitialJavaScriptProceeds \ 2757 #define MAYBE_TestInterstitialJavaScriptProceeds \
2672 DISABLED_TestInterstitialJavaScriptProceeds 2758 DISABLED_TestInterstitialJavaScriptProceeds
2673 #else 2759 #else
2674 #define MAYBE_TestInterstitialJavaScriptProceeds \ 2760 #define MAYBE_TestInterstitialJavaScriptProceeds \
2675 TestInterstitialJavaScriptProceeds 2761 TestInterstitialJavaScriptProceeds
2676 #endif 2762 #endif
(...skipping 1730 matching lines...) Expand 10 before | Expand all | Expand 10 after
4407 4493
4408 // Visit a page over https that contains a frame with a redirect. 4494 // Visit a page over https that contains a frame with a redirect.
4409 4495
4410 // XMLHttpRequest insecure content in synchronous mode. 4496 // XMLHttpRequest insecure content in synchronous mode.
4411 4497
4412 // XMLHttpRequest insecure content in asynchronous mode. 4498 // XMLHttpRequest insecure content in asynchronous mode.
4413 4499
4414 // XMLHttpRequest over bad ssl in synchronous mode. 4500 // XMLHttpRequest over bad ssl in synchronous mode.
4415 4501
4416 // XMLHttpRequest over OK ssl in synchronous mode. 4502 // XMLHttpRequest over OK ssl in synchronous mode.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698