blob: d33960e55ff85b6899415bd0be1f0f9e14daca04 [file] [log] [blame]
[email protected]09581d12012-02-27 05:12:471// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]3b073b22009-01-16 03:29:035#include "chrome/browser/ssl/ssl_error_info.h"
initial.commit09911bf2008-07-26 23:55:296
[email protected]09581d12012-02-27 05:12:477#include "base/i18n/time_formatting.h"
[email protected]4bf41352010-03-08 21:21:368#include "base/utf_string_conversions.h"
initial.commit09911bf2008-07-26 23:55:299#include "chrome/common/time_format.h"
[email protected]b59c6cf02012-03-12 20:51:4210#include "content/public/browser/cert_store.h"
[email protected]34ac8f32009-02-22 23:03:2711#include "googleurl/src/gurl.h"
12#include "grit/chromium_strings.h"
13#include "grit/generated_resources.h"
initial.commit09911bf2008-07-26 23:55:2914#include "net/base/cert_status_flags.h"
[email protected]68b65022012-08-18 01:58:4215#include "net/base/escape.h"
initial.commit09911bf2008-07-26 23:55:2916#include "net/base/net_errors.h"
17#include "net/base/ssl_info.h"
[email protected]c051a1b2011-01-21 23:30:1718#include "ui/base/l10n/l10n_util.h"
initial.commit09911bf2008-07-26 23:55:2919
[email protected]42197a22010-12-28 23:29:4220SSLErrorInfo::SSLErrorInfo(const string16& title,
21 const string16& details,
22 const string16& short_description,
23 const std::vector<string16>& extra_info)
initial.commit09911bf2008-07-26 23:55:2924 : title_(title),
25 details_(details),
26 short_description_(short_description),
27 extra_information_(extra_info) {
28}
29
30// static
31SSLErrorInfo SSLErrorInfo::CreateError(ErrorType error_type,
[email protected]8ac1a752008-07-31 19:40:3732 net::X509Certificate* cert,
initial.commit09911bf2008-07-26 23:55:2933 const GURL& request_url) {
[email protected]42197a22010-12-28 23:29:4234 string16 title, details, short_description;
35 std::vector<string16> extra_info;
initial.commit09911bf2008-07-26 23:55:2936 switch (error_type) {
37 case CERT_COMMON_NAME_INVALID: {
[email protected]42197a22010-12-28 23:29:4238 title =
39 l10n_util::GetStringUTF16(IDS_CERT_ERROR_COMMON_NAME_INVALID_TITLE);
initial.commit09911bf2008-07-26 23:55:2940 // If the certificate contains multiple DNS names, we choose the most
41 // representative one -- either the DNS name that's also in the subject
42 // field, or the first one. If this heuristic turns out to be
43 // inadequate, we can consider choosing the DNS name that is the
44 // "closest match" to the host name in the request URL, or listing all
45 // the DNS names with an HTML <ul>.
46 std::vector<std::string> dns_names;
47 cert->GetDNSNames(&dns_names);
48 DCHECK(!dns_names.empty());
49 size_t i = 0;
50 for (; i < dns_names.size(); ++i) {
51 if (dns_names[i] == cert->subject().common_name)
52 break;
53 }
54 if (i == dns_names.size())
55 i = 0;
56 details =
[email protected]42197a22010-12-28 23:29:4257 l10n_util::GetStringFUTF16(IDS_CERT_ERROR_COMMON_NAME_INVALID_DETAILS,
58 UTF8ToUTF16(request_url.host()),
[email protected]68b65022012-08-18 01:58:4259 net::EscapeForHTML(
60 UTF8ToUTF16(dns_names[i])),
[email protected]42197a22010-12-28 23:29:4261 UTF8ToUTF16(request_url.host()));
62 short_description = l10n_util::GetStringUTF16(
63 IDS_CERT_ERROR_COMMON_NAME_INVALID_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:2964 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:4265 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
initial.commit09911bf2008-07-26 23:55:2966 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:4267 l10n_util::GetStringFUTF16(
initial.commit09911bf2008-07-26 23:55:2968 IDS_CERT_ERROR_COMMON_NAME_INVALID_EXTRA_INFO_2,
[email protected]68b65022012-08-18 01:58:4269 net::EscapeForHTML(UTF8ToUTF16(cert->subject().common_name)),
[email protected]42197a22010-12-28 23:29:4270 UTF8ToUTF16(request_url.host())));
initial.commit09911bf2008-07-26 23:55:2971 break;
72 }
73 case CERT_DATE_INVALID:
74 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:4275 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
initial.commit09911bf2008-07-26 23:55:2976 if (cert->HasExpired()) {
[email protected]42197a22010-12-28 23:29:4277 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXPIRED_TITLE);
[email protected]09581d12012-02-27 05:12:4778 details = l10n_util::GetStringFUTF16(
79 IDS_CERT_ERROR_EXPIRED_DETAILS,
80 UTF8ToUTF16(request_url.host()),
81 UTF8ToUTF16(request_url.host()),
82 base::TimeFormatFriendlyDateAndTime(base::Time::Now()));
initial.commit09911bf2008-07-26 23:55:2983 short_description =
[email protected]42197a22010-12-28 23:29:4284 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXPIRED_DESCRIPTION);
85 extra_info.push_back(l10n_util::GetStringUTF16(
86 IDS_CERT_ERROR_EXPIRED_DETAILS_EXTRA_INFO_2));
initial.commit09911bf2008-07-26 23:55:2987 } else {
88 // Then it must be not yet valid. We don't check that it is not yet
89 // valid as there is still a very unlikely chance that the cert might
90 // have become valid since the error occurred.
[email protected]42197a22010-12-28 23:29:4291 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_NOT_YET_VALID_TITLE);
92 details = l10n_util::GetStringFUTF16(
93 IDS_CERT_ERROR_NOT_YET_VALID_DETAILS,
94 UTF8ToUTF16(request_url.host()),
[email protected]09581d12012-02-27 05:12:4795 UTF8ToUTF16(request_url.host()),
96 base::TimeFormatFriendlyDateAndTime(base::Time::Now()));
initial.commit09911bf2008-07-26 23:55:2997 short_description =
[email protected]42197a22010-12-28 23:29:4298 l10n_util::GetStringUTF16(IDS_CERT_ERROR_NOT_YET_VALID_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:2999 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42100 l10n_util::GetStringUTF16(
initial.commit09911bf2008-07-26 23:55:29101 IDS_CERT_ERROR_NOT_YET_VALID_DETAILS_EXTRA_INFO_2));
102 }
103 break;
104 case CERT_AUTHORITY_INVALID:
[email protected]42197a22010-12-28 23:29:42105 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_AUTHORITY_INVALID_TITLE);
106 details = l10n_util::GetStringFUTF16(
107 IDS_CERT_ERROR_AUTHORITY_INVALID_DETAILS,
108 UTF8ToUTF16(request_url.host()));
109 short_description = l10n_util::GetStringUTF16(
110 IDS_CERT_ERROR_AUTHORITY_INVALID_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29111 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42112 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
113 extra_info.push_back(l10n_util::GetStringFUTF16(
114 IDS_CERT_ERROR_AUTHORITY_INVALID_EXTRA_INFO_2,
115 UTF8ToUTF16(request_url.host()),
116 UTF8ToUTF16(request_url.host())));
117 extra_info.push_back(l10n_util::GetStringUTF16(
118 IDS_CERT_ERROR_AUTHORITY_INVALID_EXTRA_INFO_3));
initial.commit09911bf2008-07-26 23:55:29119 break;
120 case CERT_CONTAINS_ERRORS:
[email protected]42197a22010-12-28 23:29:42121 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_CONTAINS_ERRORS_TITLE);
122 details = l10n_util::GetStringFUTF16(
123 IDS_CERT_ERROR_CONTAINS_ERRORS_DETAILS,
124 UTF8ToUTF16(request_url.host()));
initial.commit09911bf2008-07-26 23:55:29125 short_description =
[email protected]42197a22010-12-28 23:29:42126 l10n_util::GetStringUTF16(IDS_CERT_ERROR_CONTAINS_ERRORS_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29127 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42128 l10n_util::GetStringFUTF16(IDS_CERT_ERROR_EXTRA_INFO_1,
129 UTF8ToUTF16(request_url.host())));
130 extra_info.push_back(l10n_util::GetStringUTF16(
131 IDS_CERT_ERROR_CONTAINS_ERRORS_EXTRA_INFO_2));
initial.commit09911bf2008-07-26 23:55:29132 break;
133 case CERT_NO_REVOCATION_MECHANISM:
[email protected]42197a22010-12-28 23:29:42134 title = l10n_util::GetStringUTF16(
135 IDS_CERT_ERROR_NO_REVOCATION_MECHANISM_TITLE);
136 details = l10n_util::GetStringUTF16(
137 IDS_CERT_ERROR_NO_REVOCATION_MECHANISM_DETAILS);
138 short_description = l10n_util::GetStringUTF16(
initial.commit09911bf2008-07-26 23:55:29139 IDS_CERT_ERROR_NO_REVOCATION_MECHANISM_DESCRIPTION);
140 break;
141 case CERT_UNABLE_TO_CHECK_REVOCATION:
[email protected]42197a22010-12-28 23:29:42142 title = l10n_util::GetStringUTF16(
143 IDS_CERT_ERROR_UNABLE_TO_CHECK_REVOCATION_TITLE);
144 details = l10n_util::GetStringUTF16(
initial.commit09911bf2008-07-26 23:55:29145 IDS_CERT_ERROR_UNABLE_TO_CHECK_REVOCATION_DETAILS);
[email protected]42197a22010-12-28 23:29:42146 short_description = l10n_util::GetStringUTF16(
initial.commit09911bf2008-07-26 23:55:29147 IDS_CERT_ERROR_UNABLE_TO_CHECK_REVOCATION_DESCRIPTION);
148 break;
149 case CERT_REVOKED:
[email protected]42197a22010-12-28 23:29:42150 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_REVOKED_CERT_TITLE);
151 details = l10n_util::GetStringFUTF16(IDS_CERT_ERROR_REVOKED_CERT_DETAILS,
152 UTF8ToUTF16(request_url.host()));
initial.commit09911bf2008-07-26 23:55:29153 short_description =
[email protected]42197a22010-12-28 23:29:42154 l10n_util::GetStringUTF16(IDS_CERT_ERROR_REVOKED_CERT_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29155 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42156 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
initial.commit09911bf2008-07-26 23:55:29157 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42158 l10n_util::GetStringUTF16(IDS_CERT_ERROR_REVOKED_CERT_EXTRA_INFO_2));
initial.commit09911bf2008-07-26 23:55:29159 break;
160 case CERT_INVALID:
[email protected]42197a22010-12-28 23:29:42161 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_INVALID_CERT_TITLE);
[email protected]eb8a06d2011-03-04 04:40:38162 details = l10n_util::GetStringFUTF16(
163 IDS_CERT_ERROR_INVALID_CERT_DETAILS,
164 UTF8ToUTF16(request_url.host()));
initial.commit09911bf2008-07-26 23:55:29165 short_description =
[email protected]42197a22010-12-28 23:29:42166 l10n_util::GetStringUTF16(IDS_CERT_ERROR_INVALID_CERT_DESCRIPTION);
[email protected]eb8a06d2011-03-04 04:40:38167 extra_info.push_back(
168 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
169 extra_info.push_back(l10n_util::GetStringUTF16(
170 IDS_CERT_ERROR_INVALID_CERT_EXTRA_INFO_2));
initial.commit09911bf2008-07-26 23:55:29171 break;
[email protected]0374b292009-08-14 23:49:19172 case CERT_WEAK_SIGNATURE_ALGORITHM:
[email protected]42197a22010-12-28 23:29:42173 title = l10n_util::GetStringUTF16(
174 IDS_CERT_ERROR_WEAK_SIGNATURE_ALGORITHM_TITLE);
175 details = l10n_util::GetStringFUTF16(
[email protected]0374b292009-08-14 23:49:19176 IDS_CERT_ERROR_WEAK_SIGNATURE_ALGORITHM_DETAILS,
[email protected]42197a22010-12-28 23:29:42177 UTF8ToUTF16(request_url.host()));
178 short_description = l10n_util::GetStringUTF16(
[email protected]0374b292009-08-14 23:49:19179 IDS_CERT_ERROR_WEAK_SIGNATURE_ALGORITHM_DESCRIPTION);
180 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42181 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
[email protected]0374b292009-08-14 23:49:19182 extra_info.push_back(
[email protected]42197a22010-12-28 23:29:42183 l10n_util::GetStringUTF16(
[email protected]0374b292009-08-14 23:49:19184 IDS_CERT_ERROR_WEAK_SIGNATURE_ALGORITHM_EXTRA_INFO_2));
185 break;
[email protected]aaa20bde2011-12-16 23:27:35186 case CERT_WEAK_KEY:
187 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_WEAK_KEY_TITLE);
188 details = l10n_util::GetStringFUTF16(
189 IDS_CERT_ERROR_WEAK_KEY_DETAILS, UTF8ToUTF16(request_url.host()));
190 short_description = l10n_util::GetStringUTF16(
191 IDS_CERT_ERROR_WEAK_KEY_DESCRIPTION);
192 extra_info.push_back(
193 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_1));
194 extra_info.push_back(
195 l10n_util::GetStringUTF16(
196 IDS_CERT_ERROR_WEAK_KEY_EXTRA_INFO_2));
197 break;
initial.commit09911bf2008-07-26 23:55:29198 case UNKNOWN:
[email protected]42197a22010-12-28 23:29:42199 title = l10n_util::GetStringUTF16(IDS_CERT_ERROR_UNKNOWN_ERROR_TITLE);
200 details = l10n_util::GetStringUTF16(IDS_CERT_ERROR_UNKNOWN_ERROR_DETAILS);
initial.commit09911bf2008-07-26 23:55:29201 short_description =
[email protected]42197a22010-12-28 23:29:42202 l10n_util::GetStringUTF16(IDS_CERT_ERROR_UNKNOWN_ERROR_DESCRIPTION);
initial.commit09911bf2008-07-26 23:55:29203 break;
204 default:
205 NOTREACHED();
206 }
207 return SSLErrorInfo(title, details, short_description, extra_info);
208}
209
210SSLErrorInfo::~SSLErrorInfo() {
211}
212
213// static
214SSLErrorInfo::ErrorType SSLErrorInfo::NetErrorToErrorType(int net_error) {
215 switch (net_error) {
216 case net::ERR_CERT_COMMON_NAME_INVALID:
217 return CERT_COMMON_NAME_INVALID;
218 case net::ERR_CERT_DATE_INVALID:
219 return CERT_DATE_INVALID;
220 case net::ERR_CERT_AUTHORITY_INVALID:
221 return CERT_AUTHORITY_INVALID;
222 case net::ERR_CERT_CONTAINS_ERRORS:
223 return CERT_CONTAINS_ERRORS;
224 case net::ERR_CERT_NO_REVOCATION_MECHANISM:
225 return CERT_NO_REVOCATION_MECHANISM;
226 case net::ERR_CERT_UNABLE_TO_CHECK_REVOCATION:
227 return CERT_UNABLE_TO_CHECK_REVOCATION;
228 case net::ERR_CERT_REVOKED:
229 return CERT_REVOKED;
230 case net::ERR_CERT_INVALID:
231 return CERT_INVALID;
[email protected]0374b292009-08-14 23:49:19232 case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
233 return CERT_WEAK_SIGNATURE_ALGORITHM;
[email protected]aaa20bde2011-12-16 23:27:35234 case net::ERR_CERT_WEAK_KEY:
235 return CERT_WEAK_KEY;
initial.commit09911bf2008-07-26 23:55:29236 default:
237 NOTREACHED();
238 return UNKNOWN;
239 }
240}
241
242// static
243int SSLErrorInfo::GetErrorsForCertStatus(int cert_id,
[email protected]70d66502011-09-23 00:55:08244 net::CertStatus cert_status,
initial.commit09911bf2008-07-26 23:55:29245 const GURL& url,
246 std::vector<SSLErrorInfo>* errors) {
[email protected]70d66502011-09-23 00:55:08247 const net::CertStatus kErrorFlags[] = {
initial.commit09911bf2008-07-26 23:55:29248 net::CERT_STATUS_COMMON_NAME_INVALID,
249 net::CERT_STATUS_DATE_INVALID,
250 net::CERT_STATUS_AUTHORITY_INVALID,
251 net::CERT_STATUS_NO_REVOCATION_MECHANISM,
252 net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
253 net::CERT_STATUS_REVOKED,
[email protected]0374b292009-08-14 23:49:19254 net::CERT_STATUS_INVALID,
[email protected]aaa20bde2011-12-16 23:27:35255 net::CERT_STATUS_WEAK_SIGNATURE_ALGORITHM,
256 net::CERT_STATUS_WEAK_KEY
initial.commit09911bf2008-07-26 23:55:29257 };
258
259 const ErrorType kErrorTypes[] = {
260 CERT_COMMON_NAME_INVALID,
261 CERT_DATE_INVALID,
262 CERT_AUTHORITY_INVALID,
263 CERT_NO_REVOCATION_MECHANISM,
264 CERT_UNABLE_TO_CHECK_REVOCATION,
265 CERT_REVOKED,
[email protected]0374b292009-08-14 23:49:19266 CERT_INVALID,
[email protected]aaa20bde2011-12-16 23:27:35267 CERT_WEAK_SIGNATURE_ALGORITHM,
268 CERT_WEAK_KEY
initial.commit09911bf2008-07-26 23:55:29269 };
270 DCHECK(arraysize(kErrorFlags) == arraysize(kErrorTypes));
271
[email protected]8ac1a752008-07-31 19:40:37272 scoped_refptr<net::X509Certificate> cert = NULL;
initial.commit09911bf2008-07-26 23:55:29273 int count = 0;
[email protected]85e0f1f2008-12-17 18:30:28274 for (size_t i = 0; i < arraysize(kErrorFlags); ++i) {
initial.commit09911bf2008-07-26 23:55:29275 if (cert_status & kErrorFlags[i]) {
276 count++;
277 if (!cert.get()) {
[email protected]b59c6cf02012-03-12 20:51:42278 bool r = content::CertStore::GetInstance()->RetrieveCert(
279 cert_id, &cert);
initial.commit09911bf2008-07-26 23:55:29280 DCHECK(r);
281 }
282 if (errors)
283 errors->push_back(SSLErrorInfo::CreateError(kErrorTypes[i], cert, url));
284 }
285 }
286 return count;
287}