xref: /aosp_15_r20/external/cronet/net/docs/certificate-transparency.md (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Certificate Transparency
2*6777b538SAndroid Build Coastguard Worker
3*6777b538SAndroid Build Coastguard Worker[TOC]
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker## Overview
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard WorkerCertificate Transparency (CT) is a protocol designed to fix several structural
8*6777b538SAndroid Build Coastguard Workerflaws in the SSL/TLS certificate ecosystem. Described in
9*6777b538SAndroid Build Coastguard Worker[RFC 6962](https://tools.ietf.org/html/rfc6962), it provides a public,
10*6777b538SAndroid Build Coastguard Workerappend-only data structure that can log certificates that are issued by
11*6777b538SAndroid Build Coastguard Worker[certificate authorities](https://en.wikipedia.org/wiki/Certificate_authority) (CAs).
12*6777b538SAndroid Build Coastguard WorkerBy logging certificates, it becomes possible for the public to see what
13*6777b538SAndroid Build Coastguard Workercertificates have been issued by a given CA. This allows site operators to
14*6777b538SAndroid Build Coastguard Workerdetect when a certificate has been issued for their domains, allowing them to
15*6777b538SAndroid Build Coastguard Workercheck for unauthorized issuance. It also allows browsers and root stores, and
16*6777b538SAndroid Build Coastguard Workerthe broader community, to examine the certificates a CA has issued and ensure
17*6777b538SAndroid Build Coastguard Workerthat the CA is complying with their expected or disclosed practices.
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard WorkerFor more information about how Certificate Transparency works, see:
20*6777b538SAndroid Build Coastguard Worker  * https://www.certificate-transparency.org
21*6777b538SAndroid Build Coastguard Worker  * [Introducing Certificate Transparency and Nimbus](https://blog.cloudflare.com/introducing-certificate-transparency-and-nimbus/)
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker## Certificate Transparency for Site Operators
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker### Basics
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard WorkerWe say that a certificate supports Certificate Transparency if it comes with
28*6777b538SAndroid Build Coastguard WorkerCT information that demonstrates it has been logged in several CT logs. This
29*6777b538SAndroid Build Coastguard WorkerCT information must comply with the
30*6777b538SAndroid Build Coastguard Worker[Certificate Transparency in Chrome](https://github.com/chromium/ct-policy/blob/master/ct_policy.md)
31*6777b538SAndroid Build Coastguard Workerpolicy. We sometimes refer to a site that "supports" CT as using a certificate
32*6777b538SAndroid Build Coastguard Workerthat is "CT qualified" or "disclosed via CT."
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard WorkerIn general, a site operator does not need to take special action to
35*6777b538SAndroid Build Coastguard Workersupport Certificate Transparency. This is because RFC 6962 defines three ways
36*6777b538SAndroid Build Coastguard Workerof providing the necessary information for CT: within the certificate, within
37*6777b538SAndroid Build Coastguard Workera stapled OCSP response, or directly by the TLS server. Nearly every CA
38*6777b538SAndroid Build Coastguard Workersupports CT through the first method, meaning that when you get a certificate,
39*6777b538SAndroid Build Coastguard Workerit will already support CT and require no further configuration. If you are
40*6777b538SAndroid Build Coastguard Workerusing a cloud provider to terminate your TLS connections, the cloud provider
41*6777b538SAndroid Build Coastguard Workermay also support CT via TLS, requiring no further action on your part.
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard WorkerSupporting CT within the certificate itself is the preferred and recommended
44*6777b538SAndroid Build Coastguard Workerway to enable CT support. If you obtain a certificate from your CA and it does
45*6777b538SAndroid Build Coastguard Workernot support CT, then that generally indicates that your CA is not following
46*6777b538SAndroid Build Coastguard Workerindustry best practice, and you should probably look for another CA to provide
47*6777b538SAndroid Build Coastguard Workercertificates for your sites.
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard WorkerConfiguring support for CT via the TLS extension is not recommended for most
50*6777b538SAndroid Build Coastguard Workersite operators. This is because supporting CT via this method requires
51*6777b538SAndroid Build Coastguard Workerconstant monitoring of the CT ecosystem, such as for changes in the list of
52*6777b538SAndroid Build Coastguard Workertrusted logs or testing compatibility with various CT-supporting clients. This
53*6777b538SAndroid Build Coastguard Workermethod works well for organizations with the ability to dedicate resources to
54*6777b538SAndroid Build Coastguard Workerthat, such as hosting and cloud providers. If you are hosting your own website,
55*6777b538SAndroid Build Coastguard Workeryou should try to ensure that your certificates support CT, and avoid supporting
56*6777b538SAndroid Build Coastguard WorkerCT via the TLS extension. Supporting CT via the TLS extension may require rapid
57*6777b538SAndroid Build Coastguard Workerchanges to your configuration, and thus may be riskier for organizations
58*6777b538SAndroid Build Coastguard Workerwithout staff dedicated to this.
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard WorkerIf you are getting longer-lived certificates (for example, 1 year), it's
61*6777b538SAndroid Build Coastguard Workerpossible that changes in the CT ecosystem may mean that the CT information may
62*6777b538SAndroid Build Coastguard Workerexpire before the certificate expires. If your CA also supports delivering CT
63*6777b538SAndroid Build Coastguard Workervia OCSP responses, then supporting OCSP stapling on your server may allow
64*6777b538SAndroid Build Coastguard Workerfresh CT information to be provided without having to replace the certificate.
65*6777b538SAndroid Build Coastguard WorkerAlternatively, if your server does not support OCSP stapling, or your CA does
66*6777b538SAndroid Build Coastguard Workernot support CT in their OCSP responses, you may need to replace your certificate.
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard WorkerThese policies only apply to publicly-trusted CAs - that is, CAs that your
69*6777b538SAndroid Build Coastguard Workerbrowser or device trust without any additional configuration. For organizations
70*6777b538SAndroid Build Coastguard Workerusing their own CAs, or for locally installed CAs, see
71*6777b538SAndroid Build Coastguard Worker[Certificate Transparency for Enterprises](#Certificate-Transparency-For-Enterprises).
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker### Chrome Policies
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard WorkerChrome has gradually required Certificate Transparency for more and more
76*6777b538SAndroid Build Coastguard Workerpublicly-trusted certificates over the past few years.
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker* [Since 1 January 2015](https://github.com/chromium/ct-policy/blob/master/ct_policy.md),
79*6777b538SAndroid Build Coastguard WorkerChrome has required that all Extended Validation certificates be disclosed via
80*6777b538SAndroid Build Coastguard WorkerCertificate Transparency. Certificates that were not properly disclosed would
81*6777b538SAndroid Build Coastguard Workerbe [stripped of their EV status](https://news.netcraft.com/archives/2015/08/24/thousands-short-changed-by-ev-certificates-that-dont-display-correctly-in-chrome.html),
82*6777b538SAndroid Build Coastguard Workerbut no warnings would be shown to visitors to sites that did not comply.
83*6777b538SAndroid Build Coastguard Worker
84*6777b538SAndroid Build Coastguard Worker* [Since 1 June 2016](https://security.googleblog.com/2015/10/sustaining-digital-certificate-security.html),
85*6777b538SAndroid Build Coastguard WorkerChrome has required that all new certificates issued by the set of root
86*6777b538SAndroid Build Coastguard Workercertificates owned by Symantec Corporation are disclosed via Certificate
87*6777b538SAndroid Build Coastguard WorkerTransparency. Certificates that were not disclosed, or which were not disclosed
88*6777b538SAndroid Build Coastguard Workerin a way consistent with RFC 6962, would be rejected as untrusted.
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker* For all new certificates issued after 30 April 2018, [Chrome will require that
91*6777b538SAndroid Build Coastguard Workerthe certificate be disclosed via Certificate
92*6777b538SAndroid Build Coastguard WorkerTransparency](https://groups.google.com/a/chromium.org/d/msg/ct-policy/wHILiYf31DE/iMFmpMEkAQAJ).
93*6777b538SAndroid Build Coastguard WorkerIf a certificate is issued after this date and neither the certificate nor
94*6777b538SAndroid Build Coastguard Workerthe site supports CT, then these certificates will be rejected as untrusted, and
95*6777b538SAndroid Build Coastguard Workerthe connection will be blocked. In the case of a main page load, the user will
96*6777b538SAndroid Build Coastguard Workersee a full page certificate warning page, with the error code
97*6777b538SAndroid Build Coastguard Worker`net::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED`. If you receive this error, this
98*6777b538SAndroid Build Coastguard Workerindicates that your CA has not taken steps to make sure your certificate
99*6777b538SAndroid Build Coastguard Workersupports CT, and you should contact your CA's sales or support team to ensure
100*6777b538SAndroid Build Coastguard Workeryou can get a replacement certificate that works.
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker### Domain Privacy
103*6777b538SAndroid Build Coastguard Worker
104*6777b538SAndroid Build Coastguard WorkerSupporting CT by disclosing the certificate to a CT Log means that the full
105*6777b538SAndroid Build Coastguard Workercontents of the certificate will be publicly accessible and viewable. In
106*6777b538SAndroid Build Coastguard Workerparticular, this means that the domains a certificate are for will be included
107*6777b538SAndroid Build Coastguard Workerin the Certificate Transparency log, as well as the organization they are
108*6777b538SAndroid Build Coastguard Workeraffiliated with, if they are validated to a level higher than Domain
109*6777b538SAndroid Build Coastguard WorkerValidation or issued from an organization-specific CA.
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard WorkerFor most certificates, this is no different than what is already available.
112*6777b538SAndroid Build Coastguard WorkerPublicly-trusted certificates have been subject to aggregation for public
113*6777b538SAndroid Build Coastguard Workeranalysis for some time, such as through products and tools such as
114*6777b538SAndroid Build Coastguard Worker[Censys](https://censys.io/) or [scans.io](https://scans.io/). While
115*6777b538SAndroid Build Coastguard WorkerCertificate Transparency provides an interoperable protocol for exchanging
116*6777b538SAndroid Build Coastguard Workerthese datasets, in many cases, the certificate details and domains were already
117*6777b538SAndroid Build Coastguard Workerpublicly detectable.
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard WorkerRequiring that the full certificate be disclosed if it was issued by a
120*6777b538SAndroid Build Coastguard Workerpublicly-trusted CA is an important part of the security goals of Certificate
121*6777b538SAndroid Build Coastguard WorkerTransparency. Permitting some of the information to be hidden from
122*6777b538SAndroid Build Coastguard Workercertificates allows for both attackers and untrustworthy CAs to hide
123*6777b538SAndroid Build Coastguard Workercertificates that could be used to compromise users. Certificate Transparency
124*6777b538SAndroid Build Coastguard Workerhas detected issues at a large
125*6777b538SAndroid Build Coastguard Worker[number of CAs](https://wiki.mozilla.org/CA/Incident_Dashboard), many that the
126*6777b538SAndroid Build Coastguard WorkerCAs themselves were not even aware of, and so public disclosure is critical
127*6777b538SAndroid Build Coastguard Workerto keeping all users safe.
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard WorkerWhile proposals for hiding domain names were presented during the development
130*6777b538SAndroid Build Coastguard Workerof Certificate Transparency, none of them were able to balance the needs of
131*6777b538SAndroid Build Coastguard Workersite operators that did not need to hide their domains, those that did, and the
132*6777b538SAndroid Build Coastguard Workersecurity risks that users would face.
133*6777b538SAndroid Build Coastguard Worker
134*6777b538SAndroid Build Coastguard WorkerBecause of this, Chrome does not support any method for hiding domain names or
135*6777b538SAndroid Build Coastguard Workerother information within publicly-trusted certificates, nor are there any plans
136*6777b538SAndroid Build Coastguard Workerto support such mechanisms. Domain operators that wish to hide their
137*6777b538SAndroid Build Coastguard Workercertificates, enabling security risks and attacks, have two options:
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker1. **Wildcard Certificates** - Wildcard certificates allow a single certificate
140*6777b538SAndroid Build Coastguard Worker   to be used for multiple hostnames, by putting a `*` as the most specific
141*6777b538SAndroid Build Coastguard Worker   DNS label (for example, `*.internal.example.com` is valid for
142*6777b538SAndroid Build Coastguard Worker   `mail.internal.example.com` and `wiki.internal.example.com`, but not for
143*6777b538SAndroid Build Coastguard Worker   `www.example.com` or `two.levels.internal.example.com`). Wildcard
144*6777b538SAndroid Build Coastguard Worker   certificates require greater care by the site operator to protect their
145*6777b538SAndroid Build Coastguard Worker   private key, but also can have their issuance controlled via technologies
146*6777b538SAndroid Build Coastguard Worker   such as [CAA (RFC 6844)](https://tools.ietf.org/html/rfc6844). This still
147*6777b538SAndroid Build Coastguard Worker   requires the certificate be disclosed, but can limit how much of the domain
148*6777b538SAndroid Build Coastguard Worker   is disclosed.
149*6777b538SAndroid Build Coastguard Worker2. **Enterprise-specific configuration** - If the domains being accessed are
150*6777b538SAndroid Build Coastguard Worker   not intended to be used on the public internet, or not on machines or by
151*6777b538SAndroid Build Coastguard Worker   users that are not part of a single enterprise, then that enterprise can
152*6777b538SAndroid Build Coastguard Worker   use the options in the
153*6777b538SAndroid Build Coastguard Worker   [Certificate Transparency for Enterprises](#Certificate-Transparency-For-Enterprises).
154*6777b538SAndroid Build Coastguard Worker   This allows the enterprise to not reveal any information about the
155*6777b538SAndroid Build Coastguard Worker   certificate, but these certificates will **only** be trusted by their
156*6777b538SAndroid Build Coastguard Worker   members.
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker### What to do if your certificate does not work
159*6777b538SAndroid Build Coastguard Worker
160*6777b538SAndroid Build Coastguard WorkerAs noted in [Chrome Policies](#Chrome-Policies), all certificates issued after
161*6777b538SAndroid Build Coastguard Worker30 April 2018 are expected to be disclosed via Certificate Transparency in a
162*6777b538SAndroid Build Coastguard Workerway that is compliant with the Certificate Transparency in Chrome policy.
163*6777b538SAndroid Build Coastguard WorkerVirtually all publicly-trusted CAs have committed to supporting CT for their
164*6777b538SAndroid Build Coastguard Workercustomers by default by this date, meaning that site operators should not have
165*6777b538SAndroid Build Coastguard Workerto do anything special and can continue getting certificates that just work on
166*6777b538SAndroid Build Coastguard Worker1 May 2018.
167*6777b538SAndroid Build Coastguard Worker
168*6777b538SAndroid Build Coastguard WorkerHowever, there's still a chance that a CA may not have adopted Certificate
169*6777b538SAndroid Build Coastguard WorkerTransparency, may have an infrastructure issue, or may not have communicated
170*6777b538SAndroid Build Coastguard Workerto their partners, such as resellers or subordinate CAs, to ensure that the
171*6777b538SAndroid Build Coastguard Workertransition would be as smooth as possible for their customers.
172*6777b538SAndroid Build Coastguard Worker
173*6777b538SAndroid Build Coastguard WorkerIf you're receiving a `net::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED` error
174*6777b538SAndroid Build Coastguard Workermessage, the best thing to do is to contact your CA's support or sales team
175*6777b538SAndroid Build Coastguard Workerto diagnose the error with them. They will most likely need to replace your
176*6777b538SAndroid Build Coastguard Workercertificate with a new one that properly supports CT.
177*6777b538SAndroid Build Coastguard Worker
178*6777b538SAndroid Build Coastguard Worker## Certificate Transparency for Enterprises
179*6777b538SAndroid Build Coastguard Worker
180*6777b538SAndroid Build Coastguard Worker### Locally-trusted CAs
181*6777b538SAndroid Build Coastguard Worker
182*6777b538SAndroid Build Coastguard WorkerCertificate Transparency only applies to CAs that are publicly-trusted - that
183*6777b538SAndroid Build Coastguard Workeris, CAs that are supported by your browser or device out of the box, without
184*6777b538SAndroid Build Coastguard Workerany additional configuration steps.
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard WorkerFor CAs that have been manually installed, provided those certificates are not
187*6777b538SAndroid Build Coastguard Workeror have not been publicly-trusted, it's not necessary to enable support for
188*6777b538SAndroid Build Coastguard WorkerCertificate Transparency. Further, Certificate Transparency Logs will not
189*6777b538SAndroid Build Coastguard Workeraccept certificates from those CAs, thus it's not possible to support CT.
190*6777b538SAndroid Build Coastguard Worker
191*6777b538SAndroid Build Coastguard WorkerIn some cases, an Enterprise may have a locally-trusted CA that has been
192*6777b538SAndroid Build Coastguard Workermanually installed, but it was previously publicly-trusted. For example, this
193*6777b538SAndroid Build Coastguard WorkerCA may have been removed by a browser or an OS for not complying with the
194*6777b538SAndroid Build Coastguard Workerroot store policies, but the Enterprise may still have a dependency on
195*6777b538SAndroid Build Coastguard Workertrusting this CA. In these cases, the Enterprise can use
196*6777b538SAndroid Build Coastguard Worker[Enterprise Policies](#Enterprise-Policies) to configure how Certificate
197*6777b538SAndroid Build Coastguard WorkerTransparency will be enforced for those CAs.
198*6777b538SAndroid Build Coastguard Worker
199*6777b538SAndroid Build Coastguard Worker### Private Domain Names
200*6777b538SAndroid Build Coastguard Worker
201*6777b538SAndroid Build Coastguard WorkerFor Enterprises that have domain names that are internal to their organization,
202*6777b538SAndroid Build Coastguard Workerand do not need to be publicly-trusted by default, several options exist to
203*6777b538SAndroid Build Coastguard Workerenable these domains to be kept private, while allowing the certificates to
204*6777b538SAndroid Build Coastguard Workerstill be used, without error, for users in their organization.
205*6777b538SAndroid Build Coastguard Worker
206*6777b538SAndroid Build Coastguard WorkerThe recommended option is to no longer rely on publicly-trusted certificates
207*6777b538SAndroid Build Coastguard Workerto serve these domains, as they are organization specific. For example, such
208*6777b538SAndroid Build Coastguard Workerorganizations can use a private CA, which [several](https://aws.amazon.com/certificate-manager/private-certificate-authority/)
209*6777b538SAndroid Build Coastguard Worker[CAs](https://www.digicert.com/private-pki/) [offer](https://www.comodo.com/business-security/pki-management/certificate-manager.php).
210*6777b538SAndroid Build Coastguard WorkerUsing a hosted, managed PKI may help organizations more rapidly respond to
211*6777b538SAndroid Build Coastguard Workerchange in the TLS ecosystem, such as changes to certificate algorithms or
212*6777b538SAndroid Build Coastguard Workersupport for new protocols.
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard WorkerAnother option is to request that the publicly-trusted CA not log the
215*6777b538SAndroid Build Coastguard Workercertificate. This will prevent this certificate from being trusted by default,
216*6777b538SAndroid Build Coastguard Workerbut organizations that manage their devices or users can override this through
217*6777b538SAndroid Build Coastguard Worker[Enterprise Policies](#Enterprise-Policies) to enable these certificates to be
218*6777b538SAndroid Build Coastguard Workertrusted for users in their Enterprise.
219*6777b538SAndroid Build Coastguard Worker
220*6777b538SAndroid Build Coastguard WorkerFinally, organizations may manage their own PKI in-house, using CA
221*6777b538SAndroid Build Coastguard Workersoftware such as [CFSSL](https://github.com/cloudflare/cfssl), [Boulder](https://github.com/letsencrypt/boulder),
222*6777b538SAndroid Build Coastguard Worker[EJBCA](https://www.ejbca.org/) or
223*6777b538SAndroid Build Coastguard Worker[Active Directory Certificate Services](https://msdn.microsoft.com/en-us/library/ff630887.aspx).
224*6777b538SAndroid Build Coastguard WorkerManaging certificates in-house may be more complex and security risky, but
225*6777b538SAndroid Build Coastguard Workeroffers an alternative solution to partnering with a certificate provider.
226*6777b538SAndroid Build Coastguard Worker
227*6777b538SAndroid Build Coastguard Worker### Legacy CAs
228*6777b538SAndroid Build Coastguard Worker
229*6777b538SAndroid Build Coastguard WorkerSome Enterprises rely on Certificate Authorities that have not been audited to
230*6777b538SAndroid Build Coastguard Workerthe same standard as other CAs or been operated to the same security
231*6777b538SAndroid Build Coastguard Workerrequirements. These CAs would not be trusted in new products, nor other root
232*6777b538SAndroid Build Coastguard Workerprograms, but may be trusted on one or more platforms that Chrome runs on.
233*6777b538SAndroid Build Coastguard WorkerBecause they are trusted by default, they are subject to the Chrome's policies
234*6777b538SAndroid Build Coastguard Workeron requiring CT, but due to their legacy status, may not be prepared. While the
235*6777b538SAndroid Build Coastguard Workerrequirement to disclose new certificates via Certificate Transparency has been
236*6777b538SAndroid Build Coastguard Workercommunicated, some may not do so, causing their new certificates to not be
237*6777b538SAndroid Build Coastguard Workertrusted. This is most common with CAs run by governments, as they rarely meet the
238*6777b538SAndroid Build Coastguard Workerrequired security standards of a widely-trusted CA.
239*6777b538SAndroid Build Coastguard Worker
240*6777b538SAndroid Build Coastguard WorkerOrganizations that need to use certificates from these CAs should be aware
241*6777b538SAndroid Build Coastguard Workerthat their certificates will not be trusted if they do not support CT, and so
242*6777b538SAndroid Build Coastguard Workershould look for CAs that do support CT. Alternatively, supporting CT via TLS
243*6777b538SAndroid Build Coastguard Workermay be the only way to ensure these certificates continue to work, but that
244*6777b538SAndroid Build Coastguard Workerrequires the Enterprise constantly keep track of changes regarding Certificate
245*6777b538SAndroid Build Coastguard WorkerTransparency.
246*6777b538SAndroid Build Coastguard Worker
247*6777b538SAndroid Build Coastguard WorkerOrganizations that need to trust certificates from these CAs, such as when
248*6777b538SAndroid Build Coastguard Workertalking to other organizations that need to use these CAs, can configure
249*6777b538SAndroid Build Coastguard Worker[Enterprise Policies](#Enterprise-Policy) for users in their organization,
250*6777b538SAndroid Build Coastguard Workerwhich will allow trust in these certificates. As these only apply to Enterprise
251*6777b538SAndroid Build Coastguard Workerusers, these policies are not suitable for making these certificates trusted
252*6777b538SAndroid Build Coastguard Workermore widely.
253*6777b538SAndroid Build Coastguard Worker
254*6777b538SAndroid Build Coastguard Worker### Enterprise Policies
255*6777b538SAndroid Build Coastguard Worker
256*6777b538SAndroid Build Coastguard WorkerSeveral Chrome-specific policies exist that allow Enterprises to configure
257*6777b538SAndroid Build Coastguard Workertheir machines or users to disable Certificate Transparency for certain cases.
258*6777b538SAndroid Build Coastguard WorkerThese policies are documented in the
259*6777b538SAndroid Build Coastguard Worker[master policy list](https://cloud.google.com/docs/chrome-enterprise/policies),
260*6777b538SAndroid Build Coastguard Workerbut detailed further below.
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker#### CertificateTransparencyEnforcementDisabledForUrls
263*6777b538SAndroid Build Coastguard Worker
264*6777b538SAndroid Build Coastguard WorkerThis [policy](https://cloud.google.com/docs/chrome-enterprise/policies/?policy=CertificateTransparencyEnforcementDisabledForUrls)
265*6777b538SAndroid Build Coastguard Workerhas been available since Chrome 53, and allows for disabling Certificate
266*6777b538SAndroid Build Coastguard WorkerTransparency enforcement for a certain set of domains or subdomains, without
267*6777b538SAndroid Build Coastguard Workerdisabling Certificate Transparency altogether.
268*6777b538SAndroid Build Coastguard Worker
269*6777b538SAndroid Build Coastguard WorkerIf you wish to disable CT for a given hostname, and all of its subdomains, then
270*6777b538SAndroid Build Coastguard Workerthe domain is simply entered into the list. For example, `example.com` will
271*6777b538SAndroid Build Coastguard Workerdisable CT for `example.com` and all subdomains.
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard WorkerIf you wish to disable CT only for a given hostname, but wish to ensure that
274*6777b538SAndroid Build Coastguard Workersubdomains will still have CT enabled, then prefix the domain with a leading
275*6777b538SAndroid Build Coastguard Workerdot. For example, `.example.com` will disable CT for `example.com` exactly,
276*6777b538SAndroid Build Coastguard Workerwhile leaving it enabled for subdomains.
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker#### CertificateTransparencyEnforcementDisabledForCas
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard WorkerThis [policy](https://cloud.google.com/docs/chrome-enterprise/policies/?policy=CertificateTransparencyEnforcementDisabledForCas),
281*6777b538SAndroid Build Coastguard Workeravailable since Chrome 57, allows for disabling Certificate Transparency
282*6777b538SAndroid Build Coastguard Workerenforcement if certain conditions are met in the trusted certificate chain.
283*6777b538SAndroid Build Coastguard WorkerThis allows disabling CT without having to list all of the domain names, but
284*6777b538SAndroid Build Coastguard Workeronly for certificates issued to a specific organization.
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard WorkerCertificates are specified in this policy by applying Base64 to a hash of their
287*6777b538SAndroid Build Coastguard WorkersubjectPublicKeyInformation, as well as specifying the hash algorithm used.
288*6777b538SAndroid Build Coastguard WorkerThis format is very similar to that used by
289*6777b538SAndroid Build Coastguard Worker[HTTP Public Key Pinning](https://tools.ietf.org/html/rfc7469) (HPKP), so that
290*6777b538SAndroid Build Coastguard Workersites can use the same [examples](https://tools.ietf.org/html/rfc7469#appendix-A)
291*6777b538SAndroid Build Coastguard Workeror [tools](https://report-uri.com/home/pubkey_hash) used to generate HPKP
292*6777b538SAndroid Build Coastguard Workerhashes to determine how to configure the policy. Note that while both use
293*6777b538SAndroid Build Coastguard WorkerBase64, an HPKP hash will be in the form `pin-sha256="hash"`, while the policy
294*6777b538SAndroid Build Coastguard Workerwill be in the form `sha256/hash`.
295*6777b538SAndroid Build Coastguard Worker
296*6777b538SAndroid Build Coastguard WorkerTo disable Certificate Transparency for these certificates, the certificate
297*6777b538SAndroid Build Coastguard Workermust match one of the following conditions:
298*6777b538SAndroid Build Coastguard Worker
299*6777b538SAndroid Build Coastguard Worker1. The hash specified is of the server certificate's subjectPublicKeyInfo.
300*6777b538SAndroid Build Coastguard Worker2. The hash specified is of an intermediate CA, and that intermediate CA has
301*6777b538SAndroid Build Coastguard Worker   a nameConstraints extension with one or more directoryNames in the
302*6777b538SAndroid Build Coastguard Worker   permittedSubtrees of that extension.
303*6777b538SAndroid Build Coastguard Worker3. The hash specified is of an intermediate CA, that intermediate CA contains
304*6777b538SAndroid Build Coastguard Worker   one or more organizationName (O) attribute in the subject, and the server
305*6777b538SAndroid Build Coastguard Worker   certificate's has the same number of organizationName attributes, with
306*6777b538SAndroid Build Coastguard Worker   byte-for-byte identical values, in the same exact order.
307*6777b538SAndroid Build Coastguard Worker
308*6777b538SAndroid Build Coastguard Worker#### CertificateTransparencyEnforcementDisabledForLegacyCas
309*6777b538SAndroid Build Coastguard Worker
310*6777b538SAndroid Build Coastguard WorkerThis [policy](https://cloud.google.com/docs/chrome-enterprise/policies/?policy=CertificateTransparencyEnforcementDisabledForLegacyCas),
311*6777b538SAndroid Build Coastguard Workeravailable since Chrome 67, allows for disabling Certificate Transparency
312*6777b538SAndroid Build Coastguard Workerenforcement for certain legacy CAs that have not adopted modern security and
313*6777b538SAndroid Build Coastguard Workeraudit requirements required of publicly-trusted CAs. This is particularly
314*6777b538SAndroid Build Coastguard Workertailored towards CAs that are trusted on some platforms that Chrome runs on,
315*6777b538SAndroid Build Coastguard Workerbut are not trusted on ChromeOS or Android, due to not meeting the necessary
316*6777b538SAndroid Build Coastguard Workersecurity requirements.
317*6777b538SAndroid Build Coastguard Worker
318*6777b538SAndroid Build Coastguard WorkerCAs are specified in this policy by applying Base64 to a hash of their
319*6777b538SAndroid Build Coastguard WorkersubjectPublicKeyInformation, the same as in
320*6777b538SAndroid Build Coastguard Worker[CertificateTransparencyEnforcementDisabledForCAs](#CertificateTransparencyEnforcementDisabledForCas).
321*6777b538SAndroid Build Coastguard WorkerHowever, these CAs must also be recognized as Legacy CAs in the
322*6777b538SAndroid Build Coastguard Worker[`/net/data/ssl/root_stores/root_stores.json`](/net/data/ssl/root_stores/root_stores.json)
323*6777b538SAndroid Build Coastguard Workerfile, which means that they are not trusted on ChromeOS or Android, but are
324*6777b538SAndroid Build Coastguard Workertrusted on another platform that Chrome runs on.
325*6777b538SAndroid Build Coastguard Worker
326*6777b538SAndroid Build Coastguard WorkerThis policy is the riskiest of the three Enterprise policies, in that such
327*6777b538SAndroid Build Coastguard Workerlegacy CAs can represent the greatest security threat to an organization, as
328*6777b538SAndroid Build Coastguard Workerthey lack either the audits or compliance with industry best practice and root
329*6777b538SAndroid Build Coastguard Workerstore requirements. Enterprises should only enable this policy if no other
330*6777b538SAndroid Build Coastguard Workeroption meets their needs.
331*6777b538SAndroid Build Coastguard Worker
332*6777b538SAndroid Build Coastguard Worker## Certificate Transparency for Chrome/Chromium developers
333*6777b538SAndroid Build Coastguard Worker
334*6777b538SAndroid Build Coastguard Worker### //net Interfaces
335*6777b538SAndroid Build Coastguard Worker
336*6777b538SAndroid Build Coastguard WorkerSupport for Certificate Transparency in //net is made up of two core
337*6777b538SAndroid Build Coastguard Workerinterfaces:
338*6777b538SAndroid Build Coastguard Worker
339*6777b538SAndroid Build Coastguard Worker* [`CTVerifier`](/net/cert/ct_verifier.h): Responsible for extracting the
340*6777b538SAndroid Build Coastguard Worker  CT information (SCTs) from the certificate, the OCSP response, and the
341*6777b538SAndroid Build Coastguard Worker  TLS handshake, validating the signatures against a set of known/configured
342*6777b538SAndroid Build Coastguard Worker  CT logs, and validating that the SCTs match the certificate provided.
343*6777b538SAndroid Build Coastguard Worker* [`CTPolicyEnforcer`](/net/cert/ct_policy_enforcer.h): Responsible for
344*6777b538SAndroid Build Coastguard Worker  taking the extracted, verified SCTs and applying
345*6777b538SAndroid Build Coastguard Worker  application/embedder-specific policies to determine whether the SCTs are
346*6777b538SAndroid Build Coastguard Worker  "good enough" (meet application requirements).
347*6777b538SAndroid Build Coastguard Worker
348*6777b538SAndroid Build Coastguard WorkerIn addition to these two core classes, configuration and support for CT-related
349*6777b538SAndroid Build Coastguard Workerbehaviours is expressed via the
350*6777b538SAndroid Build Coastguard Worker[`TransportSecurityState`](/net/http/transport_security_state.h). The
351*6777b538SAndroid Build Coastguard Worker`TransportSecurityState` has methods for exposing support and policies for
352*6777b538SAndroid Build Coastguard Worker[`Expect-CT`](https://tools.ietf.org/html/draft-ietf-httpbis-expect-ct) and
353*6777b538SAndroid Build Coastguard Workerfor embedder-specific overrides via the
354*6777b538SAndroid Build Coastguard Worker`TransportSecurityState::RequireCTDelegate`.
355*6777b538SAndroid Build Coastguard Worker
356*6777b538SAndroid Build Coastguard Worker### Supporting Certificate Transparency for Embedders
357*6777b538SAndroid Build Coastguard Worker
358*6777b538SAndroid Build Coastguard WorkerWhile Chromium has implemented support for Certificate Transparency for a
359*6777b538SAndroid Build Coastguard Workernumber of years, it would not block connections unless there was a known
360*6777b538SAndroid Build Coastguard Workersecurity issue. For example, certificates that were intended to be EV, but
361*6777b538SAndroid Build Coastguard Workerwere not disclosed properly, simply would have their EV status removed, while
362*6777b538SAndroid Build Coastguard Workerthe connection should still continue.
363*6777b538SAndroid Build Coastguard Worker
364*6777b538SAndroid Build Coastguard WorkerHowever, as Google Chrome looks to roll out a more rigorous enforcement of
365*6777b538SAndroid Build Coastguard WorkerCertificate Transparency, by enforcing that newly-issued certificates are
366*6777b538SAndroid Build Coastguard Workerdisclosed as a condition of being trusted, the risks to the CA and CT
367*6777b538SAndroid Build Coastguard Workerecosystem significantly increase if embedders implement CT without the ability
368*6777b538SAndroid Build Coastguard Workerfor reliable, rapid updates, keeping track with ongoing development in the
369*6777b538SAndroid Build Coastguard Workermain tree and reliably delivering security updates on the same cadence as
370*6777b538SAndroid Build Coastguard WorkerChromium branches and Google Chrome releases.
371*6777b538SAndroid Build Coastguard Worker
372*6777b538SAndroid Build Coastguard WorkerFor this reason, the CT implementation is undergoing a refactoring to reduce
373*6777b538SAndroid Build Coastguard Workerthose risks through code and implementation. As a result, Chromium embedders
374*6777b538SAndroid Build Coastguard Workerwill **NOT** have CT enforcement enabled by default, and are **NOT** encouraged
375*6777b538SAndroid Build Coastguard Workerto manually enable it at this time.
376*6777b538SAndroid Build Coastguard Worker
377*6777b538SAndroid Build Coastguard WorkerDistributors of products that embed Chromium sources are encouraged to
378*6777b538SAndroid Build Coastguard Workerparticipate in the
379*6777b538SAndroid Build Coastguard Worker[[email protected]](https://groups.google.com/a/chromium.org/forum/#!forum/ct-policy)
380*6777b538SAndroid Build Coastguard Workerdiscussion group, which involves a variety of stakeholders in the CT ecosystem
381*6777b538SAndroid Build Coastguard Workerfor discussing matters of policy and implementation, in order to understand
382*6777b538SAndroid Build Coastguard Workerthe risks and participate in solutions. Face-to-face summits are periodically
383*6777b538SAndroid Build Coastguard Workerheld to gather key stakeholders together to work through these issues, helping
384*6777b538SAndroid Build Coastguard Workerroot programs, CAs, log operators, and the overall PKI community develop
385*6777b538SAndroid Build Coastguard Workerconsistent, interoperable, secure, and reliable policies and implementations.
386