On Sun, Oct 11, 2015 at 12:33:33AM -0400, Dave Garrett wrote:

> https://github.com/tlswg/tls13-spec/pull/287
> 
> PR updated with some revisions. Please take a look at some point and tell me 
> what you think.

Still problematic, by changing more text than necessary.  The following
is wrong and should not be added.

    Just after which is largely fine (I would carve out an explicit
    exception for self-signatures which are a matter of data format
    necessity not trust):

        "Endpoints negotiating use of TLS 1.3 MUST NOT trust any
        signature that uses any of the deprecated hash algorithms
        (MD5, SHA-1, & SHA-224)"

    You add the incorrect:

        or send any certificate relying on any deprecated hash to
        its peer.  (see {{server-certificate}})

This is still the same problem as before.  The fix is to just as
before say no such thing, each peer sends something with a known
supported algorithm if it can, or whatever otherwise it has if it
can't.  Indeed with SNI, sending the right certificate (matching
SAN) takes precedence over any considerations of algorithms.  If
the none of the certificates with the right SAN have supported
algorithms, send one with an unsupported algorithm and let the peer
decide.

At which point, the next change is not needed:

    -the client a certificate chain of its choice that may include algorithms
    -that are not known to be supported by the client. This fallback chain MAY
    -use the deprecated SHA-1 hash algorithm.
    +the client a certificate chain of its choice that MAY include algorithms
    +that are not known to be supported by the client.

For SHA-1 can still be sent, all that changes is that its in
signatures is no longer trusted, (but tolerated in self-signatures
which are not relevant in evaluating trust).

At which point we get to (removed original text elided, just
unchanged and new text below):

    If the client cannot construct an acceptable chain using the provided
    +certificates and decides to abort the handshake, then it MUST send a
    +fatal alert message and close the connection. If the chain is untrustworthy
    +because a certificate cannot be parsed correctly or due to use of a
    +deprecated hash algorithm (MD5, SHA-1, & SHA-224), then it SHOULD produce
    +a "bad_certificate" alert; otherwise it MUST produce an
    +"unsupported_certificate" alert.

It is simply wrong to require any particular reaction to an untrusted
chain.  Elements of the chain may expired, contain unknown (more
modern?) algorithms, and yet the handshake can continue in trust
models which don't need the problematic portion of the chain.

TLS does not mandate a trust model, it supports Web PKI trust more
directly than other models, but that's as far as it goes.

TLS can say that certificates with SHA-1 are no longer to be trusted.
Some such intermediate certificates sent by a peer may not even
end up in the (alternative) chain the verifier builds.  Or the
verifier may not validate any certificate chain at all.

    +Servers supporting both TLS 1.2 and TLS 1.3 MAY negotiate TLS 1.2 with
    +support for SHA-1 hashes, however servers MUST NOT downgrade to use an
    +older version in response to a TLS 1.3 client offering support for only
    +deprecated or unsupported hashes. All clients offering TLS 1.3 are REQUIRED
    +to offer support for at least one hash/signature pair which is not 
deprecated
    +(see {{signature-algorithms}}).

This is fine, and applies to TLS PRFs, ... but the certificate
chain can still contain (untrusted) SHA-1 signatures even with TLS
1.3.

    +MD5 hashes MUST NOT be used in any certificate in any TLS version, and any
    +implementation MAY reject any such certificate, without further inspection.

Again this is simply too strong.  Just like SHA-1, MD5 is not
trusted.  Its presence MUST NOT terminate the handshake, mandating
this at the TLS layer is a layer violation.  Trust is an application
layer problem.

Also the below is not appropriate:

    +-  Have you ensured that certificate chains using SHA-1 or SHA-224
    +  are only used with TLS 1.2 or older, or are prohibited completely?
    +

And this:

    +-  When the client has requested a server certificate, but no
    +  suitable certificate chain is available, do you correctly send a
    +  valid fallback chain using whatever TLS 1.3 permitted algorithms
    +  are necessary, instead of immediately aborting the connection?
    +

The fallback chain can contain anything at all.  CRC-32 if need
be.  Only SHA2-256, equivalent or better is to be trusted, but
that's a decision for the next layer up.

This pull request needs to simply specify that digest algorithms
other than SHA2-256 and SHA2-384 (plus any speficified in future
RFCs as sufficiently strong) are to be trusted by default.

Some clients may accept GOST signatures, that's a local matter for
those clients.  And we may yet see some subset of SHA3-256, SHAKE256,
Blake2, ... in certificates.

This draft deprecates trust in SHA-1, and restates non-trust of
MD5.  While clarifying that presence of either in certificates does
not constitude a malformed protocol message, and does not automatically
lead to fatal handshake errors.  Rather, when seen outside of
self-signatures in certificates needed to construct the complete
chain, these algorithms typically cause chain verification to fail,
which may in turn cause the handshake to be aborted for lack of
trust, not because of deprecated signature algorithms in the
certificate chain.

Is this clear yet?

-- 
        Viktor.

_______________________________________________
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls

Reply via email to