<div dir="ltr"><p style="margin-top:0px;font-family:Helvetica,Arial,sans-serif;font-size:14px">Hi all,</p><p style="margin-top:0px;font-family:Helvetica,Arial,sans-serif;font-size:14px">I wanted to share my recent post from Let's Encrypt's forums regarding our experiences implementing CAA. In particular I'd like to draw attention to RFC6844's potential for loops, which I brought up during previous discussion of the problems with legacy RFC6844. This is preventing us from renewing certificates for a number of our subscribers. We use a short certificate lifetime (90 days) and encourage renewal when 30 days are left on a certificate, so if this problem remains through the full vote and IPR process (44 days), many subscriber certificates will expire without a replacement.</p><p style="margin-top:0px;font-family:Helvetica,Arial,sans-serif;font-size:14px">-------</p><p style="margin-top:0px"><font face="Helvetica, Arial, sans-serif"><span style="font-size:14px"><a href="https://community.letsencrypt.org/t/legacy-caa-implementation/42335">https://community.letsencrypt.org/t/legacy-caa-implementation/42335</a></span></font><br></p><p style="margin-top:0px;font-family:Helvetica,Arial,sans-serif;font-size:14px">On Thursday we enabled an implementation of the legacy form of the CAA (<a href="https://tools.ietf.org/html/rfc6844" style="background:transparent;color:rgb(0,136,204);text-decoration-line:none;word-wrap:break-word">RFC6844</a>) spec. Previously, Let’s Encrypt implemented an amended and simplified form of RFC6844 as described in <a href="https://www.rfc-editor.org/errata/eid5065" style="background:transparent;color:rgb(0,136,204);text-decoration-line:none;word-wrap:break-word">erratum 5065</a>. We’ve been working on getting the erratum officially adopted at the CA/Browser Forum, and there is general consensus at both IETF and the CA/Browser Forum that the amended version is ideal. Unfortunately, the details haven’t yet been formally voted in, so we have implemented the older version temporarily while we wait for the <a href="https://cabforum.org/pipermail/public/2017-September/012066.html" style="background:transparent;color:rgb(0,136,204);text-decoration-line:none;word-wrap:break-word">vote to go through</a>.</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px">The difference is the handling of CNAMEs. Under erratum 5065, to check CAA for <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://www.example.com">www.example.com</a></code>, the CA looks up CAA for <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://www.example.com">www.example.com</a></code>, then <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://example.com">example.com</a></code>, then <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">com</code> (this is called tree-climbing). If any CNAMEs are encountered along the way, the CA’s recursive resolver automatically resolves them according to RFC1034, and the CA gets the CAA record at the end of the CNAME chain, if there is one.</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px">Under legacy CAA, the CA is required to additionally climb the DNS tree on each CNAME record it receives along the way, and check CAA for each of those. For instance, if <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://www.example.com">www.example.com</a></code> is a CNAME to <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://hosting.customer.example.net">hosting.customer.example.net</a></code>, the CAA must additionally check CAA for <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://customer.example.net">customer.example.net</a></code>, <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://example.net">example.net</a></code>, and <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">net</code>. This may introduce new hostnames into your CAA path that were not there before. If any of those hostnames fails CAA lookup, issuance will be blocked.</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px">There’s another issue with legacy CAA: Mixed CNAME/tree-climbing loops. Normally loops in CNAME records are handled automatically by recursive resolvers, and result in lookup failures. As a result, CNAME loops in the wild are rare. However, the tree-climbing behavior introduces a new potential loop. Say, for example, <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://blog.example.com">blog.example.com</a></code> is a CNAME to <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://www.blog.example.com">www.blog.example.com</a></code>. According to a strict interpretation of RFC6844, the CA is required to check CAA for <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://blog.example.com">blog.example.com</a></code>, then <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://www.blog.example.com">www.blog.example.com</a></code>, then <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://blog.example.com">blog.example.com</a></code>, then <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)"><a href="http://blog.example.com">blog.example.com</a></code>, and so on forever. We’ve addressed this in our code by setting a limit on how deep we will chase such CNAMEs. In the interest of security and correctness, we fail closed in such a scenario and prevent issuance. RFC6844 does not specify how to handle such loops; under erratum 5065 there is no possibility for loops. Unfortunately, such mixed CNAME/tree-climbing loops are a very common and legitimate DNS setup in the wild, so this blocks issuance for some domains.</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px">We’ve already gotten several reports from users that this is causing breakage:</p><ul style="margin:0px;padding:0px 0px 0px 40px;clear:both;font-family:Helvetica,Arial,sans-serif;font-size:14px"><li><a href="https://community.letsencrypt.org/t/consistent-500s-for-new-cert-failing-caa-for-one-domain/41334/9" style="background:transparent;color:rgb(0,136,204);text-decoration-line:none;word-wrap:break-word">Consistent 500's for new-cert (failing CAA for one domain)</a></li><li><a href="https://community.letsencrypt.org/t/too-many-cnames-when-looking-up-caa/42321" style="background:transparent;color:rgb(0,136,204);text-decoration-line:none;word-wrap:break-word">Too many CNAMEs when looking up CAA</a></li><li><a href="https://github.com/letsencrypt/boulder/issues/3093" style="background:transparent;color:rgb(0,136,204);text-decoration-line:none;word-wrap:break-word">https://github.com/letsencrypt/boulder/issues/3093</a></li></ul><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px">We understand this is causing issuance problems for many people, and we’re going to be continuing to push hard to find a solution soon that allows continued issuance and renewal for affected domains.</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px">One workaround that may work for if your DNS provider fully supports setting CAA records: As described <a href="https://letsencrypt.org/docs/caa/" style="background:transparent;color:rgb(0,136,204);text-decoration-line:none;word-wrap:break-word">in our CAA documentation</a>, CAA processing terminates early if any CAA record is found. Setting a CAA record for your domain that explicitly allows issuance by Let’s Encrypt can help avoid these problems. This is of course not an ideal solution: not all DNS software supports setting CAA records, and not everyone has direct control of their DNS.</p></div>