1) Chrome gets the URL for the request, pulls out the host out of the
url[*], opens a connection, and gets the cert chain
2) It passes the chain and host[**] to the cert validator, which is
normally part of the OS
3) If the validator passes, it returns the chain that validated. If
the validator fails, do not load page && GOTO END
4) Chrome checks the CertificateTransparencyEnforcementDisabledForUrls
administrative policy value to determine if the host matches the
administrative policy. This administrative policy can contain
hostname suffixes, for example it can have "example.com", which would
match "foo.ber.example.com". If there is a match then, CT is not
required && GOTO END
5) Chrome checks the Expect-CT list. If the host matches an entry in
the Expect-CT list, CT is required && GOTO END
6) Chrome iterates over a CT ruleset. For each rule in the ruleset:
6a) Chrome iterates of a list of public key hashes that are required
to have CT. If the hash matches any key found in the chain returned
by the validator and the notBefore date of the end certificate is
after the date associated with the hash go to 6b. Otherwise go to
next rule (repeat this step until out of rules; go to 7 if out of
rules)
6b) Chrome iterates of a list of public key hashes that are excluded
from a CT requirement. If the hash matches any key found in the chain
returned by the validator, then CT is not required && GOTO END.
Otherwise, CT is required && GOTO END
7) Do not require CT
Questions:
1) Did I describe this accurately?
2) Is the intent that, when CT is required for all public roots, that
the hash list for #6a will be all trusted roots and #6b will be empty?
Put another way, #7 will not be changing, right?
3) The policy documentation for
CertificateTransparencyEnforcementDisabledForUrls does not indicate it
is supported on Android System WebView (Android) or Google Chrome
(iOS). What is the plan to resolve this so that all managed devices
have similar capabilities for configuration?
4) https://support.google.com/chrome/a/answer/187202 describes the
Chrome policy model. It notes that policies are available via the
admin console for Chrome OS and available via the G Suite admin
console. I'm unable to find the
CertificateTransparencyEnforcementDisabledForUrls policy in the admin
console. How does one set the policy for Chromebooks and managed
Chrome users?
Because CT is required only when a chain contains a known public key,
anchors added to the local trust store do not require CT. This aligns
with what has been previously stated.
However in testing we have
found that this sometimes depends on OS. Specifically, if the CA
added to the trust list has a cross-certificate from a public CA (for
example GIA G2), then it becomes OS (and sometimes OS version)
dependent on whether CT is required or not. This is because different
certificate validation libraries have different path building rules.
Some use the longest trusted path, some the shortest, and others use
more complex logic.
5) We think that it makes sense to add an administrative policy that
allows specifying public key hashes to exclude from CT expectations.
This way a specific subordinate CA can be excluded and work the same
on all Chrome platforms. It also solves the problem of having to list
hundreds or thousands of domains; instead of listing each registered
domain, the administrator can list the specific issuer key. Can
Chrome add an administrative policy for this?
None of the current options provide any method of public opt-out for
CT by domain registrants. A number of proposals have been suggested
over time, but none have hit the mark. While I still don't know the
full right answer, I would like to propose an option that I think is
limited enough to assuage many concerns but also broad enough to
provide value. Chrome already supports public key pinning and name
constrained CAs. We would like to propose that pins that
includeSubDomains can also include an expect-ct directive. When set
to false, this directive tells the browser to not expect CT for
subdomains. This directive would only be honored if the pin matches a
key that is determined by the browser to be name constrained. This
allows a domain owner to clearly indicate that CT should not be
expected for a domain namespace.
6) Does Chrome see enough value in this proposal that we should bring
it to the IETF TRANS WG?
4) Chrome determines whether or not the certificate chain validated to a 'publicly trusted root'. The mechanism of this varies per platform, and can result in different results for the same keys under some situations, but effectively attempts to distinguish whether or not the certificate was one hardcoded as trusted by the underlying platform. If so, it applies a number of secondary checks to the certificate.
5) Chrome evaluates the CT compliance status on two independent axis - compliant with the DV policy and compliant with the EV policy. The substantive difference between these two mechanisms is that the EV policy is allowed to use a whitelist (the pre-2015 whitelist), while the DV policy is not (no whitelist). Both compliance statuses are measured and independent.6) If the certificate was not compliant with the EV policy, Chrome masks off any EV status trust bits.7) If the certificate was not compliant with the DV policy (... and the build is timely), the network stack asks a configurable policy layer about whether or not CT should be required, providing the hostname and validated certificate chain. The policy object provides the following7a) A secondary policy object, which is connected to enterprise policy, examines the hostname against the CertificateTransparencyEnforcement[Enabled/Disabled]ForUrls. Yes, there's actually two policies provided (one can only be set via command-line flag or preferences, for now). If either an affirmative or negative response is received, it's used. As noted in the policy description, these policies use the URL Blacklist filter format, with the special provision of forbidding wildcards - requiring you to explicitly specify domain trees.7b) Chrome has a list of "CT policies". We examine each policy (in no particular order, and)7b1) If the policy isn't 'effective' for the leaf cert's validity period, skip [This is subject to change, since I just noticed a bug that comes from this logic]7b2) If any SPKI hash from the verified certificate chain matches, and no _excluded_ SPKI hashes match, return that CT is required7c) Fall back to default processing (do not require CT)8) If CT was required (from Step #7, this is only examined for non-compliant certs), fail validationQuestions:
1) Did I describe this accurately?No, the inversion of the logic bits is important to highlight, so hopefully the above helps.
2) Is the intent that, when CT is required for all public roots, that
the hash list for #6a will be all trusted roots and #6b will be empty?
Put another way, #7 will not be changing, right?No, #7 does change - the default changes to "do require CT", and new code will be introduced to make use of the information from #4. To be clear: This means that, today, CT _is_ checked for all certificate validations in Chrome. (We even had a flag for a while that let you specify your own enterprise CT logs, we removed it for now, who knows, we might reintroduce it)3) The policy documentation for
CertificateTransparencyEnforcementDisabledForUrls does not indicate it
is supported on Android System WebView (Android) or Google Chrome
(iOS). What is the plan to resolve this so that all managed devices
have similar capabilities for configuration?There is none at this time.
4) https://support.google.com/chrome/a/answer/187202 describes the
Chrome policy model. It notes that policies are available via the
admin console for Chrome OS and available via the G Suite admin
console. I'm unable to find the
CertificateTransparencyEnforcementDisabledForUrls policy in the admin
console. How does one set the policy for Chromebooks and managed
Chrome users?Thanks for highlighting this. I'll need to get back to you on it, but it looks like an unintentional oversight in allowing the full robustness of ChromeOS policies. We've not had any customer request this, but this is a useful aspect to consider.
Because CT is required only when a chain contains a known public key,
anchors added to the local trust store do not require CT. This aligns
with what has been previously stated.See above as to why this conclusion isn't quite right.However in testing we have
found that this sometimes depends on OS. Specifically, if the CA
added to the trust list has a cross-certificate from a public CA (for
example GIA G2), then it becomes OS (and sometimes OS version)
dependent on whether CT is required or not. This is because different
certificate validation libraries have different path building rules.
Some use the longest trusted path, some the shortest, and others use
more complex logic.Correct, the answer includes a degree of variance depending on how the underlying platform both constructs certificate chains and evaluates trust anchors, and then reports these back to Chrome. Aligning these behaviours across platforms is very much a goal of the Chrome Networking Security team.
5) We think that it makes sense to add an administrative policy that
allows specifying public key hashes to exclude from CT expectations.
This way a specific subordinate CA can be excluded and work the same
on all Chrome platforms. It also solves the problem of having to list
hundreds or thousands of domains; instead of listing each registered
domain, the administrator can list the specific issuer key. Can
Chrome add an administrative policy for this?It was an intentional decision not to allow this functionality.
None of the current options provide any method of public opt-out for
CT by domain registrants. A number of proposals have been suggested
over time, but none have hit the mark. While I still don't know the
full right answer, I would like to propose an option that I think is
limited enough to assuage many concerns but also broad enough to
provide value. Chrome already supports public key pinning and name
constrained CAs. We would like to propose that pins that
includeSubDomains can also include an expect-ct directive. When set
to false, this directive tells the browser to not expect CT for
subdomains. This directive would only be honored if the pin matches a
key that is determined by the browser to be name constrained. This
allows a domain owner to clearly indicate that CT should not be
expected for a domain namespace.I'm not sure I understand this proposal sufficiently to comment-on it. Are you proposing adding this as a directive to HPKP? I'm not sure we'd be supportive of this, but it's very likely I've misunderstood the proposal
4) Chrome determines whether or not the certificate chain validated to a 'publicly trusted root'. The mechanism of this varies per platform, and can result in different results for the same keys under some situations, but effectively attempts to distinguish whether or not the certificate was one hardcoded as trusted by the underlying platform. If so, it applies a number of secondary checks to the certificate."If so, ..." implies that processing stops here if Chrome determines that it did not validate to a 'publicly trusted root'. Is that right?
3) The policy documentation for
CertificateTransparencyEnforcementDisabledForUrls does not indicate it
is supported on Android System WebView (Android) or Google Chrome
(iOS). What is the plan to resolve this so that all managed devices
have similar capabilities for configuration?There is none at this time.I would encourage Chrome to consider this a blocker for changing the 7c default to true for these platforms. Mobile device management exists and is widely deployed. As you wrote on IETF TRANS, and in other places, Law #6: A computer is only as secure as the administrator is trustworthy (from Ten Immutable Laws Of Security) implies that trying to control around the administrator is a futile task.
4) https://support.google.com/chrome/a/answer/187202 describes the
Chrome policy model. It notes that policies are available via the
admin console for Chrome OS and available via the G Suite admin
console. I'm unable to find the
CertificateTransparencyEnforcementDisabledForUrls policy in the admin
console. How does one set the policy for Chromebooks and managed
Chrome users?Thanks for highlighting this. I'll need to get back to you on it, but it looks like an unintentional oversight in allowing the full robustness of ChromeOS policies. We've not had any customer request this, but this is a useful aspect to consider.As with the prior item, I would encourage Chrome to consider this a blocker for changing the 7c default to true. Customers have likely not requested this in part because CT is only required for one CA operator today. I'm sure that many customers solved the CT "problem" by getting certificates from another CA rather than trying to set non-existent policy options.
Correct, the answer includes a degree of variance depending on how the underlying platform both constructs certificate chains and evaluates trust anchors, and then reports these back to Chrome. Aligning these behaviours across platforms is very much a goal of the Chrome Networking Security team.As with the prior items, I would encourage Chrome to consider this a blocker for changing the 7c default to true. Having mixed behaviour is going to drive Chrome users, web site operators, and help desk technicians nuts and provide a very poor customer experience.
Can you clarify why? Given the request for an administrative policy and Law #6 (see above), I'm failing to see the reasoning. The administrator could hot patch Chrome, a la certain AV, to change the exclusion lists. Why not allow them to set a policy for it?
I'm not sure I understand this proposal sufficiently to comment-on it. Are you proposing adding this as a directive to HPKP? I'm not sure we'd be supportive of this, but it's very likely I've misunderstood the proposalYes, adding a directive to HPKP that says "only trust these PINs and if they pass don't require CT". I suggested only obeying this directive if the pin also matched a name constrained node in the graph of certificates and subjects, but that was a suggestion to further constrain the exclusion rules.
(I'm trimming this follow up to only address administrator configured policy)
On Fri, Mar 10, 2017 at 3:42 PM, Ryan Sleevi <rsl...@chromium.org> wrote:
>
>
> On Fri, Mar 10, 2017 at 6:28 PM, Peter Bowen <pzb...@gmail.com> wrote:
>>>
>>> 4) Chrome determines whether or not the certificate chain validated to a
>>> 'publicly trusted root'. The mechanism of this varies per platform, and can
>>> result in different results for the same keys under some situations, but
>>> effectively attempts to distinguish whether or not the certificate was one
>>> hardcoded as trusted by the underlying platform. If so, it applies a number
>>> of secondary checks to the certificate.
>>
>>
>> "If so, ..." implies that processing stops here if Chrome determines that
>> it did not validate to a 'publicly trusted root'. Is that right?
>
>
> Nope. It continues, but just without the secondary checks from #4 applied.
"secondary checks" meaning the DV rules? (#4 is a little ambiguous at
this point)
Just so there is not confusion, are you saying Chrome on iOS is not
part of the announced CT-for-all plan -- Chrome on iOS will not check
implement CT checks?
> As for Android, I would just say its security model values application
> developers having control, even in the face of device owners. You can see
> this very clearly in Android's policies related to CA certificate
> installation - app developers trump mobile device managers with respect to
> installing custom roots.
What is the CT policy going to be for WebView in the announced CT-for-all plan?
The biggest driver for this is organizations with hundreds, or even
thousands, of domains. They can exempt a specific subordinate CA
(e.g. one for their exclusive use, a la GIA G2) rather than pushing
policy with thousands of domains. It also gives domain owners more
assurance over the exclusion -- it means that only their designed
issuer is exempt rather than exempting all issuers. So unlogged certs
from a different issuer will not work.
I think offering domain and public key (e.g. issuer) options are
important alternatives for administrators.
certificate that matches the public key hash? For example requireWhat about combing such an option with some requirements on the
that it not be a trust anchor.
Or the requirement could be that the
certificate be a CA certificate with a name constraint extension that
has at least one directoryName in the permittedSubtrees and the CA
certificate be publicly logged.
Or create a new extension that is
used to declare the CA certificate as being the equivalent of a ICANN
spec9 or spec13 gTLD -- only for use by a defined group. Or require
some combination of these.
> I'm very careful here about the risk such a control would offer - the number
> of organizations with thousands of domains is likely a very small (by
> percentage) population of those who might use enterprise policies, but the
> risk afforded by a smaller organization with only one or two domains setting
> such a configuration would be very large. The only way to truly mitigate
> that is to ensure there is _no_ public trust anchor in the path before
> allowing such a configuration option to be offered - while the administrator
> needs to be trusted if they are to administer the machine, we should not
> make it unduly complex or dangerous for them to do so.
Given the variability of path building across platforms, the only way
today to "ensure there is _no_ public trust anchor in the path" is to
use a locally trusted CA that is completely outside the WebPKI graph.
Given that these are already excluded from the CT requirement, this
isn't a very interesting case to discuss.
> Hopefully I got it right this time, and if so, apologies for being so dense.
> And if not, also apologies for being so dense, and let's see where I messed
> up.
I think you got it right!
Hi,
I've found this thread's dialogue very helpful - thanks for the discussion.
I was wondering if someone in the Group could please help me better understand the new CertificateTransparencyEnforcementDisabledForLegacyCas policy, a configuration that I believe materialized as a result of the discussion earlier in the thread between Ryan and Peter.
I was attempting to test the new policy configuration with https://fpki-graph.fpki-lab.gov/, a site which I know can chain to the USG's Federal Common Policy CA (COMMON) or IdenTrust Public Sector Root CA 1. I figured this would give me two chances of confirming the policy (once for each root), as both of the chaining Root SPKIs exist in root_stores.json. I am using Canary Version 67.0.3394.0.
Root SPKIs in Question:8E8B56F5918A25BD85DCE76663FD94CC23690F10EA9586613171C6F8378890D5 (COMMON) 58DD61FEB36EA7D258724371709149CB121337864CACB2D0999AD20739D06477 (IdenTrust Public Sector Root CA 1)
Targeted Registry Configurations:[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\CertificateTransparencyEnforcementDisabledForLegacyCas] "1"="sha256/8E8B56F5918A25BD85DCE76663FD94CC23690F10EA9586613171C6F8378890D5" "2"="sha256/58DD61FEB36EA7D258724371709149CB121337864CACB2D0999AD20739D06477"
When navigating to chrome://policy/ in Canary, the CertificateTransparencyEnforcementDisabledForLegacyCas policy appears with a Status of OK and Policy Value of sha256/8E8B56F5918A25BD85DCE76663FD94CC23690F10EA9586613171C6F8378890D5,sha256/58DD61FEB36EA7D258724371709149CB121337864CACB2D0999AD20739D06477,which appears to be consistent with the expected configuration.
That said, despite when browsing to the FPKI graph and chaining to either of the SPKI values listed above, I still get hit with the NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED error.I have not seen the new configuration posted to the Chrome Policies page, which appears to be last updated for Chrome 67.0.3364.0, so it is very possible my configuration is incorrect.
On Mon, Apr 16, 2018 at 9:06 AM, Ryan Dickson <ryan.d...@gmail.com> wrote:Hi,
I've found this thread's dialogue very helpful - thanks for the discussion.
I was wondering if someone in the Group could please help me better understand the new CertificateTransparencyEnforcementDisabledForLegacyCas policy, a configuration that I believe materialized as a result of the discussion earlier in the thread between Ryan and Peter.
I was attempting to test the new policy configuration with https://fpki-graph.fpki-lab.gov/, a site which I know can chain to the USG's Federal Common Policy CA (COMMON) or IdenTrust Public Sector Root CA 1. I figured this would give me two chances of confirming the policy (once for each root), as both of the chaining Root SPKIs exist in root_stores.json. I am using Canary Version 67.0.3394.0.
Root SPKIs in Question:8E8B56F5918A25BD85DCE76663FD94CC23690F10EA9586613171C6F8378890D5 (COMMON) 58DD61FEB36EA7D258724371709149CB121337864CACB2D0999AD20739D06477 (IdenTrust Public Sector Root CA 1)