I’ve commented inline about these discussion.
I’ve also prepared a set of diffs to help bring clarity as per the discussion.
The diffs are in this branch:
https://github.com/anima-wg/anima-bootstrap/commit/bec6d97207aa8faaa600d60622c9b4650ee04934
> On Sep 7, 2017, at 9:19 AM, Michael Richardson <[email protected]> wrote:
>
>
> Max Pritikin (pritikin) <[email protected]> wrote:
>> The voucher-request has this additional requirement:
>
>> s3.3 of BRSKI-07,
>> The request is a "YANG-defined JSON
>> document that has been signed using a PKCS#7 structure" as
>> described in [I-D.ietf-anima-voucher] using the JSON encoded
>> described in [RFC7951]. The Registrar MUST sign the request. The
>> entire Registrar certificate chain, up to and including the Domain
>> CA, MUST be included in the PKCS#7 structure.
>
> I feel dumb, because I was sure that I looked for such a sentence, and I
> didn't find it. Good that it is there.
>
>>> In a signed voucher request from the pledge to the registrar the
>>> pinned-domain-cert is that of the *PLEDGE* (signed with it's IDevID).
>
>> Actually this pinned-domain-cert is thus, from s3.2 of BRSKI-07,
>
>> pinned-domain-cert: In a Pledge voucher request this is the
>> Registrar certificate as extracted from the TLS handshake (for
>> example the first certificate in the TLS 'certificate_list'
>> sequence (see [RFC5246]). This MUST be populated in a Pledge's
>> voucher request if the "proximity" assertion is populated.
>
> Huh, this is actually surprising...
> I guess we need the Registrar to keep the same thing there, and really the
> voucher *HAS* to be issued for this key in order for the Pledge to get out of
> provisional state…
The registrar “keeps” this field by populating the prior-signed-voucher-request
(also preserving the Pledges signature over the proximity assertion).
>
>> I was wondering earlier today if this was confusing. We could add a
>> leaf for “tls-domain-cert” or something. An additional point is that
>> the *assumption* is that this is the same cert as the id-kp-cmcRA cert
>> in the chain discussed above and in s3.3 but maybe that is an
>> assumption too far and we should support bags of certs and arbitrary
>> complexity? I’m tired of this PKI mess.
>
> Yes, that's an assumption.
> The *VOUCHER* that results has to match the certificate in the TLS.
> So it makes sense for the PLEDGE to indicate what certificate it is
> expecting.
>
> That lets the Registrar be built using a variety of certificates for
> load balancing purposes, and deals with a race condition that could occur if
> the Registrar's certificate is renewed during the imprinting process.
>
> If a Registrar wants/needs to update it's cmcRA cert, it could present
> the previously signed voucher to the MASA with previous…
There are two places where consistent use of Registrar cert on both legs is
referenced.
First BRSKI-08 s4.3 indicates the MASA "MAY verify” the pledge’s proximity
assertion is “consistent with the [Registrar’s Registrar's 'TLS client
certificate]”. The Registrar’s TLS client certificate chain root certificate is
then used to populate the ‘pinned-domain-cert’ (final paragraph s4.3).
Second BRSKI-08 s4.4 indicates how the Pledge completes the provisional TLS
authentication: "The 'pinned-domain-cert' element of the voucher contains the
domain CA's public key. The Pledge MUST use the 'pinned-domain-cert' trust
anchor to immediately complete authentication of the provisional TLS
connection."
The normative language here allows for Pledges that don’t make the proximity
assertion. This also allows a Registrar to present a cert to the Pledge that is
*different* than the cert it presents to the MASA; so long as they are issued
by the same CA and so long as the MASA allows for the discrepancy. We *could*
strengthen this normative statement like so:
“If the Pledge provides a proximity assertion then the MASA MUST
verify…”
The current logic is softer to allow for more flexibility in Pledge behavior.
See my next comment:
>>> a) is that certificate also included in the PKCS7 bag of certificates?
>>> I think the answer SHOULD be yes.
>>> b) is there any operationally valid reason why there should be additional
>>> certificates in the PKCS7 bag?
>>> I can not come up with one. The registrar is never going to validate
>>> any chain that the manufacturer might have used internally to set up
>>> their CA for their IDevID. It cares about the end-certificate only.
>
>> The reason s3.3. mandates the entire chain, including the domain CA
>> certificate, is to allow the above consistency checks. But originally
>> this was so that the domainCA certificate would be used for the pinned
>> cert. Moving to just the RA cert in the pinned-domain-cert field would
>> be a simplification? The text of the voucher-05 leaf description seems
>> to allow this.
>
> I would like it to be just the RA cert.
Where “just the RA cert” is a simplification, true. I think the current
language of using the pinned-domain-cert provides a set of benefits:
a) allows the RAs to change certs as needed between voucher requests
and deployments
b) simplifies log verification as its always root CA certs in the log
c) Ensures Pledges “pin” a root cert instead of a subcert within the
tree
d) For Pledges that don’t do EST they have a CA cert rather than just
an RA
(note: s4.7 indicates only that Pledges “SHOULD” continue with
EST)
Point (d) is important. If we change to a ‘registrar-cert’ we’d need to
strengthen that recommendation to a “MUST”.
>>> In a signed voucher request from the JRC (registrar) to the MASA the
>>> pinned-domain-cert is that of the *Registrar* (signed with it's cmcRA marked
>>> certificate from the domain owner's CA).
>>>
>>> a) is that certificate also included in the PKCS7 bag of certificates?
>>> I think the answer SHOULD be yes.
>
>> This is the current language and *not* that the pinned-domain-cert is
>> populated at all. In fact if you look at the new voucher-request-yang
>> branch and Example (2) of the voucher requests you see:
>
> Are you saying that pinned-domain-cert should not be populated in the
> voucher request ("VR") from Registrar->MASA?
Its populated via the prior-signed-voucher-request (see above).
>
>> I think we’re close to agreeing. Some comments:
>
>> I like the jwt approach to certs where they include an entire “x5c”
>> chain rather than a single cert. Maybe we should be copying that? In
>> particular I like it better than trying to specify extra stuff in the
>> certificate bag. The less we depend on the pkcs#7 structure the better
>> and I’m willing to change the above uses to meet that goal.
>
> So, our pinned-domain-cert in the VR would include the entire chain?
> What format would we use? Is it just concatenated DER of certificates?
Current language is *only* the Registrar’s cert.
1) The Pledge attests to the seen “proximity-registrar-cert” by extracting the
Registrar’s TLS server cert from the TLS handshake. This is a single cert not a
chain. This new voucher request leaf name is now clearer in this point.
2) The MASA attests to the seen “pinned-domain-cert” by extracting the
Registrar’s *root CA certificate* from the PKCS#7 signature.
The changes in the above branch don’t effect the normative behavior but do
provide clarity; I suggest we adopt them. Beyond that the question at hand is:
Q1) should we make “registrar-cert” or “domain-cert” consistent around
“registrar” or “domain” or maintain the current differences?
Q2) if we move to “chain” should we move all the way to “domain-chain”? [1]
My thinking is to accept my branch’s diffs but not move toward chains.
- max
[1] What would ‘chain’ look like?
x5c is well defined as a JSON field. I’d use the structure as is. Something
like the language of https://tools.ietf.org/html/rfc7515#section-4.1.6 modified
to this:
The "proximity-domain-chain” parameter contains the X.509 public key
certificate or certificate chain [RFC5280] corresponding to the key
used for TLS server authentication by the Registrar the Pledge is
communicating with.
I have NOT made this modification.
>>> In my code I'm doing:
>>>
>>> i. extract the first certificate from the PKCS7 bag, and use it to
>>> verify the PKCS7, telling the verifyer not to validate the chain,
>>> and not to use any certificates from the PKCS7.
>>> I found that I could not find a way to access the content of the PKCS7
>>> content without verifying first. I don't know if this is a ruby-openssl,
>>> or underlying libssl limitation yet.
>
>> This is an important point. In openssl I believe I was able to crack
>> into the details without verifying and then go back and verify once I’d
>> extracted the cert bags.
>
> I believe it should be possible, but that I may not have access to the right
> API from ruby-openssl. I've now upstreamed one patch for ruby-openssl, so
> I'll probably fix that and upstream and another patch.
>
>>> Alternatively, in step (i), I should try all the certificates until one
>>> works, guarding aginst there being more than one.
>
>> Dunno the options. I brought my code up this evening to relook at the
>> pinned-cert discussion in this exact area but didn’t make any
>> progress. I’ll try and look at it tomorrow.
>
>
>
> --
> Michael Richardson <[email protected]>, Sandelman Software Works
> -= IPv6 IoT consulting =-
>
>
>
_______________________________________________
Anima mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/anima