
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title><![CDATA[ The Cloudflare Blog ]]></title>
        <description><![CDATA[ Get the latest news on how products at Cloudflare are built, technologies used, and join the teams helping to build a better Internet. ]]></description>
        <link>https://blog.cloudflare.com</link>
        <atom:link href="https://blog.cloudflare.com/" rel="self" type="application/rss+xml"/>
        <language>en-us</language>
        <image>
            <url>https://blog.cloudflare.com/favicon.png</url>
            <title>The Cloudflare Blog</title>
            <link>https://blog.cloudflare.com</link>
        </image>
        <lastBuildDate>Sat, 04 Apr 2026 07:15:09 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Addressing the unauthorized issuance of multiple TLS certificates for 1.1.1.1]]></title>
            <link>https://blog.cloudflare.com/unauthorized-issuance-of-certificates-for-1-1-1-1/</link>
            <pubDate>Thu, 04 Sep 2025 17:30:00 GMT</pubDate>
            <description><![CDATA[ Unauthorized TLS certificates were issued for 1.1.1.1 by a Certification Authority without permission from Cloudflare. These rogue certificates have now been revoked. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Over the past few days Cloudflare has been notified through our vulnerability disclosure program and the <a href="https://groups.google.com/g/certificate-transparency/c/we_8SNGqA3w/m/ILXqa0hzAgAJ?utm_medium=email&amp;utm_source=footer"><u>certificate transparency mailing list</u></a> that unauthorized certificates were issued by <a href="https://www.fina.hr/"><u>Fina CA</u></a> for 1.1.1.1, one of the IP addresses used by our <a href="https://one.one.one.one/"><u>public DNS resolver service</u></a>. From February 2024 to August 2025, Fina CA <a href="https://crt.sh/?iPAddress=1.1.1.1&amp;match=="><u>issued</u></a> twelve certificates for 1.1.1.1 without our permission. We did not observe unauthorized issuance for any properties managed by Cloudflare other than 1.1.1.1.</p><p>We have no evidence that bad actors took advantage of this error. To impersonate Cloudflare's public DNS resolver 1.1.1.1, an attacker would not only require an unauthorized certificate and its corresponding private key, but attacked users would also need to trust the Fina CA. Furthermore, traffic between the client and 1.1.1.1 would have to be intercepted.</p><p>While this unauthorized issuance is an unacceptable lapse in security by Fina CA, we should have caught and responded to it earlier. After speaking with Fina CA, it appears that they issued these certificates for the purposes of internal testing. However, no CA should be issuing certificates for domains and IP addresses without checking control. At present all certificates have been <a href="http://rdc.fina.hr/RDC2020/FinaRDCCA2020partc1.crl"><u>revoked</u></a>. We are awaiting a full post-mortem from Fina.</p><p>While we regret this situation, we believe it is a useful opportunity to walk through how trust works on the Internet between networks like ourselves, destinations like 1.1.1.1, CAs like Fina, and devices like the one you are using to read this. To learn more about the mechanics, please keep reading.</p>
    <div>
      <h3>Background</h3>
      <a href="#background">
        
      </a>
    </div>
    <p>Cloudflare operates a <a href="https://one.one.one.one/"><u>public DNS resolver 1.1.1.1 service</u></a> that millions of devices use to resolve domain names from a human-readable format such as example.com to an IP address like 192.0.2.42 or 2001:db8::2a.</p><p>The 1.1.1.1 service is accessible using various methods, across multiple domain names, such as <a href="https://cloudflare-dns.com"><u>cloudflare-dns.com</u></a> and <a href="https://one.one.one.one"><u>one.one.one.one</u></a>, and also using various IP addresses, such as 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, and 2606:4700:4700::1001. <a href="https://one.one.one.one/family/"><u>1.1.1.1 for Families</u></a> also provides public DNS resolver services and is hosted on different IP addresses — 1.1.1.2, 1.1.1.3, 1.0.0.2, 1.0.0.3, 2606:4700:4700::1112, 2606:4700:4700::1113, 2606:4700:4700::1002, 2606:4700:4700::1003.</p><p>As originally specified in <a href="https://datatracker.ietf.org/doc/html/rfc1034"><u>RFC 1034</u></a> and <a href="https://datatracker.ietf.org/doc/html/rfc1035"><u>RFC 1035</u></a>, the DNS protocol includes no privacy or authenticity protections. DNS queries and responses are exchanged between client and server in plain text over UDP or TCP. These represent around 60% of queries received by the Cloudflare 1.1.1.1 service. The lack of privacy or authenticity protection means that any intermediary can potentially read the DNS query and response and modify them without the client or the server being aware.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6zbEvgOCwZomZTbgSGFuEo/d638f36eebdbf2577ea0b8172dff843e/image1.png" />
          </figure><p>To address these shortcomings, we have helped develop and deploy multiple solutions at the IETF. The two of interest to this post are DNS over TLS (DoT, <a href="https://datatracker.ietf.org/doc/html/rfc7858"><u>RFC 7878</u></a>) and DNS over HTTPS (DoH, <a href="https://datatracker.ietf.org/doc/html/rfc8484"><u>RFC 8484</u></a>). In both cases the DNS protocol itself is mainly unchanged, and the desirable security properties are implemented in a lower layer, replacing the simple use of plain-text in UDP and TCP in the original specification. Both DoH and DoT use TLS to establish an authenticated, private, and encrypted channel over which DNS messages can be exchanged. To learn more you can read <a href="https://blog.cloudflare.com/dns-encryption-explained/"><u>DNS Encryption Explained</u></a>.</p><p>During the <a href="https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/"><u>TLS handshake</u></a>, the server proves its identity to the client by presenting a certificate. The client validates this certificate by verifying that it is signed by a Certification Authority that it already trusts. Only then does it establish a connection with the server. Once connected, TLS provides encryption and integrity for the DNS messages exchanged between client and server. This protects DoH and DoT against eavesdropping and tampering between the client and server.</p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/21YeKS2nYIFDI9uC3uClXE/6115e00945458d42627d973aef75076c/image2.png" />
          </figure><p>The TLS certificates used in DoT and DoH are the same kinds of certificates HTTPS websites serve. Most website certificates are issued for domain names like <a href="http://example.com"><u>example.com</u></a>. When a client connects to that website, they resolve the name <a href="http://example.com"><u>example.com</u></a> to an IP like 192.0.2.42, then connect to the domain on that IP address. The server responds with a TLS certificate containing <a href="http://example.com"><u>example.com</u></a>, which the device validates.</p><p>However, DNS server certificates tend to be used slightly differently. Certificates used for DoT and DoH have to contain the service IP addresses, not just domain names. This is due to clients being unable to resolve a domain name in order to contact their resolver, like <a href="https://cloudflare-dns.com"><u>cloudflare-dns.com</u></a>. Instead, devices are first set up by connecting to their resolver via a known IP address, such as 1.1.1.1 in the case of Cloudflare public DNS resolver. When this connection uses DoT or DoH, the resolver responds with a TLS certificate issued for that IP address, which the client validates. If the certificate is valid, the client believes that it is talking to the owner of 1.1.1.1 and starts sending DNS queries.</p><p>You can see that the IP addresses are included in the certificate Cloudflare’s public resolver uses for DoT/DoH:</p>
            <pre><code>Certificate:
  Data:
      Version: 3 (0x2)
      Serial Number:
          02:7d:c8:c5:e1:72:94:ae:c9:ed:3f:67:72:8e:8a:08
      Signature Algorithm: sha256WithRSAEncryption
      Issuer: C=US, O=DigiCert Inc, CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1
      Validity
          Not Before: Jan  2 00:00:00 2025 GMT
          Not After : Jan 21 23:59:59 2026 GMT
      Subject: C=US, ST=California, L=San Francisco, O=Cloudflare, Inc., CN=cloudflare-dns.com
      X509v3 extensions:
          X509v3 Subject Alternative Name:
              DNS:cloudflare-dns.com, DNS:*.cloudflare-dns.com, DNS:one.one.one.one, IP Address:1.0.0.1, IP Address:1.1.1.1, IP Address:162.159.36.1, IP Address:162.159.46.1, IP Address:2606:4700:4700:0:0:0:0:1001, IP Address:2606:4700:4700:0:0:0:0:1111, IP Address:2606:4700:4700:0:0:0:0:64, IP Address:2606:4700:4700:0:0:0:0:6400</code></pre>
            
    <div>
      <h3>Rogue certificate issuance</h3>
      <a href="#rogue-certificate-issuance">
        
      </a>
    </div>
    <p>The section above describes normal, expected use of Cloudflare public DNS resolver 1.1.1.1 service, using certificates managed by Cloudflare. However, Cloudflare has been made aware of other, unauthorized certificates being issued for 1.1.1.1. Since certificate validation is the mechanism by which DoH and DoT clients establish the authenticity of a DNS resolver, this is a concern. Let’s now dive a little further in the security model provided by DoH and DoT.</p><p>Consider a client that is preconfigured to use the 1.1.1.1 resolver service using DoT. The client must establish a TLS session with the configured server before it can send any DNS queries. To be trusted, the server needs to present a certificate issued by a CA that the client trusts. The collection of certificates trusted by the client is also called the root store.</p>
            <pre><code>Certificate:
  Data:
      Version: 3 (0x2)
      Serial Number:
          02:7d:c8:c5:e1:72:94:ae:c9:ed:3f:67:72:8e:8a:08
      Signature Algorithm: sha256WithRSAEncryption
      Issuer: C=US, O=DigiCert Inc, CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1</code></pre>
            <p>A Certification Authority (CA) is an organisation, such as DigiCert in the section above, whose role is to receive requests to sign certificates and verify that the requester has control of the domain. In this incident, Fina CA issued certificates for 1.1.1.1 without Cloudflare's involvement. This means that Fina CA did not properly check whether the requestor had legitimate control over 1.1.1.1. According to Fina CA:</p><blockquote><p>“They were issued for the purpose of internal testing of certificate issuance in the production environment. An error occurred during the issuance of the test certificates when entering the IP addresses and as such they were published on Certificate Transparency log servers.”</p></blockquote><p>Although it’s not clear whether Fina CA sees it as an error, we emphasize that it is not an error to publish test certificates on Certificate Transparency (more about what that is later on). Instead, the error at hand is Fina CA using their production keys to sign a certificate for an IP address without permission of the controller. We have <a href="https://ripe84.ripe.net/archives/video/747/"><u>talked about</u></a> misuse of 1.1.1.1 in documentation, lab, and testing environments at length. Instead of the Cloudflare public DNS resolver 1.1.1.1 IP address, Fina should have used an IP address it controls itself.</p><p>Unauthorized certificates are unfortunately not uncommon, whether due to negligence — such as <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930029"><u>IdenTrust</u></a> in November 2024 — or compromise. Famously in 2011, the Dutch CA DigiNotar was <a href="https://threatpost.com/final-report-diginotar-hack-shows-total-compromise-ca-servers-103112/77170/"><u>hacked</u></a>, and its keys were used to issue hundreds of certificates. This hack was a wake-up call and motivated the introduction of Certificate Transparency (CT), later formalised in <a href="https://datatracker.ietf.org/doc/html/rfc6962"><u>RFC 6962</u></a>. The goal of Certificate Transparency is not to directly prevent misissuance, but to be able to detect any misissuance once it has happened, by making sure every certificate issued by a CA is publicly available for inspection.</p><p>In certificate transparency several independent parties, including <a href="https://blog.cloudflare.com/introducing-certificate-transparency-monitoring/"><u>Cloudflare</u></a>, operate public logs of issued certificates. Many modern browsers do not accept certificates unless they provide proof in the form of signed certificate timestamps (<a href="https://certificate.transparency.dev/howctworks/"><u>SCT</u></a>s) that the certificate has been logged in at least two logs. Domain owners can therefore monitor all public CT logs for any certificate containing domains they care about. If they see a certificate for their domains that they did not authorize, they can raise the alarm. CT is also the data source for public services such as <a href="https://crt.sh"><u>crt.sh</u></a> and Cloudflare Radar’s <a href="https://radar.cloudflare.com/certificate-transparency"><u>certificate transparency page</u></a>.</p><p>Not all clients require proof of inclusion in certificate transparency. Browsers do, but most DNS clients don’t. We were fortunate that Fina CA did submit the unauthorized certificates to the CT logs, which allowed them to be discovered.</p>
    <div>
      <h3>Investigation into potential malicious use</h3>
      <a href="#investigation-into-potential-malicious-use">
        
      </a>
    </div>
    <p>Our immediate concern was that someone had maliciously used the certificates to impersonate the 1.1.1.1 service. Such an attack would require all the following:</p><ol><li><p>An attacker would require a rogue certificate and its corresponding private key.</p></li><li><p>Attacked clients would need to trust the Fina CA.</p></li><li><p>Traffic between the client and 1.1.1.1 would have to be intercepted.</p></li></ol><p>In light of this incident, we have reviewed these requirements one by one:</p><p>1. We know that a certificate was issued without Cloudflare's involvement. We must assume that a corresponding private key exists, which is not under Cloudflare's control. This could be used by an attacker. Fina CA wrote to us that the private keys were exclusively in Fina’s controlled environment and were immediately destroyed even before the certificates were revoked. As we have no way to verify this, we have and continue to take steps to detect malicious use as described in point 3.</p><p>2. Furthermore, some clients trust Fina CA. It is included by default in <a href="https://learn.microsoft.com/en-us/security/trusted-root/participants-list"><u>Microsoft’s root store</u></a> and in an <a href="https://eidas.ec.europa.eu/efda/trust-services/browse/eidas/tls"><u>EU Trust Service provider</u></a>. We can exclude some clients, as the CA certificate is not included by default in the root stores of <a href="https://android.googlesource.com/platform/system/ca-certificates/+/master/files/"><u>Android</u></a>, <a href="https://support.apple.com/en-us/HT209143"><u>Apple</u></a>, <a href="https://wiki.mozilla.org/CA/Included_Certificates"><u>Mozilla</u></a>, or <a href="https://g.co/chrome/root-policy"><u>Chrome</u></a>. These users cannot have been affected with these default settings. For these certificates to be used nefariously, the client’s root store must include the Certification Authority (CA) that issued them. Upon discovering the problem, we immediately reached out to Fina CA, Microsoft, and the <a href="https://eidas.ec.europa.eu/efda/trust-services/browse/eidas/tls/tl/HR"><u>EU Trust Service provider</u></a>. Microsoft responded quickly, and started rolling out an update to their <i>disallowed list</i>, which should cause clients that use it to stop trusting the certificate.</p><p>3. Finally, we have launched an investigation into possible interception between users and 1.1.1.1. The first way this could happen is when the attacker is on-path of the client request. Such man-in-the-middle attacks are likely to be invisible to us. Clients will get responses from their on-path middlebox and we have no reliable way of telling that is happening. On-path interference has been a persistent problem for 1.1.1.1, which we’ve been <a href="https://blog.cloudflare.com/fixing-reachability-to-1-1-1-1-globally/"><u>working on</u></a> ever since we announced 1.1.1.1.</p><p>A second scenario can occur when a malicious actor is off-path, but is able to hijack 1.1.1.1 routing via BGP. These are scenarios we have discussed in a<a href="https://blog.cloudflare.com/bgp-hijack-detection/"> <u>previous blog post</u></a>, and <a href="https://manrs.org/2024/05/rpki-rov-deployment-reaches-major-milestone/"><u>increasing adoption of RPKI route origin validation (ROV)</u></a> makes BGP hijacks with high penetration harder. We looked at the historical BGP announcements involving 1.1.1.1, and have found no evidence that such routing hijacks took place.</p><p>Although we cannot be certain, so far we have seen no evidence that these certificates have been used to impersonate Cloudflare public DNS resolver 1.1.1.1 traffic. In later sections we discuss the steps we have taken to prevent such impersonation in the future, as well as concrete actions you can take to protect your own systems and users.</p>
    <div>
      <h3>A closer look at the unauthorized certificates attributes</h3>
      <a href="#a-closer-look-at-the-unauthorized-certificates-attributes">
        
      </a>
    </div>
    <p>All unauthorized certificates for 1.1.1.1 were valid for exactly one year and included other domain names. Most of these domain names are not registered, which indicates that the certificates were issued without proper domain control validation. This violates sections 3.2.2.4 and 3.2.2.5 of the CA/Browser Forum’s <a href="https://cabforum.org/working-groups/server/baseline-requirements/requirements/#3224-validation-of-domain-authorization-or-control"><u>Baseline Requirements</u></a>, and sections 3.2.2.3 and 3.2.2.4 of the <a href="https://rdc.fina.hr/RDC2015/CPWSA1-12-en.pdf"><u>Fina CA Certificate Policy</u></a>.</p><p>The full list of domain names we identified on the unauthorized certificates are as follows:</p>
            <pre><code>fina.hr
ssltest5
test.fina.hr
test.hr
test1.hr
test11.hr
test12.hr
test5.hr
test6
test6.hr
testssl.fina.hr
testssl.finatest.hr
testssl.hr
testssl1.finatest.hr
testssl2.finatest.hr</code></pre>
            <p>It’s also worth noting that the Subject attribute points to a fictional organisation <b>TEST D.D.</b>, as can be seen on this unauthorized certificate:</p>
            <pre><code>        Serial Number:
            a5:30:a2:9c:c1:a5:da:40:00:00:00:00:56:71:f2:4c
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=HR, O=Financijska agencija, CN=Fina RDC 2015
        Validity
            Not Before: Nov  2 23:45:15 2024 GMT
            Not After : Nov  2 23:45:15 2025 GMT
        Subject: C=HR, O=TEST D.D., L=ZAGREB, CN=testssl.finatest.hr, serialNumber=VATHR-32343828408.306
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:testssl.finatest.hr, DNS:testssl2.finatest.hr, IP Address:1.1.1.1</code></pre>
            
    <div>
      <h3>Incident timeline and impact</h3>
      <a href="#incident-timeline-and-impact">
        
      </a>
    </div>
    <p><i>All timestamps are UTC. All certificates are identified by their date of validity.</i></p><p>The <a href="https://crt.sh/?id=12116084225"><u>first certificate</u></a> was issued to be valid starting February 2024, and revoked 33 min later. 11 certificate issuances with common name 1.1.1.1 followed from February 2024 to August 2025. Public reports have been made on <a href="https://news.ycombinator.com/item?id=45089708"><u>Hacker News</u></a> and on the <a href="https://groups.google.com/g/certificate-transparency/c/we_8SNGqA3w/m/ILXqa0hzAgAJ"><u>certificate-transparency mailing list</u></a> early in September 2025, which Cloudflare responded to.</p><p>While responding to the incident, we identified the full list of misissued certificates, their revocation status, and which clients trust them.</p><p>The full timeline for the incident is as follows.</p><table><tr><td><p><b>Date &amp; Time (UTC)</b></p></td><td><p><b>Event Description</b></p></td></tr><tr><td><p>2024-02-18 11:07:33</p></td><td><p><a href="https://crt.sh/?id=12116084225"><u>First certificate issuance</u></a> revoked on 2024-02-18 11:40:00</p></td></tr><tr><td><p>2024-09-25 08:04:03</p></td><td><p><a href="https://crt.sh/?id=14681939427"><u>Issuance</u></a> revoked on 2024-11-06 07:36:05</p></td></tr><tr><td><p>2024-10-04 07:55:38</p></td><td><p><a href="https://crt.sh/?id=14793030836"><u>Issuance</u></a> revoked on 2024-10-04 07:56:56</p></td></tr><tr><td><p>2024-10-04 08:05:48</p></td><td><p><a href="https://crt.sh/?id=14793121895"><u>Issuance</u></a> revoked on 2024-11-06 07:39:55</p></td></tr><tr><td><p>2024-10-15 06:28:48</p></td><td><p><a href="https://crt.sh/?id=14939369380"><u>Issuance</u></a> revoked on 2024-11-06 07:35:36</p></td></tr><tr><td><p>2024-11-02 23:45:15</p></td><td><p><a href="https://crt.sh/?id=15190039061"><u>Issuance</u></a> revoked on 2024-11-02 23:48:42</p></td></tr><tr><td><p>2025-03-05 09:12:23</p></td><td><p><a href="https://crt.sh/?id=16939550348"><u>Issuance</u></a> revoked on 2025-03-05 09:13:22</p></td></tr><tr><td><p>2025-05-24 22:56:21</p></td><td><p><a href="https://crt.sh/?id=18603461241"><u>Issuance</u></a> revoked on 2025-09-04 06:13:27</p></td></tr><tr><td><p>2025-06-28 23:05:32</p></td><td><p><a href="https://crt.sh/?id=19318694206"><u>Issuance</u></a> revoked on 2025-07-18 07:01:27</p></td></tr><tr><td><p>2025-07-18 07:05:23</p></td><td><p><a href="https://crt.sh/?id=19749594221"><u>Issuance</u></a> revoked on 2025-07-18 07:09:45</p></td></tr><tr><td><p>2025-07-18 07:13:14</p></td><td><p><a href="https://crt.sh/?id=19749721864"><u>Issuance</u></a> revoked on 2025-09-04 06:30:36</p></td></tr><tr><td><p>2025-08-26 07:49:00</p></td><td><p><a href="https://crt.sh/?id=20582951233"><u>Last certificate issuance</u></a> revoked on 2025-09-04 06:33:20</p></td></tr><tr><td><p>2025-09-01 05:23:00</p></td><td><p><a href="https://news.ycombinator.com/item?id=45089708"><u>HackerNews submission</u></a> about a possible unauthorized issuance</p></td></tr><tr><td><p>2025-09-02 04:50:00</p></td><td><p>Report shared with us on HackerOne, but was mistriaged</p></td></tr><tr><td><p>2025-09-03 02:35:00</p></td><td><p>Second report shared with us on HackerOne, but also mistriaged.</p></td></tr><tr><td><p>2025-09-03 10:59:00</p></td><td><p><a href="https://groups.google.com/g/certificate-transparency/c/we_8SNGqA3w/m/ILXqa0hzAgAJ?utm_medium=email&amp;utm_source=footer"><u>Report sent</u></a> on the public <a><u>certificate-transparency@googlegroups.com</u></a> mailing picked up by the team.</p></td></tr><tr><td><p>2025-09-03 11:33:00</p></td><td><p>First response by Cloudflare on the mailing list about starting the investigation</p></td></tr><tr><td><p>2025-09-03 12:08:00</p></td><td><p>Incident declared</p></td></tr><tr><td><p>2025-09-03 12:16:00</p></td><td><p>Notification of an unauthorised issuance sent to Fina CA, Microsoft Root Store, and EU Trust service provider</p></td></tr><tr><td><p>2025-09-03 12:23:00</p></td><td><p>Cloudflare identifies an initial list of nine rogue certificates</p></td></tr><tr><td><p>2025-09-03 12:24:00</p></td><td><p>Outreach to Fina CA to inform them about the unauthorized issuance, requesting revocation</p></td></tr><tr><td><p>2025-09-03 12:26:00</p></td><td><p>Identify the number of requests served on 1.1.1.1 IP address, and associated names/services</p></td></tr><tr><td><p>2025-09-03 12:42:00</p></td><td><p>As a precautionary measure, began investigation to rule out the possibility of a BGP hijack for 1.1.1.1</p></td></tr><tr><td><p>2025-09-03 18:48:00</p></td><td><p>Second notification of the incident to Fina CA</p></td></tr><tr><td><p>2025-09-03 21:27:00</p></td><td><p>Microsoft Root Store notifies us that they are preventing further use of the identified unauthorized certificates by using their quick-revocation mechanism.</p></td></tr><tr><td><p>2025-09-04 06:13:27</p></td><td><p>Fina revoked all certificates.</p></td></tr><tr><td><p>2025-09-04 12:44:00</p></td><td><p>Cloudflare receives a response from Fina indicating “an error occurred during the issuance of the test certificates when entering the IP addresses and as such they were published on Certificate Transparency log servers. [...] Fina will eliminate the possibility of such an error recurring.”</p></td></tr></table>
    <div>
      <h3>Remediation and follow-up steps</h3>
      <a href="#remediation-and-follow-up-steps">
        
      </a>
    </div>
    <p>Cloudflare has invested from the very start in the Certificate Transparency ecosystem. Not only do we operate CT logs ourselves, we also run a CT monitor that we use to <a href="https://developers.cloudflare.com/ssl/edge-certificates/additional-options/certificate-transparency-monitoring/"><u>alert customers when certificates are mis-issued for their domains</u></a>.</p><p>It is therefore disappointing that we failed to properly monitor certificates for our own domain. We failed three times. The first time because 1.1.1.1 is an IP certificate and our system failed to alert on these. The second time because even if we were to receive certificate issuance alerts, as any of our customers can, we did not implement sufficient filtering. With the sheer number of names and issuances we manage it has not been possible for us to keep up with manual reviews. Finally, because of this noisy monitoring, we did not enable alerting for all of our domains. We are addressing all three shortcomings.</p><p>We double-checked all certificates issued for our names, including but not limited to 1.1.1.1, using certificate transparency, and confirmed that as of 3 September, the Fina CA issued certificates are the only unauthorized issuances. We contacted Fina, and the root programs we know that trust them, to ask for revocation and investigation. The certificates have been revoked.</p><p>Despite no indication of usage of these certificates so far, we take this incident extremely seriously. We have identified several steps we can take to address the risk of these sorts of problems occurring in the future, and we plan to start working on them immediately:</p><p><b>Alerting</b>: Cloudflare will improve alerts and escalation for issuance of certificates for missing Cloudflare owned domains including 1.1.1.1 certificates.</p><p><b>Transparency</b>: The issuance of these unauthorised 1.1.1.1 certificates were detected because Fina CA used Certificate Transparency. Transparency inclusion is not enforced by most DNS clients, which implies that this detection was a lucky one. We are working on bringing transparency to non-browser clients, in particular DNS clients that rely on TLS.</p><p><b>Bug Bounty</b>: Our procedure for triaging reports made through our vulnerability disclosure program was the cause for a delayed response. We are working to revise our triaging process to ensure such reports get the right visibility.</p><p><b>Monitoring</b>: During this incident, our team relied on <a href="https://crt.sh"><u>crt.sh</u></a> to provide us a convenient UI to explore CA issued certificates. We’d like to give a shout to the <a href="https://www.sectigo.com/"><u>Sectigo team</u></a> for maintaining this tool. Given Cloudflare is an active CT Monitor, we have started to build a dedicated UI to explore our data <a href="https://radar.cloudflare.com/certificate-transparency"><u>in Radar</u></a>. We are looking to enable exploration of certs with IP addresses as common names to Radar as well.</p>
    <div>
      <h3>What steps should you take?</h3>
      <a href="#what-steps-should-you-take">
        
      </a>
    </div>
    <p>This incident demonstrates the disproportionate impact that the current root store model can have. It is enough for a single certification authority going rogue for everyone to be at risk.</p><p>If you are an IT manager with a fleet of managed devices, you should consider whether you need to take direct action to revoke these unauthorized certificates. We provide the list in the timeline section above. As the certificates have since been revoked, it is possible that no direct intervention should be required; however, system-wide revocation is not instantaneous and automatic and hence we recommend checking.</p><p>If you are tasked to review the policy of a root store that includes Fina CA, you should take immediate actions to review their inclusion in your program. The issue that has been identified through the course of this investigation raises concerns, and requires a clear report and follow-up from the CA. In addition, to make it possible to detect future such incidents, you should consider having a requirement for all CAs in your root store to participate in Certificate Transparency. Without CT logs, problems such as the one we describe here are impossible to address before they result in impact to end users.</p><p>We are not suggesting that you should stop using DoH or DoT. DNS over UDP and TCP are unencrypted, which puts every single query and response at risk of tampering and unauthorised surveillance. However, we believe that DoH and DoT client security could be improved if clients required that server certificates be included in a certificate transparency log.</p>
    <div>
      <h3>Conclusion</h3>
      <a href="#conclusion">
        
      </a>
    </div>
    <p>This event is the first time we have observed a rogue issuance of a certificate used by our public DNS resolver 1.1.1.1 service. While we have no evidence this was malicious, we know that there might be future attempts that are.</p><p>We plan to accelerate how quickly we discover and alert on these types of issues ourselves. We know that we can catch these earlier, and we plan to do so.</p><p>The identification of these kinds of issues rely on an ecosystem of partners working together to support Certificate Transparency. We are grateful for the monitors who noticed and reported this issue.</p> ]]></content:encoded>
            <category><![CDATA[1.1.1.1]]></category>
            <category><![CDATA[DNS]]></category>
            <category><![CDATA[Resolver]]></category>
            <category><![CDATA[DoH]]></category>
            <category><![CDATA[TLS]]></category>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Certificate Transparency]]></category>
            <guid isPermaLink="false">6dgQ2aH6eirkXOANX0QikR</guid>
            <dc:creator>Joe Abley</dc:creator>
            <dc:creator>Thibault Meunier</dc:creator>
            <dc:creator>Vicky Shrestha</dc:creator>
            <dc:creator>Bas Westerbaan</dc:creator>
        </item>
        <item>
            <title><![CDATA[How Cloudflare is helping domain owners with the upcoming Entrust CA distrust by Chrome and Mozilla]]></title>
            <link>https://blog.cloudflare.com/how-cloudflare-is-helping-domain-owners-with-the-upcoming-entrust-ca/</link>
            <pubDate>Thu, 19 Sep 2024 14:00:00 GMT</pubDate>
            <description><![CDATA[ Chrome and Mozilla will stop trusting Entrust’s public TLS certificates issued after November 2024 due to concerns about Entrust’s compliance with security standards. In response, Entrust is partnering with SSL.com to continue providing trusted certificates. Cloudflare will support SSL.com as a CA, simplifying certificate management for customers using Entrust by automating issuance and renewals. ]]></description>
            <content:encoded><![CDATA[ <p><a href="https://security.googleblog.com/2024/06/sustaining-digital-certificate-security.html"><u>Chrome</u></a> and <a href="https://groups.google.com/a/mozilla.org/g/dev-security-policy/c/jCvkhBjg9Yw?pli=1"><u>Mozilla</u></a> announced that they will stop trusting Entrust’s public TLS certificates issued after November 12, 2024 and December 1, 2024, respectively. This decision stems from <a href="https://groups.google.com/a/mozilla.org/g/dev-security-policy/c/LhTIUMFGHNw/m/uKzergzqAAAJ"><u>concerns</u></a> related to Entrust’s ability to meet the CA/Browser Forum’s requirements for a publicly trusted certificate authority (CA). To prevent Entrust customers from being impacted by this change, Entrust has announced that they are partnering with <a href="http://ssl.com"><u>SSL.com</u></a>, a publicly trusted CA, and will be issuing certs from SSL.com’s roots to ensure that they can continue to provide their customers with certificates that are trusted by Chrome and Mozilla. </p><p>We’re excited to announce that we’re going to be adding SSL.com as a certificate authority that Cloudflare customers can use. This means that Cloudflare customers that are currently relying on Entrust as a CA and uploading their certificate manually to Cloudflare will now be able to rely on Cloudflare’s certificate management pipeline for automatic issuance and renewal of SSL.com certificates. </p>
    <div>
      <h2>CA distrust: responsibilities, repercussions, and responses</h2>
      <a href="#ca-distrust-responsibilities-repercussions-and-responses">
        
      </a>
    </div>
    <p><b>With great power comes great responsibility
</b>Every publicly trusted certificate authority (CA) is responsible for maintaining a high standard of security and compliance to ensure that the certificates they issue are trustworthy. The security of millions of websites and applications relies on a CA’s commitment to these standards, which are set by the <a href="https://cabforum.org/"><u>CA/Browser Forum</u></a>, the governing body that defines the baseline requirements for certificate authorities. <a href="https://cabforum.org/working-groups/server/baseline-requirements/documents/CA-Browser-Forum-TLS-BR-2.0.6.pdf"><u>These standards</u></a> include rules regarding certificate issuance, validation, and revocation, all designed to secure the data transferred over the Internet. </p><p>However, as with all complex software systems, it’s inevitable that bugs or issues may arise, leading to the mis-issuance of certificates. Improperly issued certificates pose a significant risk to Internet security, as they can be exploited by malicious actors to impersonate legitimate websites and intercept sensitive data. </p><p>To mitigate such risk, publicly trusted CAs are required to communicate issues as soon as they are discovered, so that domain owners can replace the compromised certificates immediately. Once the issue is communicated, CAs must revoke the mis-issued certificates within 5 days to signal to browsers and clients that the compromised certificate should no longer be trusted. This level of transparency and urgency around the revocation process is essential for minimizing the risk posed by compromised certificates. </p><p><b>Why Chrome and Mozilla are distrusting Entrust
</b>The decision made by Chrome and Mozilla to distrust Entrust’s public TLS certificates stems from concerns regarding Entrust’s incident response and remediation process. In <a href="https://groups.google.com/a/mozilla.org/g/dev-security-policy/c/LhTIUMFGHNw/m/uKzergzqAAAJ"><u>several instances</u></a>, Entrust failed to report critical issues and did not revoke certificates in a timely manner. The pattern of delayed action has eroded the browsers’ confidence in Entrust’s ability to act quickly and transparently, which is crucial for maintaining trust as a CA. </p><p>Google and Mozilla cited the ongoing lack of transparency and urgency in addressing mis-issuances as the primary reason for their distrust decision. Google specifically <a href="https://security.googleblog.com/2024/06/sustaining-digital-certificate-security.html"><u>pointed out</u></a> that over the past 6 years, Entrust has shown a "pattern of compliance failures" and failed to make the "tangible, measurable progress" necessary to restore trust. Mozilla <a href="https://groups.google.com/a/mozilla.org/g/dev-security-policy/c/jCvkhBjg9Yw?pli=1"><u>echoed</u></a> these concerns, emphasizing the importance of holding Entrust accountable to ensure the integrity and security of the public Internet. </p><p><b>Entrust’s response to the distrust announcement 
</b>In response to the distrust announcement from Chrome and Mozilla, Entrust has taken proactive steps to ensure continuity for their customers. To prevent service disruption, Entrust has <a href="https://www.entrust.com/blog/2024/07/announcing-our-new-tls-solution-offering/"><u>announced</u></a> that they are partnering with SSL.com, a CA that’s trusted by all major browsers, including Chrome and Mozilla, to issue certificates for their customers. By issuing certificates from SSL.com’s roots, Entrust aims to provide a seamless transition for their customers, ensuring that they can continue to obtain certificates that are recognized and trusted by the browsers their users rely on. </p><p>In addition to their partnership with SSL.com, Entrust <a href="https://www.entrust.com/blog/2024/07/thoughts-on-the-google-chrome-announcement-and-our-commitment-to-the-public-tls-certificate-business/"><u>stated</u></a> that they are working on a number of <a href="https://www.entrust.com/blog/2024/07/restoring-trust-an-update-on-our-progress/"><u>improvements</u></a>, including changes to their organizational structure, revisions to their incident response process and policies, and a push towards automation to ensure compliant certificate issuances. </p>
    <div>
      <h2>How Cloudflare can help Entrust customers </h2>
      <a href="#how-cloudflare-can-help-entrust-customers">
        
      </a>
    </div>
    <p><b>Now available: SSL.com as a certificate authority for Advanced Certificate Manager and SSL for SaaS certificates
</b>We’re excited to announce that customers using <a href="https://www.cloudflare.com/application-services/products/advanced-certificate-manager/"><u>Advanced Certificate Manager</u></a> will now be able to select SSL.com as a certificate authority for Advanced certificates and Total TLS certificates. Once the certificate is issued, Cloudflare will handle all future renewals on your behalf. </p><p>By default, Cloudflare will issue SSL.com certificates with a 90 day validity period. However, customers using Advanced Certificate Manager will have the option to set a custom validity period (14, 30, or 90 days) for their SSL.com certificates. In addition, Enterprise customers will have the option to obtain 1-year SSL.com certificates. Every SSL.com certificate order will include 1 RSA and 1 ECDSA certificate.</p><p>Note: We are gradually rolling this out and customers should see the CA become available to them through the end of September and into October. </p><p>If you’re using Cloudflare as your DNS provider, there are no additional steps for you to take to get the certificate issued. Cloudflare will validate the ownership of the domain on your behalf to get your SSL.com certificate issued and renewed. </p><p>If you’re using an external DNS provider and have wildcard hostnames on your certificates, DNS based validation will need to be used, which means that you’ll need to add TXT DCV tokens at your DNS provider in order to get the certificate issued. With SSL.com, two tokens are returned for every hostname on the certificate. This is because SSL.com uses different tokens for the RSA and ECDSA certificates. To reduce the overhead around certificate management, we recommend setting up <a href="https://blog.cloudflare.com/introducing-dcv-delegation/"><u>DCV Delegation</u></a> to allow Cloudflare to place domain control validation (DCV) tokens on your behalf. Once <a href="https://developers.cloudflare.com/ssl/edge-certificates/changing-dcv-method/methods/delegated-dcv/?cf_history_state=%7B%22guid%22%3A%22C255D9FF78CD46CDA4F76812EA68C350%22%2C%22historyId%22%3A9%2C%22targetId%22%3A%222D50381DD1755E1B208472DB3EBA7428%22%7D#setup"><u>DCV Delegation is set up</u></a>, Cloudflare will automatically issue, renew, and deploy all future certificates for you. </p><p><b>Advanced Certificates: selecting SSL.com as a CA through the UI or API
</b>Customers can select SSL.com as a CA through the UI or through the <a href="https://developers.cloudflare.com/api/operations/certificate-packs-order-advanced-certificate-manager-certificate-pack"><u>Advanced Certificate API endpoint</u></a> by specifying “ssl_com” in the certificate_authority parameter. </p><p>If you’d like to use SSL.com as a CA for an advanced certificate, you can select “SSL.com” as your CA when creating a new Advanced certificate order. </p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4StVxaTcon8sLoCSGcskcq/df72f56d61f818d01ccc21cb71a98925/BLOG-2559_2.png" />
          </figure><p></p><p>If you’d like to use SSL.com as a CA for all of your certificates, we recommend setting your <a href="https://developers.cloudflare.com/ssl/edge-certificates/additional-options/total-tls/"><u>Total TLS</u></a> CA to SSL.com. This will issue an individual certificate for each of your proxied hostname from the CA. </p><p>Note: Total TLS is a feature that’s only available to customers that are using Cloudflare as their DNS provider. </p>
          <figure>
          <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6SGVKQZZ1cs1T9r8gynImE/44b4a90416431ab3abfaba51a3ac15a9/BLOG-2559_3.png" />
          </figure><p></p><p><b>SSL for SaaS: selecting SSL.com as a CA through the UI or API
</b>Enterprise customers can select SSL.com as a CA through the custom hostname creation UI or through the <a href="https://developers.cloudflare.com/api/operations/custom-hostname-for-a-zone-create-custom-hostname"><u>Custom Hostnames API endpoint</u></a> by specifying “ssl_com” in the certificate_authority parameter. </p><p>All custom hostname certificates issued from SSL.com will have a 90 day validity period. If you have wildcard support enabled for custom hostnames, we recommend using <a href="https://blog.cloudflare.com/introducing-dcv-delegation/"><u>DCV Delegation</u></a> to ensure that all certificate issuances and renewals are automatic.  </p>
    <div>
      <h3>Our recommendation if you’re using Entrust as a certificate authority </h3>
      <a href="#our-recommendation-if-youre-using-entrust-as-a-certificate-authority">
        
      </a>
    </div>
    <p>Cloudflare customers that use Entrust as their CA are required to manually handle all certificate issuances and renewals. Since Cloudflare does not directly integrate with Entrust, customers have to get their certificates issued directly from the CA and upload them to Cloudflare as <a href="https://developers.cloudflare.com/ssl/edge-certificates/custom-certificates/uploading/"><u>custom certificates</u></a>. Once these certificates come up for renewal, customers have to repeat this manual process and upload the renewed certificates to Cloudflare before the expiration date. </p><p>Manually managing your certificate’s lifecycle is a time-consuming and error prone process. With certificate lifetimes decreasing from 1 year to 90 days, this cycle needs to be repeated more frequently by the domain owner. </p><p>As Entrust transitions to issuing certificates from SSL.com roots, this manual management process will remain unless customers switch to Cloudflare’s managed certificate pipeline. By making this switch, you can continue to receive SSL.com certificates <a href="https://www.cloudflare.com/application-services/solutions/certificate-lifecycle-management/">without the hassle of manual management</a> — Cloudflare will handle all issuances and renewals for you!</p><p>In early October, we will be reaching out to customers who have uploaded Entrust certificates to Cloudflare to recommend migrating to our managed pipeline for SSL.com certificate issuances, simplifying your certificate management process. </p><p>If you’re ready to make the transition today, simply go to the SSL/TLS tab in your Cloudflare dashboard, click “Order Advanced Certificate”, and select “SSL.com” as your certificate authority. Once your new SSL.com certificate is issued, you can either remove your Entrust certificate or simply let it expire. Cloudflare will seamlessly transition to serving the managed SSL.com certificate before the Entrust certificate expires, ensuring zero downtime during the switch. </p> ]]></content:encoded>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[SaaS]]></category>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[Advanced Certificate Manager]]></category>
            <category><![CDATA[Application Services]]></category>
            <category><![CDATA[Application Security]]></category>
            <guid isPermaLink="false">6JSSnYVglQtKPqyymp5Tst</guid>
            <dc:creator>Dina Kozlov</dc:creator>
        </item>
        <item>
            <title><![CDATA[How we ensure Cloudflare customers aren't affected by Let's Encrypt's certificate chain change]]></title>
            <link>https://blog.cloudflare.com/shortening-lets-encrypt-change-of-trust-no-impact-to-cloudflare-customers/</link>
            <pubDate>Fri, 12 Apr 2024 13:00:09 GMT</pubDate>
            <description><![CDATA[ Let’s Encrypt’s cross-signed chain will be expiring in September. This will affect legacy devices with outdated trust stores (Android versions 7.1.1 or older). To prevent this change from impacting customers, Cloudflare will shift Let’s Encrypt certificates upon renewal to use a different CA ]]></description>
            <content:encoded><![CDATA[ <p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7xrPBUpEjsmaBkRYhxiRIr/c95f42fffef36c7d595422b4724c8665/Untitled--3--1.png" />
            
            </figure><p><a href="https://letsencrypt.org/">Let’s Encrypt</a>, a publicly trusted certificate authority (CA) that Cloudflare uses to issue TLS certificates, has been relying on two distinct certificate chains. One is cross-signed with <a href="https://www.identrust.com/">IdenTrust</a>, a globally trusted CA that has been around since 2000, and the other is Let’s Encrypt’s own root CA, ISRG Root X1. Since Let’s Encrypt launched, <a href="https://letsencrypt.org/certificates/#root-certificates">ISRG Root X1</a> has been steadily gaining its own device compatibility.</p><p>On September 30, 2024, Let’s Encrypt’s certificate chain cross-signed with IdenTrust will <a href="https://letsencrypt.org/2023/07/10/cross-sign-expiration.html">expire</a>. After the cross-sign expires, servers will no longer be able to serve certificates signed by the cross-signed chain. Instead, all Let’s Encrypt certificates will use the ISRG Root X1 CA.</p><p>Most devices and browser versions released after 2016 will not experience any issues as a result of the change since the ISRG Root X1 will already be installed in those clients’ trust stores. That's because these modern browsers and operating systems were built to be agile and flexible, with upgradeable trust stores that can be updated to include new certificate authorities.</p><p>The change in the certificate chain will impact legacy devices and systems, such as devices running Android version 7.1.1 (released in 2016) or older, as those exclusively rely on the cross-signed chain and lack the ISRG X1 root in their trust store. These clients will encounter TLS errors or warnings when accessing domains secured by a Let’s Encrypt certificate. We took a look at the data ourselves and found that, of all Android requests, 2.96% of them come from devices that will be affected by the change. That’s a substantial portion of traffic that will lose access to the Internet. We’re committed to keeping those users online and will modify our certificate pipeline so that we can continue to serve users on older devices without requiring any manual modifications from our customers.</p>
    <div>
      <h3>A better Internet, for everyone</h3>
      <a href="#a-better-internet-for-everyone">
        
      </a>
    </div>
    <p>In the past, we invested in efforts like <a href="/sha-1-deprecation-no-browser-left-behind/">“No Browsers Left Behind”</a> to help ensure that we could continue to support clients as SHA-1 based algorithms were being deprecated. Now, we’re applying the same approach for the upcoming Let’s Encrypt change.</p><p>We have made the decision to remove Let’s Encrypt as a certificate authority from all flows where Cloudflare dictates the CA, impacting Universal SSL customers and those using SSL for SaaS with the “default CA” choice.</p><p>Starting in June 2024, one certificate lifecycle (90 days) before the cross-sign chain expires, we’ll begin migrating Let’s Encrypt certificates that are up for renewal to use a different CA, one that ensures compatibility with older devices affected by the change. That means that going forward, customers will only receive Let’s Encrypt certificates if they explicitly request Let’s Encrypt as the CA.</p><p>The change that Let's Encrypt is making is a necessary one. For us to move forward in supporting new standards and protocols, we need to make the Public Key Infrastructure (PKI) ecosystem more agile. By retiring the cross-signed chain, Let’s Encrypt is pushing devices, browsers, and clients to support adaptable trust stores.</p><p>However, we’ve observed <a href="/sha-1-deprecation-no-browser-left-behind/">changes like this in the past</a> and while they push the adoption of new standards, they disproportionately impact users in economically disadvantaged regions, where access to new technology is limited.</p><p>Our mission is to help build a better Internet and that means supporting users worldwide. We previously published a <a href="/upcoming-lets-encrypt-certificate-chain-change-and-impact-for-cloudflare-customers">blog post about the Let’s Encrypt change</a>, asking customers to switch their certificate authority if they expected any impact. However, determining the impact of the change is challenging. Error rates due to trust store incompatibility are primarily logged on clients, reducing the visibility that domain owners have. In addition, while there might be no requests incoming from incompatible devices today, it doesn’t guarantee uninterrupted access for a user tomorrow.</p><p>Cloudflare’s certificate pipeline has evolved over the years to be resilient and flexible, allowing us to seamlessly adapt to changes like this without any negative impact to our customers.  </p>
    <div>
      <h3>How Cloudflare has built a robust TLS certificate pipeline</h3>
      <a href="#how-cloudflare-has-built-a-robust-tls-certificate-pipeline">
        
      </a>
    </div>
    <p>Today, Cloudflare manages tens of millions of certificates on behalf of customers. For us, a successful pipeline means:</p><ol><li><p>Customers can always obtain a TLS certificate for their domain</p></li><li><p>CA related issues have zero impact on our customer’s ability to obtain a certificate</p></li><li><p>The best security practices and modern standards are utilized</p></li><li><p>Optimizing for future scale</p></li><li><p>Supporting a wide range of clients and devices</p></li></ol><p>Every year, we introduce new optimizations into our certificate pipeline to maintain the highest level of service. Here’s how we do it…</p>
    <div>
      <h3>Ensuring customers can always obtain a TLS certificate for their domain</h3>
      <a href="#ensuring-customers-can-always-obtain-a-tls-certificate-for-their-domain">
        
      </a>
    </div>
    <p>Since the launch of Universal SSL in 2014, Cloudflare has been responsible for issuing and serving a TLS certificate for every domain that’s protected by our network. That might seem trivial, but there are a few steps that have to successfully execute in order for a domain to receive a certificate:</p><ol><li><p>Domain owners need to complete <a href="https://developers.cloudflare.com/ssl/edge-certificates/changing-dcv-method/">Domain Control Validation</a> for every certificate issuance and renewal.</p></li><li><p>The certificate authority needs to verify the Domain Control Validation tokens to issue the certificate.</p></li><li><p><a href="https://developers.cloudflare.com/ssl/edge-certificates/troubleshooting/caa-records/">CAA records</a>, which dictate which CAs can be used for a domain, need to be checked to ensure only authorized parties can issue the certificate.</p></li><li><p>The certificate authority must be available to issue the certificate.</p></li></ol><p>Each of these steps requires coordination across a number of parties — domain owners, CDNs, and certificate authorities. At Cloudflare, we like to be in control when it comes to the success of our platform. That’s why we make it our job to ensure each of these steps can be successfully completed.</p><p>We ensure that every certificate issuance and renewal requires minimal effort from our customers. To get a certificate, a domain owner has to complete Domain Control Validation (DCV) to prove that it does in fact own the domain. Once the certificate request is initiated, the CA will return DCV tokens which the domain owner will need to place in a DNS record or an HTTP token. If you’re using Cloudflare as your DNS provider, Cloudflare completes DCV on your behalf by automatically placing the TXT token returned from the CA into your DNS records. Alternatively, if you use an external DNS provider, we offer the option to <a href="/introducing-dcv-delegation/">Delegate DCV</a> to Cloudflare for automatic renewals without any customer intervention.</p><p>Once DCV tokens are placed, Certificate Authorities (CAs) verify them. CAs conduct this <a href="/secure-certificate-issuance">verification from multiple vantage points</a> to prevent spoofing attempts. However, since these checks are done from multiple countries and ASNs (Autonomous Systems), they may trigger a Cloudflare WAF rule which can cause the DCV check to get blocked. We made sure to update our WAF and security engine to recognize that these requests are coming from a CA to ensure they're never blocked so DCV can be successfully completed.</p><p>Some customers have CA preferences, due to internal requirements or compliance regulations. To prevent an unauthorized CA from issuing a certificate for a domain, the domain owner can create a Certification Authority Authorization (CAA) DNS record, specifying which CAs are allowed to issue a certificate for that domain. To ensure that customers can always obtain a certificate, we check the CAA records before requesting a certificate to know which CAs we should use. If the CAA records block all of the <a href="https://developers.cloudflare.com/ssl/reference/certificate-authorities/">CAs that are available</a> in Cloudflare’s pipeline and the customer has not uploaded a certificate from the CA of their choice, then we add CAA records on our customers’ behalf to ensure that they can get a certificate issued. Where we can, we optimize for preference. Otherwise, it’s our job to prevent an outage by ensuring that there’s always a TLS certificate available for the domain, even if it does not come from a preferred CA.</p><p>Today, Cloudflare is not a publicly trusted certificate authority, so we rely on the CAs that we use to be highly available. But, 100% uptime is an unrealistic expectation. Instead, our pipeline needs to be prepared in case our CAs become unavailable.</p>
    <div>
      <h4>Ensuring that CA-related issues have zero impact on our customer’s ability to obtain a certificate</h4>
      <a href="#ensuring-that-ca-related-issues-have-zero-impact-on-our-customers-ability-to-obtain-a-certificate">
        
      </a>
    </div>
    <p>At Cloudflare, we like to think ahead, which means preventing incidents before they happen. It’s not uncommon for CAs to become unavailable — sometimes this happens because of an outage, but more commonly, CAs have maintenance periods every so often where they become unavailable for some period of time.</p><p>It’s our job to ensure CA redundancy, which is why we always have multiple CAs ready to issue a certificate, ensuring high availability at all times. If you've noticed different CAs issuing your Universal SSL certificates, that's intentional. We evenly distribute the load across our CAs to avoid any single point of failure. Plus, we keep a close eye on latency and error rates to detect any issues and automatically switch to a different CA that's available and performant. You may not know this, but one of our CAs has around 4 scheduled maintenance periods every month. When this happens, our automated systems kick in seamlessly, keeping everything running smoothly. This works so well that our internal teams don’t get paged anymore because everything <i>just works.</i></p>
    <div>
      <h4>Adopting best security practices and modern standards  </h4>
      <a href="#adopting-best-security-practices-and-modern-standards">
        
      </a>
    </div>
    <p>Security has always been, and will continue to be, Cloudflare’s top priority, and so maintaining the highest security standards to safeguard our customer’s data and private keys is crucial.</p><p>Over the past decade, the <a href="https://cabforum.org/">CA/Browser Forum</a> has advocated for reducing certificate lifetimes from 5 years to 90 days as the industry norm. This shift helps minimize the risk of a key compromise. When certificates are renewed every 90 days, their private keys remain valid for only that period, reducing the window of time that a bad actor can make use of the compromised material.</p><p>We fully embrace this change and have made 90 days the default certificate validity period. This enhances our security posture by ensuring regular key rotations, and has pushed us to develop tools like DCV Delegation that promote <a href="https://www.cloudflare.com/application-services/solutions/certificate-lifecycle-management/">automation</a> around frequent certificate renewals, without the added overhead. It’s what enables us to offer certificates with validity periods as low as two weeks, for customers that want to rotate their private keys at a high frequency without any concern that it will lead to certificate renewal failures.</p><p>Cloudflare has always been at the forefront of new protocols and standards. <a href="https://www.cloudflare.com/press-releases/2014/cloudflare-offers-the-industrys-first-universal-ssl-for-free/">It’s no secret</a> that when we support a new protocol, adoption skyrockets. This month, we will be adding <a href="/ecdsa-the-digital-signature-algorithm-of-a-better-internet">ECDSA</a> support for certificates issued from <a href="https://pki.goog/">Google Trust Services</a>. With <a href="https://www.cloudflare.com/learning/dns/dnssec/ecdsa-and-dnssec/">ECDSA</a>, you get the same level of security as RSA but with smaller keys. Smaller keys mean smaller certificates and less data passed around to establish a TLS connection, which results in quicker connections and faster loading times.</p>
    <div>
      <h4>Optimizing for future scale</h4>
      <a href="#optimizing-for-future-scale">
        
      </a>
    </div>
    <p>Today, Cloudflare issues almost 1 million certificates per day. With the recent shift towards shorter certificate lifetimes, we continue to improve our pipeline to be more robust. But even if our pipeline can handle the significant load, we still need to rely on our CAs to be able to scale with us. With every CA that we integrate, we instantly become one of their biggest consumers. We hold our CAs to high standards and push them to improve their infrastructure to scale. This doesn’t just benefit Cloudflare’s customers, but it helps the Internet by requiring CAs to handle higher volumes of issuance.</p><p>And now, with Let’s Encrypt shortening their chain of trust, we’re going to add an additional improvement to our pipeline — one that will ensure the best device compatibility for all.</p>
    <div>
      <h4>Supporting all clients — legacy and modern</h4>
      <a href="#supporting-all-clients-legacy-and-modern">
        
      </a>
    </div>
    <p>The upcoming Let’s Encrypt change will prevent legacy devices from making requests to domains or applications that are protected by a Let’s Encrypt certificate. We don’t want to cut off Internet access from any part of the world, which means that we’re going to continue to provide the best device compatibility to our customers, despite the change.</p><p>Because of all the recent enhancements, we are able to reduce our reliance on Let’s Encrypt without impacting the reliability or quality of service of our certificate pipeline. One certificate lifecycle (90 days) before the change, we are going to start shifting certificates to use a different CA, one that’s compatible with the devices that will be impacted. By doing this, we’ll mitigate any impact without any action required from our customers. The only customers that will continue to use Let’s Encrypt are ones that have specifically chosen Let’s Encrypt as the CA.</p>
    <div>
      <h3>What to expect of the upcoming Let’s Encrypt change</h3>
      <a href="#what-to-expect-of-the-upcoming-lets-encrypt-change">
        
      </a>
    </div>
    <p>Let’s Encrypt’s cross-signed chain will <a href="https://letsencrypt.org/2023/07/10/cross-sign-expiration.html">expire</a> on September 30th, 2024. Although Let’s Encrypt plans to stop issuing certificates from this chain on June 6th, 2024, Cloudflare will continue to serve the cross-signed chain for all Let’s Encrypt certificates until September 9th, 2024.</p><p>90 days or one certificate lifecycle before the change, we are going to start shifting Let’s Encrypt certificates to use a different certificate authority. We’ll make this change for all products where Cloudflare is responsible for the CA selection, meaning this will be automatically done for customers using Universal SSL and SSL for SaaS with the “default CA” choice.</p><p>Any customers that have specifically chosen Let’s Encrypt as their CA will receive an email notification with a list of their Let’s Encrypt certificates and information on whether or not we’re seeing requests on those hostnames coming from legacy devices.</p><p>After September 9th, 2024, Cloudflare will serve all Let’s Encrypt certificates using the ISRG Root X1 chain. Here is what you should expect based on the certificate product that you’re using:</p>
    <div>
      <h4>Universal SSL</h4>
      <a href="#universal-ssl">
        
      </a>
    </div>
    <p>With <a href="https://developers.cloudflare.com/ssl/edge-certificates/universal-ssl/">Universal SSL</a>, Cloudflare chooses the CA that is used for the domain’s certificate. This gives us the power to choose the best certificate for our customers. <b>If you are using Universal SSL, there are no changes for you to make to prepare for this change</b>. Cloudflare will automatically shift your certificate to use a more compatible CA.</p>
    <div>
      <h4>Advanced Certificates</h4>
      <a href="#advanced-certificates">
        
      </a>
    </div>
    <p>With <a href="https://developers.cloudflare.com/ssl/edge-certificates/advanced-certificate-manager/">Advanced Certificate Manager</a>, customers specifically choose which CA they want to use. If Let’s Encrypt was specifically chosen as the CA for a certificate, we will respect the choice, because customers may have specifically chosen this CA due to internal requirements, or because they have implemented certificate pinning, which we highly discourage.</p><p>If we see that a domain using an Advanced certificate issued from Let’s Encrypt will be impacted by the change, then we will send out email notifications to inform those customers which certificates are using Let’s Encrypt as their CA and whether or not those domains are receiving requests from clients that will be impacted by the change. Customers will be responsible for changing the CA to another provider, if they chose to do so.</p>
    <div>
      <h4>SSL for SaaS</h4>
      <a href="#ssl-for-saas">
        
      </a>
    </div>
    <p>With <a href="https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/security/certificate-management/">SSL for SaaS</a>, customers have two options: using a default CA, meaning Cloudflare will choose the issuing authority, or specifying which CA to use.</p><p>If you’re leaving the CA choice up to Cloudflare, then we will automatically use a CA with higher device compatibility.</p><p>If you’re specifying a certain CA for your custom hostnames, then we will respect that choice. We will send an email out to SaaS providers and platforms to inform them which custom hostnames are receiving requests from legacy devices. Customers will be responsible for changing the CA to another provider, if they chose to do so.</p>
    <div>
      <h4>Custom Certificates</h4>
      <a href="#custom-certificates">
        
      </a>
    </div>
    <p>If you directly integrate with Let’s Encrypt and use <a href="https://developers.cloudflare.com/ssl/edge-certificates/custom-certificates/">Custom Certificates</a> to upload your Let’s Encrypt certs to Cloudflare then your certificates will be bundled with the cross-signed chain, as long as you choose the bundle method “<a href="https://developers.cloudflare.com/ssl/edge-certificates/custom-certificates/bundling-methodologies/#compatible">compatible</a>” or “<a href="https://developers.cloudflare.com/ssl/edge-certificates/custom-certificates/bundling-methodologies/#modern">modern</a>” and upload those certificates before September 9th, 2024. After September 9th, we will bundle all Let’s Encrypt certificates with the ISRG Root X1 chain. With the “<a href="https://developers.cloudflare.com/ssl/edge-certificates/custom-certificates/bundling-methodologies/#user-defined">user-defined</a>” bundle method, we always serve the chain that’s uploaded to Cloudflare. If you upload Let’s Encrypt certificates using this method, you will need to ensure that certificates uploaded after September 30th, 2024, the date of the CA expiration, contain the right certificate chain.</p><p>In addition, if you control the clients that are connecting to your application, we recommend updating the trust store to include the <a href="https://letsencrypt.org/certificates/#root-certificates">ISRG Root X1</a>. If you use certificate pinning, remove or update your pin. In general, we discourage all customers from pinning their certificates, as this usually leads to issues during certificate renewals or CA changes.</p>
    <div>
      <h2>Conclusion</h2>
      <a href="#conclusion">
        
      </a>
    </div>
    <p>Internet standards will continue to evolve and improve. As we support and embrace those changes, we also need to recognize that it’s our responsibility to keep users online and to maintain Internet access in the parts of the world where new technology is not readily available. By using Cloudflare, you always have the option to choose the setup that’s best for your application.</p><p>For additional information regarding the change, please refer to our <a href="https://developers.cloudflare.com/ssl/reference/migration-guides/lets-encrypt-chain/">developer documentation</a>.</p> ]]></content:encoded>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Application Services]]></category>
            <category><![CDATA[TLS]]></category>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[Deep Dive]]></category>
            <guid isPermaLink="false">ymep6DaFvevM4m2AIdw5F</guid>
            <dc:creator>Dina Kozlov</dc:creator>
        </item>
        <item>
            <title><![CDATA[A tour through Merkle Town, Cloudflare's Certificate Transparency dashboard]]></title>
            <link>https://blog.cloudflare.com/a-tour-through-merkle-town-cloudflares-ct-ecosystem-dashboard/</link>
            <pubDate>Sat, 24 Mar 2018 02:59:29 GMT</pubDate>
            <description><![CDATA[ The success of Certificate Transparency rests on the existence of a robust ecosystem of logs and log operators.  ]]></description>
            <content:encoded><![CDATA[ <p><i>For a quick primer on </i><a href="/introducing-certificate-transparency-and-nimbus"><i>Certificate Transparency</i></a><i>, please read my colleague Nick Sullivan’s post from earlier today. The discussion below expands on that post and details how Cloudflare monitors the health and performance of Certificate Transparency (CT) logs.</i></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1vH4aWBui9mA6DKcTeR4YA/39761d996b3838dc4b66aafce0c9b25e/merkle-town.png" />
            
            </figure><p>The success of Certificate Transparency rests on the existence of a robust ecosystem of logs and log operators. Without logs that CAs can depend on, it’s not practical for browsers to require that <a href="https://www.cloudflare.com/application-services/products/ssl/">SSL certificates</a> have been logged to be trusted—as Chrome <a href="https://groups.google.com/a/chromium.org/forum/#!topic/ct-policy/wHILiYf31DE">plans to do</a> on April 30. With this deadline fast approaching and others browsers likely to follow suit, it’s critical that the CT ecosystem continues to strengthen and expand with new log operators.</p><p>As we <a href="/introducing-certificate-transparency-and-nimbus/">wrote about</a> earlier today, Cloudflare recently joined this group of <a href="https://github.com/chromium/ct-policy#qualified-logs">trusted log operators</a>, helping strengthen this critical ecosystem. Now, we’d like to take you on a quick guide through our new publicly accessible tool that tracks the health of all trusted logs. In addition to basic uptime and response times, <a href="https://ct.cloudflare.com/">Merkle Town</a> provides statistics on the type and frequency of certificates issued, the top issuers, and the inter-dependencies CAs have on existing logs and each other. Click here to jump right into our CT ecosystem dashboard, or continue reading for a quick overview of what we’ve built.</p>
    <div>
      <h2>Dashboard Overview</h2>
      <a href="#dashboard-overview">
        
      </a>
    </div>
    <p>The dashboard is divided into two pages: the list of monitored logs and analyses of certificates found while monitoring. The latter can be grouped into the following sections:</p><ul><li><p>Certificate Breakdown by Type</p></li><li><p>Root Certificate Authorities</p></li><li><p>Global Details</p></li><li><p>Legacy Algorithms</p></li><li><p>Issuance Per Day By Certificate Authority</p></li><li><p>Log Utilization by Large Certificate Authorities</p></li></ul>
    <div>
      <h3>Log List</h3>
      <a href="#log-list">
        
      </a>
    </div>
    <p>On this page we list all of the logs that we’re actively monitoring. The set is currently comprised of all logs trusted by Chrome, with one exception: WoSign has <a href="https://groups.google.com/a/chromium.org/forum/#!topic/ct-policy/UcCqlxuz_1c">recently been distrusted</a> and will be removed soon. We also plan to expand our list once Mozilla, Apple, and others (finally) codify their CT policies.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1GTCbLzGoF22QFyZ1udbJj/0bee1e2ea6cc6b3dadeb391d83b9eb02/log-list.png" />
            
            </figure>
    <div>
      <h3>Monitoring Methodology</h3>
      <a href="#monitoring-methodology">
        
      </a>
    </div>
    <p>For each log listed, we fetch the current Signed Tree Head (STH) and set of trusted roots once per minute. New entries that we haven’t seen yet are crawled, and we periodically submit strictly-valid unexpired certificates or pre-certificates to each log (unless the log is sharded by year, in which case we submit a certificate expiring in that year regardless of expiration status).</p><p>All requests to a log count towards our estimate of its uptime and response time. A specific endpoint's uptime, e.g., <a href="https://tools.ietf.org/html/rfc6962#section-4.3">get-sth</a> or <a href="https://tools.ietf.org/html/rfc6962#section-4.6">get-entries</a>, is computed as the percentage of requests to that endpoint that succeed—return a 200 status code with a valid response—in a 90 day rolling window. An endpoint's response time is computed as the average amount of time it takes to fully receive and parse a response after sending the request (again over a 90 day rolling window). Putting these together, we can compute the log's uptime and response times by taking the fair average of the uptime and response times for all monitored endpoints.</p><p>Note that some parts of the monitor may enforce different timeouts or will retry in the event that a request fails, while others will not. For example, <code>get-roots</code> and <code>get-sth</code> will start retrying more often if there's a failure, but if <code>add-chain</code> fails that doesn't change when the next <code>add-chain</code> will get sent. This behavior means that downtime may be penalized unfairly relative to a more intuitive interpretation of “downtime”. Lastly, the response time of the get-entries endpoint is strongly correlated with the number of entries it returns, but this information is currently ignored by our monitor.</p>
    <div>
      <h3>Certificate Breakdown by Type</h3>
      <a href="#certificate-breakdown-by-type">
        
      </a>
    </div>
    <p>On this section of the dashboard we group all certificates found across CT logs we monitor into the following categories: Validation Level; Public Key Algorithm; Signature Algorithm; Entry Type; and Expired v. Current. Selecting one slice of a chart will filter the other charts by this selection, as well as the Root Certificate Authorities section below the pie charts.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/45obK1BTk6zdZRV7k5aCwZ/262a3892ad692265de67589b1242860d/ev-gif.gif" />
            
            </figure><p>In the example shown above, I start by clicking “Other” in the Validation Level chart to discard the 315 million DV certs found. Then, I click on “Extended” to show only EV certificates and “Current” in the Expired v. Current chart to filter out expired certificates. From here I hover over the Root Certificate Authorities horizontal bar chart to see the distribution of unexpired EVs across roots. Note that we don’t (yet) group roots by owner, e.g., GeoTrust is listed separately rather than part of DigiCert, who purchased the brand along with the rest of Symantec’s CA business.</p><p>EV was the first type of certificate that was <a href="https://github.com/chromium/ct-policy/blob/master/ct_policy.md">required to have been logged</a> in CT. Chrome enforced this starting in 2015 and any EV certificates that are not logged do not receive the semi-standardized treatment of showing the organization’s legal name and country.</p><p>Another interesting observation from Merkle Town, as observed the day this post was published, is that RSA represents 93% of all certificates in our database but only 91% of unexpired certificates. This data indicates increased adoption of <a href="/ecdsa-the-digital-signature-algorithm-of-a-better-internet/">elliptic curve cryptography</a>, a technology that uses smaller keys than RSA (at equivalent cryptographic strength), resulting in less load on the terminating server and fewer bytes sent over the wire during the TLS handshake.</p>
    <div>
      <h3>Root Certificate Authorities</h3>
      <a href="#root-certificate-authorities">
        
      </a>
    </div>
    <p>Here we break down certificate count based on the root to which it chains. The animation below has been filtered to show only current certificates, across all validation types. Note also that the roots displayed have not been grouped by owner.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/66hNPZ3bTZtXWzhB3pXi5m/4dbe773525d76709b4ea327f27fbb7c2/root-gif.gif" />
            
            </figure><p>As can be seen as I continuously drill into the “Other” category, there is a long tail of browser-trusted CAs with very few unexpired certificates. Certificate Transparency and policy enforcement does not discriminate based on issuer size: soon any certificate issued worldwide must be logged or risk not being trusted.</p>
    <div>
      <h3>Global Details</h3>
      <a href="#global-details">
        
      </a>
    </div>
    <p>This section is quite simple, but helps put into perspective the scale at which web PKI operates. As captured on the day this post was written, we’re observing 33,906 certificates issued and 28,955 expiring per hour.</p><p>Remarkably, roughly three-quarters of this issuance can be <a href="https://letsencrypt.org/stats/#daily-issuance">attributed to Let’s Encrypt</a>. Now that they <a href="https://community.letsencrypt.org/t/acme-v2-and-wildcard-certificate-support-is-live/55579">offer wildcard certificates</a>, it will be interesting to observe how this rate changes: wildcards expand the universe of users they can serve, but decreases the number of certificates required per domain.</p>
    <div>
      <h3>Legacy Algorithms</h3>
      <a href="#legacy-algorithms">
        
      </a>
    </div>
    <p>In the future we plan to offer the ability to drill down into categories to view specific certificates, especially those using deprecated algorithms. For now, you can see counts of still-valid certificates signed using deprecated algorithms such as RSA-MD2 (4), RSA-MD5 (22), and RSA-SHA1 (744,732).</p>
    <div>
      <h3>Issuance Per Day By Certificate Authority</h3>
      <a href="#issuance-per-day-by-certificate-authority">
        
      </a>
    </div>
    <p>Globally there are upwards of 1,000,000 certificates issued per day. As previously mentioned, Let’s Encrypt represents approximately 75-80% of this issuance—except for days when Cloudflare accelerates issuance through DigiCert. On these days, as shown below in the two rightmost-bars, Let’s Encrypt represents 70%.</p><p>Chrome’s upcoming "not secure" labeling of HTTP sites has been driving intense adoption of HTTPS using Cloudflare's <a href="https://www.cloudflare.com/ssl-for-saas-providers/">SSL for SaaS provider offering</a>. Our customers are moving tens of thousands of sites per day from HTTP to HTTPS using our custom hostnames API.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6vDFSsmdRVETZsmOqw3Att/16bd01e3516f94dbfbf92970bae81225/issuance-by-day.png" />
            
            </figure>
    <div>
      <h3>Log Utilization by Large Certificate Authorities</h3>
      <a href="#log-utilization-by-large-certificate-authorities">
        
      </a>
    </div>
    <p>As we <a href="/introducing-certificate-transparency-and-nimbus#lettingbrowsersknowthatcertificatesarelogged">explained earlier today</a>, the most popular way to let browsers that know that a SSL certificate has been logged to CT is by embedding SCTs in the certificate. This process takes place before the certificate has been signed and provided to the website operator, so it is critical that it be performed reliably and quickly.</p><p>The chart below shows that CAs typically obtain their SCTs from the same set of logs, operated by other CAs. In some cases, CAs will allow other CAs to log for free, while in other cases they may charge a modest sum to offset the cost of operating the log. Cloudflare has been working with CAs to help them streamline this process, by providing APIs that (in parallel) acquire SCTs in accordance with browsers’ CT policies.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3M9WKOeTgDUwLMqIaio23K/8e32fc0ac92cf192db5dba88c793408d/ca-interdependencies.png" />
            
            </figure>
    <div>
      <h2>Help spread the transparency</h2>
      <a href="#help-spread-the-transparency">
        
      </a>
    </div>
    <p>Merkle Town was built by Cloudflare Cryptography Team Engineer, Brendan McMillion. Want to work with Brendan, <a href="/author/nick-sullivan/">Nick Sullivan</a>, and the rest of the Cloudflare Crypto team? You're in luck as <a href="https://www.cloudflare.com/careers/jobs/?department=Engineering">they're hiring</a> full time Cryptography Engineers and interns in San Francisco and London. Apply today and help us further strengthen encryption on the web.</p><p>Additionally, as I said at the outset of this post, Certificate Transparency relies on a robust ecosystem of logs and log operators. CT improves the security of everyone using HTTPS, so if your organization has the resources to stand up a log, free to reach out to us at <a>ct-logs@cloudflare.com</a>. Drop us a line and we’d be happy to point you in the right direction.</p> ]]></content:encoded>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[TLS]]></category>
            <category><![CDATA[HTTPS]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Dashboard]]></category>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[Certificate Transparency]]></category>
            <guid isPermaLink="false">33ozLn8pBgiSgCOPSW07yk</guid>
            <dc:creator>Patrick R. Donahue</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing Certificate Transparency and Nimbus]]></title>
            <link>https://blog.cloudflare.com/introducing-certificate-transparency-and-nimbus/</link>
            <pubDate>Fri, 23 Mar 2018 14:45:00 GMT</pubDate>
            <description><![CDATA[ Certificate Transparency (CT) is an ambitious project to help improve security online by bringing accountability to the system that protects HTTPS.  ]]></description>
            <content:encoded><![CDATA[ <p>Certificate Transparency (CT) is an ambitious project to help improve security online by bringing accountability to the system that protects HTTPS. Cloudflare is announcing support for this project by introducing two new public-good services:</p><ul><li><p><i>Nimbus</i>: A free and open certificate transparency log</p></li><li><p><a href="https://ct.cloudflare.com"><i>Merkle Town</i></a>: A dashboard for exploring the certificate transparency ecosystem</p></li></ul><p>In this blog post we’ll explain what Certificate Transparency is and how it will become a critical tool for ensuring user safety online. It’s important for website operators and certificate authorities to learn about CT as soon as possible, because participating in CT becomes mandatory in Chrome for all certificates issued after April 2018. We’ll also explain how Nimbus works and how CT uses a structure called a Merkle tree to scale to the point of supporting all trusted certificates on the Internet. For more about Merkle Town, read the <a href="/a-tour-through-merkle-town-cloudflares-ct-ecosystem-dashboard/">follow up post</a> by my colleague Patrick Donahue.</p>
    <div>
      <h3>Trust and Accountability</h3>
      <a href="#trust-and-accountability">
        
      </a>
    </div>
    <p>Everything we do online requires a baseline level of trust. When you use a browser to visit your bank’s website or your favorite social media site, you expect that the server on the other side of the connection is operated by the organization indicated in the address bar. This expectation is based on trust, and this trust is supported by a system called the web <a href="https://en.wikipedia.org/wiki/Public_key_infrastructure">Public Key Infrastructure</a> (web PKI).</p><p>From a high level, a PKI is similar to a system of notaries who can grant servers the authority to serve websites by giving them a signed object called a digital certificate. This certificate contains the name of the website, the name of the organization that requested the certificate, how long it’s valid for, and a public key. For each public key, there is an associated private key. In order to serve an HTTPS site with a given certificate, the server needs to prove ownership of the associated private key.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/17ArZT2zzy50umQZFOznIA/d0315e3b412ce3c9376ed234f45c1cd0/image8.png" />
            
            </figure><p>Sites obtain digital certificates from trusted third parties called Certificate Authorities (CAs). CAs validate the operator’s ownership of a domain before issuing them a certificate. If the issuing CA for a certificate is trusted by the browser, then that certificate can be used to serve content over HTTPS to visitors of the site. All this happens under the hood of the browser and is only surfaced to user by the little green lock in your address bar, or a nasty error message if things go wrong.</p><p>The Web’s PKI is an elaborate and complicated system. There are dozens of organizations that operate the certificate authorities trusted by popular browsers. Different browsers manage their own “root programs” in which they choose which certificate authorities are trusted. Becoming a trusted CA often requires passing an audit (<a href="https://cabforum.org/webtrust-for-cas/">WebTrust for CAs</a>) and promising to follow a set of rules called the <a href="https://cabforum.org/baseline-requirements-documents/">Baseline Requirements</a>. These rules are set by a standards body called the CA/Browser forum, which consists of browsers and CAs. Each root program has their own application process and program-specific guidelines.</p><p>This system works great, until it doesn’t. As a system of trust, there are many ways for the PKI to fail. One of the risks inherent in the web PKI is that any certificate authority can issue any certificate for any website. That means that the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=408949">Hong Kong Post Office</a> can issue a certificate valid for gmail.com or facebook.com, and every browser will trust it. This forces users to put a lot of faith in certificate authorities and hope they don’t misbehave by issuing a certificate to the wrong person. Even worse, if a CA gets hacked, then an attacker could issue any certificate without the CA knowing, putting users at an even greater risk.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2DTDhhiLOKMayPifq2JmYH/105d45d24b3aa0fd696b87463792c9b8/image11.png" />
            
            </figure><p>If someone manages to get a certificate for a site that isn’t theirs, they can impersonate that site to its visitors and steal their information. To get a sense of how many CAs are trusted by popular browsers, <a href="https://ccadb-public.secure.force.com/mozilla/IncludedCACertificateReport">here’s the list</a> of the 160 trusted CAs in Firefox. Microsoft and Apple maintain their own lists, which are comparably long (Cloudflare keeps track of these lists in our <a href="https://github.com/cloudflare/cfssl_trust">cfssl_trust</a> repository). By trusting all of these organizations implicitly when you browse the internet, users bear the risk of certificate authority misbehavior.</p><p>What’s missing from the PKI is accountability. If a mis-issued certificate is used to target an individual, there is no feedback mechanism to let anyone know that the CA misbehaved.</p><p>This is not a theoretical situation. In 2011, DigiNotar, a Dutch CA, <a href="https://threatpost.com/final-report-diginotar-hack-shows-total-compromise-ca-servers-103112/77170/">was hacked</a>. The hacker used their access to the CA to issue a certificate for *.google.com. They then attempted to use this certificate to impersonate Gmail and targeted users in Iran in an attempt to compromise their personal information.</p><p>The attack was detected by Google using a technique called public key pinning. Key pinning is a <a href="https://blog.qualys.com/ssllabs/2016/09/06/is-http-public-key-pinning-dead">risky technique</a> and only viable for very technically savvy organizations. The value provided by key pinning is usually overshadowed by the operational risk it introduces. It’s often considered the canonical example of a “foot gun” mechanism. Key pinning is being <a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/he9tr7p3rZ8">deprecated by browsers</a>.</p><p>If key pinning is not the solution, what can be done to detect CA malfeasance? This is where Certificate Transparency comes in. The goal of CT is to make all certificates public so that mis-issued certificates can be detected and appropriate action taken. This helps bring accountability to balance the trust we collectively place in the fragile web PKI.</p>
    <div>
      <h3>Shining a light</h3>
      <a href="#shining-a-light">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2MQoZ8uEfBJZJbMWHSii9u/cd91d06e5206737c49a9ee6b7f2922ef/image12.jpg" />
            
            </figure><p><a href="https://www.pexels.com/@angele-j-35172">Creative Commons Zero (CC0) - angele-j</a></p><p>If all certificates are public, then so are mis-issued certificates. Certificate Transparency brings accountability to the web PKI using a technology called a blockchain an append-only public ledger, an ordered list. It puts trusted certificates into a list and makes that list available to anyone. That sounds easy, but given the decentralized nature of the internet, there are many challenges in making this a reliable bedrock for accountability.</p><p>The CT ecosystem is an extension of the PKI that introduces additional participants and roles. Along with browsers and CAs, new parties are introduced to play a role in the overall health of the system. These parties are:</p><ul><li><p>Log operators</p></li><li><p>Auditors</p></li><li><p>Monitors</p></li></ul><p>At a high level, a <i>log operator</i> is someone who manages the list of certificates than can only be added to. If someone submits a browser-trusted certificate to a log, it must be incorporated into the list within a pre-set grace period called a maximum merge delay (MMD), which is usually 24 hours. The log gives the submitter back a receipt, called a Signed Certificate Timestamp (SCT). An SCT is a promise to include the certificate in the log within the grace period. You can interact with a CT log via the CT API (defined in <a href="https://tools.ietf.org/html/rfc6962">RFC 6962</a>).</p><p>An <i>auditor</i> is a third party that keeps log operators honest. They query logs from various vantage points on the internet and <a href="https://tools.ietf.org/html/draft-ietf-trans-gossip-05">gossip</a> with each other about what order certificates are in. They’re like the paparazzi of the PKI. They also keep track of whether an SCT has been honored or not by measuring the time it took between the SCT’s timestamp and the corresponding certificate showing up in the log. Along with being a dashboard, the Merkle Town backend is also an auditor; it has even <a href="https://groups.google.com/a/chromium.org/forum/#!msg/ct-policy/92HIh2vG6GA/hBEHxcpoCgAJ">detected issues in other logs</a>.</p><p>A <i>monitor</i> is a service that helps alert websites of mis-issuance. It crawls logs for new certificates and alerts website owners if a new certificate is found for their domain. Popular monitors include SSLMate’s <a href="https://sslmate.com/certspotter/">CertSpotter</a> and Facebook’s <a href="https://developers.facebook.com/tools/ct/">Certificate Transparency Monitoring</a>. Cloudflare is planning on offering a free log monitoring service integrated into the Cloudflare dashboard for customers by the end of the year.</p>
    <div>
      <h4>Letting browsers know that certificates are logged</h4>
      <a href="#letting-browsers-know-that-certificates-are-logged">
        
      </a>
    </div>
    <p>One way to push the web to adopt CT is for browsers to start requiring website certificates to be logged. Validating that a certificate is logged by querying logs directly when a connection is made is a potential privacy issue (exposing browser history to a third party), and adds latency. Instead, a better way to ensure that a certificate is logged is to require the server to present SCTs, the inclusion receipts described in the last section.</p><p>There are multiple ways that an SCT can be presented to the client. The most popular way to is to embed the SCTs into the certificate when it’s issued. This involves the CA submitting a pre-certificate, a precursor to a certificate, to various CT logs to obtain SCTs before finalizing the certificate.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1X2MjNCxQqpKMNkwYvVcAh/e9db15c08ddff2447b7132ba98055464/image10.png" />
            
            </figure><p>For certificates that don’t have SCTs embedded, a server has other mechanisms to transmit SCTs to the client. SCTs can be included in the connection as a <a href="https://medium.com/@davetempleton/enabling-a-certificate-transparency-tls-extension-in-nginx-489b3b804f89">TLS extension</a>, or in a <a href="https://en.wikipedia.org/wiki/OCSP_stapling">stapled OCSP response</a>. These mechanisms are more difficult to do reliably, but they allow any certificate to be included in CT.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7a7iZnEIv9yKOif6dS8E79/436ad5a8386f5c8a9f0f471e3e117033/image14.png" />
            
            </figure><p>A certificate with embedded SCTs</p>
    <div>
      <h4>Browser CT requirements</h4>
      <a href="#browser-ct-requirements">
        
      </a>
    </div>
    <p>Not all logs are created equally. A malicious CA could collude with a set of logs to create a certificate and a set of SCTs and not ever incorporate the certificate into the logs. This certificate could then be used to attack users. To protect the ecosystem from collusion risks, the browsers that support CT have chosen to only accept SCTs from a list of vetted logs that are actively audited. There are also diversity requirements: logs should be managed by different entities on different infrastructures to avoid collusion and shared outages. Connections are said to be “CT Qualified” if they provide the client with enough SCTs from vetted logs to suit the risk profile of the certificate.</p><p>In order for a connection to be CT qualified in Chrome, it has to follow Chrome’s <a href="https://github.com/chromium/ct-policy/blob/master/ct_policy.md">CT Policy</a>. For most certificates, this means an SCT needs to be presented for at least one Google and one non-Google log trusted by Chrome. Long-lived certificates more than two SCTs.</p><p>In order to become trusted by Chrome, a CT log must submit itself for inclusion and pass a 90 day monitoring period in which it must pass some stringent requirements including the following:</p><ul><li><p>Have no outage that exceeds an MMD (maximum merge delay) of more than 24 hours</p></li><li><p>Have 99% uptime, with no outage lasting longer than the MMD (as measured by Google)</p></li><li><p>Incorporate a certificate for which an SCT has been issued by the Log within the MMD</p></li><li><p>Maintain the append-only property of the of the Log by providing consistent views of the Merkle Tree at all times and to all parties</p></li></ul><p>The full policy is <a href="https://github.com/chromium/ct-policy/blob/master/log_policy.md">here</a>. The complete list of vetted logs is available <a href="https://www.gstatic.com/ct/log_list/log_list.json">here</a>. Nimbus, Cloudflare’s family of CT logs, was included in Chrome 65, which is the current stable version of the Browser.</p>
    <div>
      <h4>All or nothing</h4>
      <a href="#all-or-nothing">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2gbUWaez8iOEBmGrTpRLtu/f087b62d12e5a27f8f30e178fc621d1f/image2.jpg" />
            
            </figure><p><a href="https://commons.wikimedia.org/wiki/File:CISV_trust_game.JPG">Creative Commons Attribution-Share Alike 3.0 - Gorskiya</a></p><p>CT only protects users if all certificates are logged. If a CA issues a certificate that is not logged in CT and will be trusted by browsers, then users can still be subject to targeted attacks.</p><p>For the last few years, Chrome has <a href="https://www.certificate-transparency.org/ev-ct-plan">required all Extended Validation (EV) certificates</a> to be CT qualified. Cloudflare has been making sure all that connections to Cloudflare are CT Qualified for Chrome and have been since May 2017. This is done using an automatic submission service related to our recent OCSP <a href="/high-reliability-ocsp-stapling/">stapling project</a> and the SCT TLS extension. We monitor whether or not the set of SCTs we provide is conformant with browser policies using the <a href="https://tools.ietf.org/html/draft-ietf-httpbis-expect-ct-03">Expect-CT header</a>, which reports client errors back to our servers. Expect CT is included in every HTTPS response Cloudflare serves.</p><p>This isn’t enough. As long as there are certificates that are trusted by browsers that are not required to be CT Qualified, then users are at risk. This is why the Chrome team announced that they will require Certificate Transparency for all newly issued, publicly trusted certificates starting in <a href="https://groups.google.com/a/chromium.org/forum/#!topic/ct-policy/sz_3W_xKBNY">April 2018</a>.</p>
    <div>
      <h4>Changes for Certificate Authorities</h4>
      <a href="#changes-for-certificate-authorities">
        
      </a>
    </div>
    <p>The safest way to make sure a certificate is always CT qualified when shown to a browser is to embed enough SCTs from vetted logs to conform to the browser’s policy. This is a big operational change for some CAs, because</p><ul><li><p>It adds the additional step of having to understand which SCTs are required for different browsers’ CT policies and keeping up to date with policy changes</p></li><li><p>It adds a step in the issuance process where pre-certificates are to different logs before the certificate is issued</p></li><li><p>Some CT logs may have outages or be slow to respond, so fallback strategies may be required to not delay issuance</p></li></ul><p>If you’re a CA operator and are struggling to implement this or worried about the additional delay caused by submitting pre-certificates to logs, Cloudflare can help. We’re offering an experimental API for CAs that takes pre-certificates and returns a valid set of SCTs for a given certificate. This API handles sorting out the browser policies and leverages <a href="https://www.cloudflare.com/argo/">Argo Smart Routing</a> to return SCTs with as little delay as possible. Please contact our CT team at <a>ct-logs@cloudflare.com</a> if you have any interest in this offering.</p>
    <div>
      <h3>Building a verifiable globally consistent log</h3>
      <a href="#building-a-verifiable-globally-consistent-log">
        
      </a>
    </div>
    <p>The PKI is huge. The <a href="/https-or-bust-chromes-plan-to-label-sites-as-not-secure/">industry-wide push for HTTPS</a> has introduced millions of new certificates into the web PKI. There are over a quarter-billion(!) certificates logged in CT, and this number is growing by almost a million per day. This number is sure to grow as we approach Chrome’s April deadline. Managing a high availability database of this size that you can only add to (a property called append-only) is a substantial engineering challenge.</p><p>The naïve data structure to use for an append-only database is a hash chain. In a hash chain, elements are aligned in order and combined using a <a href="https://simple.wikipedia.org/wiki/Cryptographic_hash_function">one-way hash function</a> like SHA-256. The diagram below describes how a hash chain is created from a list of values d1 to d8. Start with the first element, d1, which is hashed to a value a, which then becomes the head of the chain. Every time an element is added to the chain, a hash function is computed over two inputs: the current chain head and the new element. This hash value become the new chain head. Because one-way hash functions can’t be reversed, it’s computationally infeasible to change a value without it changing the entire chain that has been computed from it. This makes a hash chain’s history very difficult to modify maliciously.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2v25fx7zDjnAqEUvNdLnVU/65bc5aa6933a36cbd7e85d69bcf19a41/image7.gif" />
            
            </figure><p>A hash chain is the optimal data structure for inserting new elements: only one hash needs to be computed for each element added. However, it is not an efficient data structure for validating whether an element is correctly included in a chain given a chain head. In the example below, there are six additional elements (b, d4-d8) needed to validate that d3 is correct on a chain of 8 values. You need approximately n/2 elements to verify an average element in a chain of length n. In computer science terms, this is called “linear scaling.”</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5fq19rbF5uMj1Xb2BRomJj/b4b54a16ca7cb6205b2d1b278a1c9258/image4.gif" />
            
            </figure><p>When building a system, it’s best to try to reduce complexity for the participants involved. For CT, the main participants we care about are the log operator and the auditor. If we were to choose a hash chain as our data structure, the job of the log operator would be easy but that of the auditor would be very hard. We can do better.</p><p>When you ask a computer scientist how to optimize an algorithm, nine out of ten times, the solution they will suggest is to use a tree (the other 1/10 times, they’ll suggest a <a href="https://en.wikipedia.org/wiki/Bloom_filter">Bloom filter</a>). That’s exactly what we can do here. Specifically, we can use a data structure called a Merkle Tree. It’s like a hash chain, but rather than hashing elements in a line, you hash them in pairs.</p><p>For each new element, instead of hashing it into a running total, you arrange the elements into a <a href="https://en.wikipedia.org/wiki/Binary_tree">balanced binary tree</a> and compute the hash of the element with its sibling. This gives you half as many hashes as elements. These hashes are then arranged in pairs and hashed together to create the next level of the tree. This continues until you have one element, the top of the tree; this is called the tree head. Adding a new value to a Merkle tree requires the modification of at most one hash per level in the tree, following the path from the element up to the tree head.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/255yicnSkcbR6yUYKDh3s6/5658e680fd0a965f991bf8e0000e49db/image11.gif" />
            
            </figure><p>The depth of a binary tree is <a href="https://en.wikipedia.org/wiki/Logarithmic_scale">logarithmic</a> with respect to the number of elements. Roughly speaking, if the tree size is 8 = 2^3, then the depth is 4 (= 3+1), if it’s 1024 = 2^10 then the tree depth is 11 (= 10+1), for 1048576 = 2^20 the tree size is 21 (= 20+1). The cost of insertion is at most log_2(size), which is worse than in a hash chain, but generally not too bad.</p><p>What makes the Merkle tree so useful is the efficiency of element validation. Instead of having to compute n/2 hashes like in a hash chain, you only need the elements in the tree that lead you to the root. This is called the co-path. In the diagram below, the co-path is computed for d3.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3LUFI4MfjCHSojuxEyyaPC/11cf7ab9c28fa92fbd799e2e3cdbfeb3/image5.gif" />
            
            </figure><p>The copath consists of one value per level of the tree. The computation necessary to prove that an element is correct (an inclusion proof) is therefore logarithmic, not linear as in the case of a hash tree. Both insertion and validation are cheap relative to the size of the tree, making a Merkle tree the ideal data structure for CT.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2FpSweNBiv0xNDaXT6xZQ2/9e7f2c61b8bce51926a9a6f6346b89fa/image6.png" />
            
            </figure><p>A certificate transparency log is a Merkle tree where the leaf elements are certificates. Each log has a private key that it uses to sign the current tree head at regular intervals. Some CT logs are huge with over a hundred million entries, but because of the efficiency of Merkle trees, inclusion proofs only require around 30 hashes. This structure provides a good balance between the cost to the log operator of adding certificates and the cost to the auditor of validating its consistency.</p>
    <div>
      <h3>Nimbus</h3>
      <a href="#nimbus">
        
      </a>
    </div>
    <p>Our own addition to the log ecosystem is Nimbus. Nimbus is a family of Certificate Transparency logs with an open acceptance policy. Nimbus accepts any certificate that is signed by a CA from our <a href="https://github.com/cloudflare/cfssl_trust">cfssl_trust</a> root store. The logs are organized by year, e.g. Nimbus 2018, Nimbus 2019, etc. with each log only accepting certificates that expire in that year.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2yxv4DH2K2TDPjxlI6DUbG/6292fc800aa8db6382ab4427eecd15ef/image8-1.png" />
            
            </figure><p>Nimbus is built with <a href="https://github.com/google/trillian">Trillian</a>, a Go-based implementation of a scalable Merkle tree. The data backend is custom, re-using components from Cloudflare’s high <a href="/how-cloudflare-analyzes-1m-dns-queries-per-second/">capacity logging infrastructure</a>, which runs entirely on Cloudflare’s bare metal infrastructure. Having a high-reliability and completely open log that is not dependent on shared cloud infrastructure adds insurance in case of outages. Nimbus is intended to bring diversity and stability to the CT ecosystem, and in the end, make the internet safer for everyone.</p> ]]></content:encoded>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[HTTPS]]></category>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[Research]]></category>
            <category><![CDATA[Cryptography]]></category>
            <category><![CDATA[Certificate Transparency]]></category>
            <guid isPermaLink="false">6R7Ib63o9iMkS1CgcMXOr1</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
        <item>
            <title><![CDATA[CAA of the Wild: Supporting a New Standard]]></title>
            <link>https://blog.cloudflare.com/caa-of-the-wild/</link>
            <pubDate>Thu, 07 Dec 2017 14:00:00 GMT</pubDate>
            <description><![CDATA[ One thing we take pride in at Cloudflare is embracing new protocols and standards that help make the Internet faster and safer. Sometimes this means that we’ll launch support for experimental features or standards still under active development, as we did with TLS 1.3. ]]></description>
            <content:encoded><![CDATA[ <p>One thing we take pride in at Cloudflare is embracing new protocols and standards that help make the Internet faster and safer. Sometimes this means that we’ll launch support for experimental features or standards still under active development, <a href="/introducing-tls-1-3/">as we did</a> with TLS 1.3. Due to the not-quite-final nature of some of these features, we limit the availability at the onset to only the most ardent users so we can observe how these cutting-edge features behave in the wild. Some of our observations have helped the community propose revisions to the corresponding RFCs.</p><p>We began supporting the DNS <a href="https://tools.ietf.org/html/rfc6844">Certification Authority Authorization (CAA) Resource Record</a> in June behind a beta flag. Our goal in doing so was to see how the presence of these records would affect <a href="https://www.cloudflare.com/application-services/products/ssl/">SSL certificate</a> issuance by publicly-trusted certification authorities. We also wanted to do so in advance of the <a href="https://cabforum.org/2017/03/08/ballot-187-make-caa-checking-mandatory/">8 September 2017 enforcement date</a> for mandatory CAA checking at certificate issuance time, without introducing a new and externally unproven behavior to millions of Cloudflare customers at once. This beta period has provided invaluable insight as to how CAA records have changed and will continue to change the commercial public-key infrastructure (PKI) ecosystem.</p><p>As of today, we’ve removed this beta flag and all users are welcome to add CAA records as they see fit—without having to first contact support. Note that if you’ve got Universal SSL enabled, we’ll automatically augment your CAA records to allow issuance from our CA partners; if you’d like to disable Universal SSL and provide your own certificates, you’re welcome to do that too.Below are some additional details on CAA, the purpose of this record type, and how its use has evolved since it was first introduced. If you’d rather just jump to the details of our implementation, <a href="#caa-and-cloudflare">click here</a> and we’ll take you to the relevant section of the post.</p>
    <div>
      <h4>The Publicly-Trusted PKI Ecosystem — Abridged</h4>
      <a href="#the-publicly-trusted-pki-ecosystem-abridged">
        
      </a>
    </div>
    <p>Before diving into CAA it’s helpful to understand the purpose of a public key infrastructure (PKI). Quite simply, PKI is a framework that’s used to secure communications between parties over an insecure public network. In “web PKI”, the PKI system that’s used to secure communications between your web browser and this blog (for example), the TLS protocol is used with SSL certificates and private keys to protect against eavesdropping and tampering.</p><p>While TLS handles the sanctity of the connection, ensuring that nobody can snoop on or mess with HTTPS requests, how does your browser know it’s talking to the actual owner of blog.cloudflare.com and not some imposter? Anyone with access to OpenSSL or a similar tool can generate a certificate purporting to be valid for this hostname but fortunately your browser only trusts certificates issued (or “signed by”) by certain well-known parties.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/tTMIE50NuXq1J2phXhoPr/3d2d302cf9e84a7dbdf6e268f9b55360/illustration-ssl-certificate.png" />
            
            </figure><p>These well-known parties are known as certification authorities (CAs). The private and public key that form the certificate for <code>blog.cloudflare.com</code> were generated on Cloudflare hardware, but the stamp of approval—the signature—was placed on the certificate by a CA. When your browser receives this “leaf” certificate, it follows the issuer all the way to a “root” that it trusts, validating the signatures along the way and deciding whether to accept the certificate as valid for the requested hostname.</p><p>Before placing this stamp of approval, CAs are supposed to take steps to ensure that the certificate requester can demonstrate control over the hostname. (In some cases, as you’ll learn below, this is not always the case, and is one of the reasons that CAA was introduced.)</p>
    <div>
      <h4>Anthropogenic Threats</h4>
      <a href="#anthropogenic-threats">
        
      </a>
    </div>
    <p>Given that people are imperfect beings and prone to making mistakes or poor judgement calls, it should come to the surprise of no one that the PKI ecosystem has a fairly blemished track-record when it comes to maintaining trust. Clients, CAs, servers, and certificate requesters are all created or operated by people who have made mistakes.</p><p><i>Jurassic Park. 1993, Stephen Spielberg [Film] Universal Pictures.</i></p><p>Client providers have been known to <a href="https://en.wikipedia.org/wiki/Superfish">add compromising certificates to the local trust store</a> or <a href="/understanding-the-prevalence-of-web-traffic-interception/">install software to intercept secure connections</a>; servers have been demonstrated to <a href="/answering-the-critical-question-can-you-get-private-ssl-keys-using-heartbleed/">leak private keys</a> or <a href="/microsoft-tls-downgrade-schannel-bug/">be unable to properly rotate session ticket keys</a>; CAs have <a href="https://security.googleblog.com/2016/10/distrusting-wosign-and-startcom.html">knowingly mis-issued certificates</a> or <a href="https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html">failed to validate hostname ownership or control reliably</a>; and individuals requesting certificates include phishers creating convincing imposter versions of popular domains and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1332714">obtaining valid and trusted certificates</a>. Every party in this ecosystem is not completely without blame in contributing to a diminished sense of trust.</p><p>Of these many problems (most of which have already been addressed or are in the process of being resolved), perhaps the most unsettling is the willful mis-issuance of certificates by trusted CAs. Knowingly issuing certificates to parties who haven't demonstrated ownership, or issuance outside the parameters defined by the <a href="https://cabforum.org/about-us/">CA/Browser Forum</a> (a voluntary and democratic governing body for publicly-trusted certificates) by CAs who have certificates present in trust stores severely undermines the value of that trust store, all certificates issued by that CA, and the publicly-trusted PKI ecosystem as a whole.</p>
    <div>
      <h4>Solving One Problem...</h4>
      <a href="#solving-one-problem">
        
      </a>
    </div>
    <p>To help prevent future mis-issuance by publicly trusted CAs, a new DNS resource record was proposed by those CAs to help reduce the risk of certificate mis-issuance: The Certification Authority Authorization (CAA) Resource Record.</p><p>The general idea is that the owner of any given domain (e.g., example.com) would add CAA records at their authoritative DNS provider, specifying one or more CAs who are authorized to issue certificates for their domain.</p><p><a href="https://tools.ietf.org/html/rfc6844">RFC6844</a> currently specifies three property tags for CAA records: <code>issue</code>, <code>issuewild</code>, and <code>iodef</code>.</p><ul><li><p>The <code>issue</code> property tag specifies CAs who are authorized to issue certificates for a domain. For example, the record <code>example.com. CAA 0 issue "certification-authority.net"</code> allows the "Certification Authority" CA to issue certificates for example.com.</p></li><li><p>The <code>issuewild</code> property tag specifies CAs that are only allowed to issue certificates that specify a wildcard domain. E.g., the record <code>example.com. CAA 0 issuewild "certification-authority.net"</code> only allows the "Certification Authority" CA to issue certificates containing wildcard domains, such as <code>*.example.com</code>.</p></li><li><p>The <code>iodef</code> property tag specifies a means of reporting certificate issue requests or cases of certificate issuance for the corresponding domain that violate the security policy of the issuer or the domain name holder. E.g., the record <code>example.com. CAA 0 iodef "mailto:example@example.com"</code> instructs the issuing CA to send violation reports via email to the address provided at the attempted time of issuance.</p></li></ul><p>CAA records with the <code>issue</code> and <code>issuewild</code> tags are additive; if more than one are returned as the response for a <a href="https://www.cloudflare.com/learning/dns/what-is-dns/">DNS query</a> for a given hostname, the CAs specified in both records are both considered authorized.</p><p>If the authoritative DNS provider does not yet support CAA records or none are present in the zone file, the issuing CA is still authorized to issue when no records are present, largely preserving the issuance behavior before CAA records were an adopted standard.</p><p>As of 8 September 2017, all publicly-trusted CAs are now required to check CAA at issuance time for all certificates issued, thereby enabling certificate requestors (domain owners) to dictate which CAs can issue certificates for their domain.</p>
    <div>
      <h4>... with More Problems.</h4>
      <a href="#with-more-problems">
        
      </a>
    </div>
    <p>RFC6844 specifies a very curious CAA record processing algorithm:</p>
            <pre><code>The search for a CAA record climbs the DNS name tree from the
   specified label up to but not including the DNS root '.'.

   Given a request for a specific domain X, or a request for a wildcard
   domain *.X, the relevant record set R(X) is determined as follows:

   Let CAA(X) be the record set returned in response to performing a CAA
   record query on the label X, P(X) be the DNS label immediately above
   X in the DNS hierarchy, and A(X) be the target of a CNAME or DNAME
   alias record specified at the label X.

   o  If CAA(X) is not empty, R(X) = CAA(X), otherwise

   o  If A(X) is not null, and R(A(X)) is not empty, then R(X) =
      R(A(X)), otherwise

   o  If X is not a top-level domain, then R(X) = R(P(X)), otherwise

   o  R(X) is empty.</code></pre>
            <p>While the above algorithm is not easily understood at first, the example immediately following it is much easier to comprehend:</p>
            <pre><code>For example, if a certificate is requested for X.Y.Z the issuer will
   search for the relevant CAA record set in the following order:

      X.Y.Z

      Alias (X.Y.Z)

      Y.Z

      Alias (Y.Z)

      Z

      Alias (Z)

      Return Empty</code></pre>
            <p>In plain English, this means that if the owner of example.com requests a certificate for <code>test.blog.example.com</code>, the issuing CA must</p><ol><li><p>Query for a CAA record at <code>test.blog.example.com.</code>. If a CAA record exists for this hostname, the issuing CA stops checking for CAA records and issues accordingly. If no CAA record exists for this hostname and this hostname exists as an A or AAAA record, the CA then moves up the DNS tree to the next highest label.</p></li><li><p>Query for a CAA record at <code>blog.example.com.</code>. Just like the first check, if no CAA record exists for this hostname and this hostname exists as an A or AAAA record, the CA then continues traversing the DNS tree.</p></li><li><p>Query for a CAA record at <code>example.com.</code></p></li><li><p>Query for a CAA record at <code>com.</code></p></li></ol><p>At the end of the last step, the issuing CA has climbed the entire DNS tree (excluding the root) checking for CAA records. This functionality allows a domain owner to create CAA records at the root of their domain and have those records apply to any and all subdomains.</p><p>However, the CAA record processing algorithm has an additional check if the hostname exists as a CNAME (or DNAME) record. In this case, the issuing CA must also check the <b>target</b> of the CNAME record. Revisiting the example above for <code>test.blog.example.com.</code> where this hostname exists as a CNAME record, the issuing CA must</p><ol><li><p>Query for a CAA record at <code>test.blog.example.com.</code>. Since <code>test.blog.example.com.</code> exists as the CNAME <code>test.blog.example.com. CNAME test.blog-provider.net.</code>, the issuing CA must next check the target for the presence of a CAA record before climbing the DNS tree.</p></li><li><p>Query for a CAA record at <code>test.blog-provider.net.</code></p></li></ol><p>The issuing CA in this example is only at step two in the CAA processing algorithm and it has already come across two separate issues.</p><p>First, the issuing CA has checked the hostname requested on the certificate (<code>test.blog.example.com.</code>) and since that hostname exists as a CNAME record, it has also checked the target of that record (<code>test.blog-provider.net.</code>). However, if <code>test.blog-provider.net.</code> itself is also a CNAME record, the the CAA record processing algorithm states that the issuing CA must check the target of that CNAME as well.</p><p>In this case it is fairly simple to create a CNAME loop (or very long CNAME chain) either via an accidental misconfiguration or with malicious intent to prevent the issuing CA from completing the CAA check.</p><p>Second, <code>example.com</code> and <code>blog-provider.net</code> might not be owned and operated by the same entity or even exist in the same network. The RFC authors appear to be operating under the assumption that CNAME records are still used as they were in <a href="https://tools.ietf.org/html/rfc1034#3.6.2">November 1987</a>:</p><blockquote><p>A CNAME RR identifies its owner name as an alias, and specifies the corresponding canonical name in the RDATA section of the RR.</p></blockquote><p>This behavior may have been true thirty years ago, but consider the number and prevalence of SaaS providers in 2017; who truly is authoritative for the content addressed by a DNS record, the content creator (and likely <a href="https://www.cloudflare.com/learning/dns/glossary/what-is-a-domain-name/">domain name</a> owner who is using a CNAME) or the SaaS provider to whom the content creator subscribes?</p><p>Many if not all major service or application providers include clauses in their respective terms of service with regards to content added by the user to their account for the service. Intellectual property must be user-generated, properly licensed, or otherwise lawfully obtained. As content uploaded by users is difficult to control, liability limitations, indemnification, and service termination are all commonly used when the intellectual property added to the service is owned by another party, is unlawful, or is outside the definition of acceptable use. From a content perspective within the scope of a service provider's terms of service, it’s difficult to consider the service provider canonical for the content hosted there.</p><p>Using a real world example, there are currently 401,716 CNAME records in the zone files for domains on Cloudflare whose target is <code>ghs.google.com</code>. <a href="https://support.google.com/blogger/answer/58317?hl=en">This hostname</a> is given to subscribers of Google's Blogger service to use as the target of a CNAME so that a Blogger subscriber may use their own domain name in front of Google's service. With one CAA record, Google could dictate that nearly half a million blogs with a vanity domain name can only have one CA or no CAs issue certificates unless each of those hostnames created their own CAA records to allow issuance.</p><p>Even without following CNAMEs to their targets, the DNS climbing algorithm is not unproblematic. Operators of <a href="https://en.wikipedia.org/wiki/Top-level_domain">top-level domains</a> may decide that only certain issuing CAs are trustworthy or certain CAs are advantageous for business and create CAA records only allowing those CAs to issue. We already see this in action today with the pseudo-top level domain <a href="https://nl.eu.org/">nl.eu.org</a> which has the CAA record <code>nl.eu.org. CAA 0 issue "letsencrypt.org"</code>, which only allows issuance through Let's Encrypt without CAA records being present at the subdomains of <code>nl.eu.org</code>.</p><p>The authors of RFC6844 were also unwilling to secure their record and its use from any potential on-path attacks—</p><blockquote><p>Use of DNSSEC to authenticate CAA RRs is strongly RECOMMENDED but not required.</p></blockquote><p>Without DNSSEC, DNS responses are returned to the requestor in plain-text. Anyone in a privileged network position (a recursive DNS provider or ISP) could alter the response to a CAA query to allow or deny issuance as desired. As only about <a href="http://scoreboard.verisignlabs.com/">820,000</a> <code>.com</code> domain names out of the more than <a href="http://research.domaintools.com/statistics/tld-counts/">130 million</a> registered <code>.com</code> domain names are secured with DNSSEC, perhaps the low adoption rates influenced the decision to not make DNSSEC with CAA mandatory.</p><p>Moving beyond the RFC, the CA/Browser Forum's <a href="https://cabforum.org/wp-content/uploads/CA-Browser-Forum-BR-1.5.0.pdf">Baseline Requirements</a> (BR) attempt to clarify aspects regarding the behavior a CA should take when checking for CAA.</p><blockquote><p>CAs are permitted to treat a record lookup failure as permission to issue if:</p></blockquote><ul><li><p>the failure is outside the CA's infrastructure;</p></li><li><p>the lookup has been retried at least once; and</p></li><li><p>the domain's zone does not have a DNSSEC validation chain to the ICANN root</p></li></ul><p>Effectively, this means that if the CAA response is either a <code>SERVFAIL</code>, <code>REFUSED</code>, or the query times out, regardless of whether or not a CAA record exists, the CA is permitted to issue if this query fails more than once while attempting to issue a certificate. However, multiple CAs have told us that DNS lookup failures will prevent issuance regardless of the above conditions in the BR. In this case, something as benign as a transient network error could result in a denial of issuance or worse, any recursor that doesn’t understand and a query for CAA record will prevent issuance. We actually saw this with Comcast’s resolvers and reported the bug to their DNS provider.</p><p>There’s an additional security gap in that neither the RFC nor the BR indicate where the issuing CA should query for CAA records. It is acceptable within the current standards to query any DNS recursor for these records as well as the authoritative DNS provider for a domain. For example, an issuing CA could query <a href="https://www.cloudflare.com/cloudflare-vs-google-dns/">Google’s Public DNS</a> or a DNS recursor provided by their ISP for these responses. This enables compromised DNS recursors or one run by a rogue operator to alter these responses, either denying issuance or allowing issuance by a CA not approved by the domain owner. The RFC and BR should be amended so that an issuing CA must always query these records at the authoritative provider to close this gap.</p>
    <div>
      <h4>CAA and Cloudflare</h4>
      <a href="#caa-and-cloudflare">
        
      </a>
    </div>
    <p>As of today, CAA records are no longer in beta and all customers are able to add CAA records for their zones. This can be done in the DNS tab of the Cloudflare dashboard or via our <a href="https://api.cloudflare.com/#dns-records-for-a-zone-create-dns-record">API</a>.</p><p>When creating CAA records in the dashboard, an additional modal appears to help clarify the different CAA tag options and format the record correctly as an incorrectly formatted record would result in every CA not being able to issue a certificate.</p><p>Cloudflare is in a unique position to be able to complete SSL validation for a domain and have certificates issued on the domain owner's behalf. This is how Cloudflare is able to automatically provision and have our <a href="/introducing-universal-ssl/">Universal SSL</a> certificates issued for every domain active on Cloudflare for free.</p><p>Cloudflare partners with multiple CAs to issue certificates for our managed SSL products: Universal SSL, <a href="/dedicated-ssl-certificates/">Dedicated Certificates</a>, and <a href="/introducing-ssl-for-saas/">SSL for SaaS</a>. Since CAA record checking is now mandatory for publicly-trusted CAs, Cloudflare automatically adds the requisite CAA records to the zone when a user adds one or more CAA records in the Cloudflare dashboard for their domain in order to allow our partner CAs to continue to be able to issue certificates for each of our SSL products.</p><p>Some site owners may want to manage their own SSL certificates in order to be compliant with their own standard operating procedures or policies. Alternately, domain owners may only want to trust specific CAs that are not the CAs Cloudflare currently partners with to issue Universal SSL certificates. In the latter case, users now have the ability to disable Universal SSL.</p><p>When Universal SSL is disabled, the CAA records added to allow our partner CAs to issue certificates are deleted and all Universal SSL certificates available for the zone are removed from our edge. Dedicated certificates, custom certificates, as well as <a href="https://www.cloudflare.com/application-services/products/ssl-for-saas-providers/">SSL for SaaS certificates</a> are all individually managed by each customer and can be added or removed as needed.</p>
    <div>
      <h4>A Bright and Hopefully Not-Too-Distant Future</h4>
      <a href="#a-bright-and-hopefully-not-too-distant-future">
        
      </a>
    </div>
    <p>CAA as it exists today does very little to <a href="https://www.cloudflare.com/application-services/products/securitycenter/">reduce the attack surface</a> around certificate issuance while making it more difficult for well-intended parties to participate. That said, CAA is a young standard recently adopted by the web PKI community with many involved individuals as well as active parties working toward addressing some of the gaps present in the current RFC and committed to making the overall CAA experience better for both the certificate requesters and CAs.</p><p>To start, an <a href="https://www.rfc-editor.org/errata/eid5065">errata report</a> exists to clarify the CAA record processing algorithm and to reduce the degree in which the targets of CNAME records should be checked. Similarly, the DNS tree-climbing behavior of the CAA record processing algorithm is still <a href="https://mailarchive.ietf.org/arch/search/?email_list=spasm&amp;gbt=1&amp;index=QkL2PKWUadWpXBZULetCbk-9ViU">up for debate</a>. There are also <a href="https://mailarchive.ietf.org/arch/search/?email_list=spasm&amp;gbt=1&amp;index=ewf8iAv2cqS1_5ZmvfuK57goLYI">active discussions</a> around implementation issues, such as the recognition that some authoritative DNS resolvers incorrectly sign empty responses to CAA queries when DNSSEC is enabled for a zone and how to handle these cases in a way that would still allow CAs to issue. <a href="https://www.ietf.org/id/draft-hoffman-andrews-caa-simplification-02.txt">Proposals exist</a> suggesting new tags or property fields in CAA records, such as a CA requiring an account number in the property value for issue tags, or only allowing specific validation types (e.g., DV, OV, or EV). The Electronic Frontier Foundation (EFF) has expressed interest in hardening CAs against non-cryptographic attacks, particularly with a focus on the domain validation process for obtaining certificates. While not directly pertaining to CAA, any ideas or proposed hardening solutions might increase reliance on CAA or completely obviate the need for it altogether.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/35HzvskNIkHkztXA9Eq8fp/79076092e3540a211612ff53bc723d5b/standards.png" />
            
            </figure><p> <a href="https://creativecommons.org/licenses/by-nc/2.5/">CC BY-NC 2.5</a> by <a href="https://xkcd.com/about/">xkcd.com</a></p><p>As with all internet standards, none are perfect and all are far from permanent—CAA included. Being in the position to implement new standards at scale, seeing what effect adoption of those standards has, and working with the Internet community to address any issues or gaps is a privilege and allows us to live up to our mission of building a better Internet.</p><p>We're thrilled to be involved in efforts to make CAA (and any other standard) better for anyone and everyone.</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[DNS]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[TLS 1.3]]></category>
            <category><![CDATA[TLS]]></category>
            <category><![CDATA[Reliability]]></category>
            <category><![CDATA[Universal SSL]]></category>
            <category><![CDATA[Certificate Authority]]></category>
            <guid isPermaLink="false">3mWSshxk3v9PwoHKztcjAp</guid>
            <dc:creator>Max Nystrom</dc:creator>
        </item>
        <item>
            <title><![CDATA[How to make your site HTTPS-only]]></title>
            <link>https://blog.cloudflare.com/how-to-make-your-site-https-only/</link>
            <pubDate>Thu, 06 Jul 2017 13:35:00 GMT</pubDate>
            <description><![CDATA[ The Internet is getting more secure every day as people enable HTTPS, the secure version of HTTP, on their sites and services. ]]></description>
            <content:encoded><![CDATA[ <p>The Internet is getting more secure every day as people enable HTTPS, the secure version of HTTP, on their sites and services. Last year, Mozilla reported that the percentage of requests made by Firefox using encrypted HTTPS passed <a href="https://twitter.com/0xjosh/status/78697141295942042">50% for the first time</a>. HTTPS has numerous benefits that are not available over unencrypted HTTP, including improved performance with <a href="https://www.cloudflare.com/website-optimization/http2/">HTTP/2</a>, <a href="http://searchengineland.com/google-starts-giving-ranking-boost-secure-httpsssl-sites-199446">SEO benefits</a> for search engines like Google and the reassuring lock icon in the address bar.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2mExGu34GTxoBejOt9ef1Y/a173ce5dfc0b61d2213238afab253abe/image1.jpg" />
            
            </figure><p>So how do you add HTTPS to your site or service? That’s simple, Cloudflare offers free and automatic HTTPS support for all customers with no configuration. Sign up for any plan and Cloudflare will issue an SSL certificate for you and serve your site over HTTPS.</p>
    <div>
      <h3>HTTPS-only</h3>
      <a href="#https-only">
        
      </a>
    </div>
    <p>Enabling HTTPS does not mean that all visitors are protected. If a visitor types your website’s name into the address bar of a browser or follows an HTTP link, it will bring them to the insecure HTTP version of your website. In order to make your site HTTPS-only, you need to redirect visitors from the HTTP to the HTTPS version of your site.</p><p>Going HTTPS-only should be as easy as a click of a button, so we literally added one to the Cloudflare dashboard. Enable the “Always Use HTTPS” feature and all visitors of the HTTP version of your website will be redirected to the HTTPS version. You’ll find this option just above the HTTP Strict Transport Security setting and it is of course also available through our <a href="https://api.cloudflare.com/#zone-settings-change-always-use-https-setting">API</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/19twvdqDrUtYthZ88NZCG1/9b888300f8ed08e480adfbcaad1c1ee0/image2-1.png" />
            
            </figure><p>In case you would like to redirect only some subset of your requests you can still do this by creating a <a href="https://www.cloudflare.com/features-page-rules/">Page Rule</a>. Simply use the “Always Use HTTPS” setting on any URL pattern.</p>
    <div>
      <h3>Securing your site: next steps</h3>
      <a href="#securing-your-site-next-steps">
        
      </a>
    </div>
    <p>Once you have confirmed that your site is fully functional with HTTPS-only enabled, you can take it a step further and enable HTTP Strict Transport Security (<a href="/enforce-web-policy-with-hypertext-strict-transport-security-hsts/">HSTS</a>). HSTS is a header that tells browsers that your site is available over HTTPS and will be for a set period of time. Once a browser sees an HSTS header for a site, it will automatically fetch the HTTPS version of HTTP pages without needing to follow redirects. HSTS can be enabled in the crypto app right under the Always Use HTTPS toggle.</p><p>It's also important to secure the connection between Cloudflare and your site. To do that, you can use Cloudflare's <a href="/cloudflare-ca-encryption-origin/">Origin CA</a> to get a free certificate for your origin server. Once your origin server is set up with HTTPS and a valid certificate, change your SSL mode to Full (strict) to get the highest level of security.</p> ]]></content:encoded>
            <category><![CDATA[HTTPS]]></category>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[Automatic HTTPS]]></category>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[HTTP2]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Cryptography]]></category>
            <guid isPermaLink="false">2XThcNAZoHfneQaKkn6XXC</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
        <item>
            <title><![CDATA[How we built Origin CA: Web Crypto]]></title>
            <link>https://blog.cloudflare.com/how-we-built-origin-ca-web-crypto/</link>
            <pubDate>Tue, 10 May 2016 15:21:42 GMT</pubDate>
            <description><![CDATA[ At CloudFlare we strive to combine features that are simple, secure, and backed by solid technology. The Origin CA is a great example of this. You no longer need to go to a third-party certificate authority to protect the connection between CloudFlare and your origin server. ]]></description>
            <content:encoded><![CDATA[ <p>At CloudFlare we strive to combine features that are simple, secure, and backed by solid technology. The <a href="/cloudflare-ca-encryption-origin/">Origin CA</a> is a great example of this. You no longer need to go to a third-party certificate authority to protect the connection between CloudFlare and your origin server. You can now get a certificate to encrypt the connection between CloudFlare and the origin from CloudFlare directly with one click.</p><p>In certificate-based security, the most important thing is protecting the private key. We designed the one-click certificate dashboard to maximize private key security. Your private key is created client-side in your browser using the W3C’s <a href="https://www.w3.org/2012/webcrypto/">Web Crypto API</a> and only the public key is sent to CloudFlare’s servers. This security feature turned out to be a big win for usability as well as an interesting technical challenge.</p>
    <div>
      <h3>Certificate authorities don’t need your private key</h3>
      <a href="#certificate-authorities-dont-need-your-private-key">
        
      </a>
    </div>
    <p>Most certificate authorities (CAs) specialize in one type of transaction: they take a certificate signing request (CSR) (and sometimes a fee) and in return they provide a signed certificate. A CSR is a way to tell a certificate authority what your public key is and to prove you have control of the corresponding private key. The certificate authority doesn’t need to see your private key to validate the CSR. This is a good thing. Sharing your private key with anybody, including your CA, makes it more vulnerable to theft.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/25JF9DhQ0U8um4jlzYtkrA/654c5cf294e1ea114f3f3b87f37662b7/illustrations-ssl.png" />
            
            </figure><p>Like most CAs, the CloudFlare Origin CA requires you to send a CSR signed by your private key to get a certificate. If you <a href="https://api.cloudflare.com/#origin-ca-create-certificate">take a look at the API</a> for the Origin CA you’ll see that CSRs are exchanged for certificates and private keys are not involved. This API is the only way to get a certificate from CloudFlare’s Origin CA: both the CloudFlare dashboard and the Origin CA CLI use it under the hood.</p><p>If you want full control over your private key, you can create it yourself using <a href="https://www.digicert.com/easy-csr/openssl.htm">OpenSSL</a> or <a href="/how-to-build-your-own-public-key-infrastructure/">CFSSL</a> and select “I have my own private key and CSR” in the dashboard. We recommend this for experienced sysadmins. However, we wanted to provide a simpler and more convenient way to get a certificate, preferably one that didn’t require a series of command-line incantations. This posed an interesting problem: how do we let customers create CSRs and private keys without asking them to install or run cryptographic software?</p>
    <div>
      <h3>Web Crypto and PKI.js</h3>
      <a href="#web-crypto-and-pki-js">
        
      </a>
    </div>
    <p>The solution to our problem was to create a client-side web application for generating keys and CSRs. By generating the private key and CSR in the customer’s browser, the CSR could be sent to the API while keeping the private key safely on the customer’s machine. Doing anything complex in the browser usually means using JavaScript, and there have been <a href="https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considered-harmful/">convincing</a> <a href="https://www.youtube.com/watch?v=zKuFu19LgZA">arguments</a> that doing cryptography in JavaScript is a bad idea. These arguments were made a half-decade ago and the web changes quickly so we surveyed the landscape to see if these arguments were still convincing in 2016. Things have changed.</p><p>In the last few years, a new addition to Web standards was introduced that changes everything: support for native cryptography in the browser. The <a href="https://www.w3.org/2012/webcrypto/">W3C Web Crypto group</a> has made a lot of progress towards standardizing a set of APIs to do standard cryptographic operations including encryption, digital signatures and key generation. As of today, Web Crypto features are supported by <a href="http://caniuse.com/#feat=cryptography">almost all</a> modern browsers. With native web crypto, we no longer need to use problematic JavaScript cryptography to create private keys and sign CSRs.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/55nxtM9JIJmsuWxBv1FA4I/7ae3128d80e3983671aa1ee83ae3d1ce/Unofficial_JavaScript_logo_2-svg.png" />
            
            </figure><p>With the pure cryptographic operations handled by the browser, we still needed some code to structure and format the CSRs and certificates. For this we used <a href="https://pkijs.org/">PKI.js</a>, an open source JavaScript library by our friends at GlobalSign that is built on the WebCrypto API. PKI.js a full featured PKI toolkit that can create CSRs and certificates as well as handle a wide variety of certificate formats including DER, PEM, PKCS#7 and PKCS#12.</p><p>In the Origin CA dashboard, we use WebCrypto to generate the key and PKI.js to create CSRs. When you click “next” in the one-click certificate dialog, your CSR is sent to the CloudFlare API. When the certificate comes back from the API, we use PKI.js to convert it to the right format and display it with your private key.</p><p>CloudFlare’s servers don’t see your private key and you get to save yourself the hassle of learning obscure OpenSSL commands.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4eUgxqtZuqCKQfFRmN8Swc/decf60cdd31bca97c7ea0beb857528c4/origin-ca.png" />
            
            </figure><p>Of course, not everything smells of roses. Because Web Crypto is an evolving standard, we have to deal with uneven support for the APIs we need. While working on the project, we realized that Firefox was unable to export ECDSA keys in the formats we needed—if we left it as is, a huge portion of our user base would be unable to use modern cryptography. We want our features to be used by as many people as possible, so we built a shim over the WebCrypto API which supports the formatting we need. We intend to continue working on this shim, adding support for Safari, Internet Explorer and other browsers.</p>
    <div>
      <h3>Conclusion</h3>
      <a href="#conclusion">
        
      </a>
    </div>
    <p>The Origin CA posed some interesting challenges to the team and hopefully this blog post illustrated one of them. A big shout-out goes to CloudFlare engineers Andrew Kennedy and Brendan McMillion for making this part of the project happen. Here’s to encrypting the back-end of the Internet!</p><p>If these sort of development projects are interesting to you, <a href="https://www.cloudflare.com/join-our-team/">CloudFlare is hiring</a>.</p> ]]></content:encoded>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[JavaScript]]></category>
            <category><![CDATA[API]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Cryptography]]></category>
            <guid isPermaLink="false">5X126DcLfsDrTk1NTZ6s12</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
        <item>
            <title><![CDATA[Why it’s harder to forge a SHA-1 certificate than it is to find a SHA-1 collision]]></title>
            <link>https://blog.cloudflare.com/why-its-harder-to-forge-a-sha-1-certificate-than-it-is-to-find-a-sha-1-collision/</link>
            <pubDate>Tue, 22 Dec 2015 16:43:52 GMT</pubDate>
            <description><![CDATA[ It’s well known that SHA-1 is no longer considered a secure cryptographic hash function. Researchers now believe that finding a hash collision (two values that result in the same value when SHA-1 is applied) is inevitable and likely to happen. ]]></description>
            <content:encoded><![CDATA[ <p>It’s well known that SHA-1 is no longer considered a secure cryptographic hash function. Researchers now believe that finding a hash collision (two values that result in the same value when SHA-1 is applied) is inevitable and likely to happen in a matter of months. This poses a potential threat to trust on the web, as many websites use certificates that are digitally signed with algorithms that rely on SHA-1. Luckily for everyone, finding a hash collision is <i>not</i> enough to forge a digital certificate and break the trust model of the Internet.</p><p>We’ll explore how hash collisions have been used to forge digital signatures in the past. We’ll also discuss how certificate authorities can make this significantly harder for attackers in the future by including randomness in certificate serial numbers.</p>
    <div>
      <h3>Digital signatures are the bedrock of trust</h3>
      <a href="#digital-signatures-are-the-bedrock-of-trust">
        
      </a>
    </div>
    <p>The Internet relies on trust. Whether it’s logging in to your bank or reading Reddit, HTTPS protects you by encrypting the data you exchange with a site and authenticating the site's identity with a digital certificate. Browsers visually display the added security of HTTPS as a padlock in the address bar.</p><p>HTTPS can prove a site’s authenticity to a browser when a site owns a digital certificate that asserts the owner’s identity and hostname. Certificates are small files digitally signed by trusted third parties known as Certificate Authorities (CAs). For browsers, digital signatures are the definitive source of trust. If your browser trusts the CA and the digital signature on the certificate is correct, then the browser trusts the certificate. This system of identity is known as the public key infrastructure (PKI), something we’ve covered <a href="/how-to-build-your-own-public-key-infrastructure/">in detail in a previous post</a>.</p><p>This system falls apart if digital signatures can no longer be trusted. If someone can create a certificate for cloudflare.com with a signature from a trusted CA, they can use it to impersonate the cloudflare.com website to visitors (given they can <a href="/dnssec-an-introduction">modify DNS</a>).</p><p>A digital signature is a number cryptographically tied to a message with public key. Every digital signature requires a public-private key pair and a hash function. The hash function is used to take the message and replace it with a unique digest, the private key is used to sign, and the public key to verify signatures.</p><p>For example, to create an RSA signature, you take a hash of the message and encrypt that hash with your private key. Anyone can verify that signature both belongs to you and is valid for the associated message. Take the public key, decrypt the hash and compare it with the hash of the message. If it's a match, the signature is correct. <a href="/ecdsa-the-digital-signature-algorithm-of-a-better-internet/">ECDSA</a> is a more recent algorithm that gets the same job done.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/DECDGDpoEwCG0eHS4QmLn/8df3a6e7d0f0a4ddf9c8351e94f27b08/rsa-signing-1.png" />
            
            </figure><p>There are several ways of obtaining a digitally signed certificate for a website. The standard way is by purchasing a certificate from a certificate authority like GlobalSign or Comodo. CAs follow a set of rules about certificate issuance, governed by CA/Browser Forum’s <a href="https://cabforum.org/baseline-requirements/">Baseline Requirements</a>.</p><p>Another way to get a certificate is to steal a CA’s private key. In addition to being potentially illegal, it is also very hard to do: CA private keys are usually kept in dedicated secure machines called Hardware Security Modules (HSM) designed to protect against key extraction.</p><p>A third more interesting way to obtain a certificate is to create a certificate that has the same hash as an existing trusted certificate. The signature from the trusted certificate can be added to the untrusted certificate, making it appear trusted.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6v5ZRqGjgWN7MI75yf6SBP/09d2a0d7103d40ae775cf46e2157fd31/rsa-signing-2.png" />
            
            </figure><p>If you can find a message that has the same hash value as a signed message, then you can swap in your message and the signature will verify correctly. This can be used to trick anyone into thinking someone signed a message that they didn’t.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7JUU3Fxeaazw6RMm22opTu/c37aa56bd43d5b8102319d8b863fbfb1/rsa-signing-3.png" />
            
            </figure><p>Cryptographic hash functions are designed to resist this sort of thing. They don’t always succeed.</p>
    <div>
      <h3>Security properties of hash functions</h3>
      <a href="#security-properties-of-hash-functions">
        
      </a>
    </div>
    <p>Cryptographic hash functions are designed to satisfy three security properties:</p><ul><li><p>collision resistance</p></li><li><p>second pre-image resistance</p></li><li><p>pre-image resistance</p></li></ul><p>Collision resistance here means there are no known algorithms faster than brute force to find two values that hash to the same value. This is the strongest security requirement, and usually the first one to be broken.</p><p>A hash function has second pre-image resistance when, given a value and its hash, it is computationally infeasible to find a second value that hashes to the same value. On the surface, this would seem like the security property that protects digital signatures on certificates. However, as we’ll explore in the next section, it’s still possible to forge certificates signed with a second pre-image resistant hash.</p><p>Pre-image resistance means that given a hash, it’s computationally infeasible for an attacker to find a value that hashes to it. If you can find a pre-image, you can easily find a second pre-image or a collision.</p><p>In the next section, we’ll describe what happened the last time we used a cryptographic hash function without collision resistance for digital signatures.</p>
    <div>
      <h3>Breaking MD5</h3>
      <a href="#breaking-md5">
        
      </a>
    </div>
    <p>MD5 is an incredibly popular cryptographic hash function; it also happens to be completely broken with respect to collision resistance. MD5 is still widely used, just not for digital signatures.</p><p>The first collision in MD5, discovered in <a href="https://eprint.iacr.org/2004/199.pdf">2004 by a group of Chinese researchers (PDF)</a>, used a lot of math and about an hour of computation by a supercomputer. Today, computing an MD5 collision takes only seconds on a laptop. This was cleverly demonstrated by <a href="http://natmchugh.blogspot.com/2014/10/how-i-created-two-images-with-same-md5.html">Nat McHugh</a>, who used a chosen-prefix hash collision (more on this later) in MD5 to create two images with the same hash—in this case Barry White and James Brown (he later created a three-way collision with <a href="http://natmchugh.blogspot.com/2014/11/three-way-md5-collision.html">Jack Black</a>).</p><p>Three images with the same MD5 hash:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5Y4r54sl9X78iapskroWkw/854aa7c2211ddee02fa67467c641a56b/white.jpg" />
            
            </figure><p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3DnAT2RzFjTvssur0eOceu/e84ae3e2ca5c6a35fd3bb034303e286b/brown.jpg" />
            
            </figure><p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5hARGIj78j9wtOwXzqetBv/b061d4f5ffd8863c4a81e52dcdeb2966/black.jpg" />
            
            </figure><p>You can verify this yourself via <code>curl</code> and <code>md5</code>:</p>
            <pre><code>$ curl -s https://blog.cloudflare.com/content/images/2015/08/white.jpg | md5
b69dd1fd1254868b6e0bb8ed9fe7ecad
$ curl -s https://blog.cloudflare.com/content/images/2015/08/brown.jpg | md5
b69dd1fd1254868b6e0bb8ed9fe7ecad
$ curl -s https://blog.cloudflare.com/content/images/2015/08/black.jpg | md5
b69dd1fd1254868b6e0bb8ed9fe7ecad</code></pre>
            <p>Despite being relatively trivial to find an MD5 collision, it’s still not known how to perform a second-preimage attack on MD5. For example, given a digitally signed certificate, nobody has been able to create a second certificate with the same hash. Despite this, researchers created a <a href="http://www.win.tue.nl/hashclash/rogue-ca/">certificate</a> with the same signature as a certificate trusted by browsers.</p><p>The technique they used, a chosen-prefix attack, was originally proposed by Marc Stevens in his <a href="http://www.win.tue.nl/hashclash/On%20Collisions%20for%20MD5%20-%20M.M.J.%20Stevens.pdf">Master’s Thesis</a>. It can be used to create a forged certificate as long as you can get a certificate authority to issue a certificate that starts with predictable values.</p>
    <div>
      <h3>Chosen-prefix attacks</h3>
      <a href="#chosen-prefix-attacks">
        
      </a>
    </div>
    <p>If you can find a collision, you can take two different values and append data to each so they hash to the same value. In the original MD5 collision attack, the researchers computed two messages <code>M1</code> and <code>M2</code> such that <code>H(M1) = H(M2)</code>. Stevens extended this research to find a way to make two known values <code>P1</code> and <code>P2</code> collide by appending bytes. With prefixes <code>P1</code> and <code>P2</code>, he was able to demonstrate how to find S1 and S2 so that <code>H(P1|S1) = H(P2|S2)</code>.</p><p>This was enough to allow an attacker to create two certificates with the same hash. Let’s look at the approximate structure of a certificate:</p><ul><li><p>Serial number</p></li><li><p>Validity period</p></li><li><p><a href="https://www.cloudflare.com/learning/dns/glossary/what-is-a-domain-name/">Domain name</a></p></li><li><p>Public key</p></li><li><p>X.509 extensions</p></li><li><p>Signature</p></li></ul><p>If the attacker knows every value before the domain, then they can take</p>
            <pre><code>P1 = Serial number | Validity period | real domain name</code></pre>
            <p>and</p>
            <pre><code>P2 = Serial number | Validity period | forged domain name</code></pre>
            <p>and apply the attack to get S1 and S2 that fit into the public key section. If the serial number and validity period can be predicted, a collision can be found using the following steps:</p><ol><li><p>Guess when the certificate will be issued;</p></li><li><p>Predict the serial number for certificates issued in that time period; and</p></li><li><p>Compute matching prefixes for several guesses covering the expected serial numbers and issuance dates</p></li></ol>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/79PwdrVZnzNpdV3JWdnUdw/c4407fb3b97a6384778d10df999ea8d7/sha-1-certificate-forgery-1.png" />
            
            </figure><p>The attacker precomputes chosen-prefix collisions for the choices for each of these values, where one prefix has a domain name that is under the requester’s control (e.g. for attacker.com) and one for the target domain (e.g. google.com). The "collision bits" that cause the two certificates to collide end up aligning with first few bytes of the public key of the certificate.</p><p>Once the collisions are computed, the attacker has to convince a CA to issue a certificate with the correct serial number at the correct time for a verifiable domain and a public key that corresponds to the collision bits. If they're lucky, the certificate the CA returns will have the same hash as the malicious certificate. They can then transpose the valid signature onto the malicious certificate to make it trusted.</p><p>Colliding the domain name is the simplest type of chosen-prefix collision attack. It is also possible to prepare the collision in such a way that the RSA public key from the trusted certificate lines up with the X.509 extensions of the forged certificate. This is much more dangerous since it allows the forged certificate to set the "Is CA" bit. As long as the <a href="https://technet.microsoft.com/en-us/library/cc737026(v=ws.10).aspx">path length constraint</a> of the signing CA is large enough, this forged CA would be able to issue trusted certificates for any domain.</p>
    <div>
      <h3>Forging MD5 certificates in practice</h3>
      <a href="#forging-md5-certificates-in-practice">
        
      </a>
    </div>
    <p>In 2008, several researchers (including Marc Stevens and Alex Sotirov) used chosen prefix collision techniques to <a href="http://www.win.tue.nl/hashclash/rogue-ca/">forge a certificate authority</a> trusted by browsers. This proof of concept was presented at the Chaos Communication Congress in 2008 and required only a few days of computation.</p><p>In 2012, a piece of malware called Flame was discovered. Flame was able infect computers by hijacking Microsoft’s Windows Update mechanism. At the time, Windows Update validated updates by checking code signatures using certificates signed by Microsoft using a MD5-based signature. The authors of Flame used a forged Microsoft certificate. According to an <a href="http://blog.trailofbits.com/2012/06/11/analyzing-the-md5-collision-in-flame/">analysis of this certificate</a>, it was likely the chosen-prefix technique was used to create Flame’s forged certificate.</p><p>Forbes declared this <a href="http://www.forbes.com/sites/richardstiennon/2012/06/14/flames-md5-collision-is-the-most-worrisome-security-discovery-of-2012/">the most worrisome security discovery of 2012</a> since it demonstrated it was feasible for attackers to forge any website’s certificate using an MD5 hash collision when the client trusts MD5-signed certificates.</p>
    <div>
      <h3>SHA-1 vs MD5</h3>
      <a href="#sha-1-vs-md5">
        
      </a>
    </div>
    <p>SHA-1 is supposedly more secure than MD5 for use in digital signatures. The National Security Agency published SHA-1 (SHA stands for Secure Hash Algorithm) in 1995 as a standard for cryptographically secure hashing. Designed to be collision resistant up to 2<sup>80</sup> bits, SHA-1 has had a long and useful life, and a collision has not been published as of this blog post. Even though a collision has never been published, several theoretical attacks (the <a href="http://gauss.ececs.uc.edu/Courses/c653/lectures/Hashing/sha1-crypto-auth-new-2-yao.pdf">first in 2005</a>, improved <a href="http://2012.sharcs.org/slides/stevens.pdf">in 2012</a>) indicate that SHA-1 is not as secure as its bit length implies. The latest research suggests that its collision resistance is <a href="https://marc-stevens.nl/research/papers/PhD%20Thesis%20Marc%20Stevens%20-%20Attacks%20on%20Hash%20Functions%20and%20Applications.pdf">at best 265</a> — within the realm of feasibility for some governments. In fact, researchers published a freestart collision (a precursor to a full collision) for SHA-1 <a href="https://eprint.iacr.org/2015/967.pdf">earlier this year</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/dR7YVWkazh7VY1IGSz8tb/e171383cbc753cb8fefcbf911b525eb3/Sharks_outside_cage.jpg" />
            
            </figure><p><a href="https://en.wikipedia.org/wiki/Shark_proof_cage#/media/File:Sharks_outside_cage.jpg">CC BY-SA 2.0</a></p><p>Academic cryptanalysts are like sharks. If there's blood in the water, they swarm. It took nine years to get from the first published weakness in MD5 (<a href="http://cseweb.ucsd.edu/~bsy/dobbertin.ps">1996</a>) to a hash collision (<a href="https://www.schneier.com/blog/archives/2005/06/more_md5_collis.html">2005</a>), and then another three years to forge a trusted digital signature (<a href="http://www.win.tue.nl/hashclash/rogue-ca/">2008</a>). They might be slow, but they're relentless.</p><p>Attacks always improve and computers get more powerful. It was nine years from first weakness to hash collision in MD5; it's been ten years for SHA-1. If history is any guide, a public collision for SHA-1 could be published at any moment, with chosen-prefix collisions arriving soon after.</p>
    <div>
      <h3>Preventing chosen-prefix attacks by requiring serial number entropy</h3>
      <a href="#preventing-chosen-prefix-attacks-by-requiring-serial-number-entropy">
        
      </a>
    </div>
    <p>One way to improve the security of digital signatures against a chosen-prefix attack is to make the prefix less predictable.</p><p>As described above, the chosen prefix attack requires the attacker to predict both the serial number and the validity period. Certificates used on the web have serial numbers up to 160 bits long. Requiring CAs to make the serial number unpredictable instead of sequential, it is possible to make the chosen-prefix attack significantly more expensive.</p><p>For example, if a CA ensures the serial number contains 20 bits of entropy, then the attacker will need to compute 220 chosen-prefixes in order to guess the serial number correctly.</p><p>This makes the attack over a <i>million times</i> more difficult.</p><p>Computing a SHA-1 collision might be feasible in 2016, and there's a chance that chosen-prefix attacks also become feasible. Nevertheless, choosing partially randomized serial can make certificate forgery significantly more difficult for attackers. Barring a breakthrough in hash collision techniques, it's unlikely we'll see a certificate collision for long time.</p>
    <div>
      <h3>Conclusion</h3>
      <a href="#conclusion">
        
      </a>
    </div>
    <p>The SHA-1 hash function, widely used for everything from file integrity to digital signatures, is at the end of its useful life. Some browsers even show security warnings when websites use certificates signed using a SHA-1 based digital signature. A hash collision in SHA-1 is bad, but it’s not what matters for web security. Digital signature forgery is more problematic for trust on the Web. Requiring CAs to randomize serial numbers will significantly increase the cost of such forgeries, allowing potentially weak algorithms like SHA-1 to be useful for longer. This is why we make it <b>mandatory</b> for CAs to use serial numbers that include at least 20 bits of entropy in our proposal to the CA/B Forum <a href="https://cabforum.org/pipermail/public/2015-December/006488.html">for Legacy Verified (LV) SHA-1 certificates</a>.</p> ]]></content:encoded>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[Reliability]]></category>
            <category><![CDATA[Programming]]></category>
            <category><![CDATA[RSA]]></category>
            <guid isPermaLink="false">4iswx07chNyDPHmCyRPrne</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
        <item>
            <title><![CDATA[How to build your own public key infrastructure]]></title>
            <link>https://blog.cloudflare.com/how-to-build-your-own-public-key-infrastructure/</link>
            <pubDate>Wed, 24 Jun 2015 13:57:30 GMT</pubDate>
            <description><![CDATA[ A major part of securing a network as geographically diverse as CloudFlare’s is protecting data as it travels between datacenters. Customer data and logs are important to protect but so is all the control data that our applications use to communicate with each other.  ]]></description>
            <content:encoded><![CDATA[ <p>A major part of securing a network as geographically diverse as CloudFlare’s is protecting data as it travels between datacenters. Customer data and logs are important to protect but so is all the control data that our applications use to communicate with each other. For example, our application servers need to securely communicate with our new datacenter in <a href="/osaka-data-center/">Osaka, Japan</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4LLkau2uBvAD4G7wNt1wWt/faf1e0ac7ce890c8800ee0bd06bbf156/23390123_b6caaefc16_z.jpg" />
            
            </figure><p><a href="https://creativecommons.org/licenses/by-sa/2.0/">CC BY-SA 2.0</a> <a href="https://www.flickr.com/photos/kk/23390123/in/photolist-34T4Z-eCaWn2-98sYER-7Hx7ig-ejcw3L-n7qDvJ-dYj3cw-ayZi8V-8qi3MQ-8vR8W5-73xSvY-ehPXNM-oaLWEs-qKGKFC-29GeC-7oEdaD-dAFKPa-az45tU-hjsKL-bikriH-dCz8na-6UKyJq-cJLzGh-drbr3g-5ru4oK-9gGswk-dU3PK3-edjQhq-d7exeW-cdBJCm-9XE9R5-62J5N-brKi7f-4uwyQL-6u3Npt-ccX3-qixk9G-2vj3k2-4DjUnW-cXXqXy-92Cgam-cv6bco-dA29Tj-87az7W-98P4W5-9AipNF-buwS46-9nKh7L-69WpZo-evqszn">image</a> by <a href="https://www.flickr.com/photos/kk/">kris krüg</a></p><p>Great security architecture requires a defense system with multiple layers of protection. As CloudFlare’s services have grown, the need to secure application-to-application communication has grown with it. As a result, we needed a simple and maintainable way to ensure that all communication between CloudFlare’s internal services stay protected, so we built one based on known and reliable protocols.</p><p>Our system of trust is based on a Public Key Infrastructure (PKI) using internally-hosted Certificate Authorities (CAs). In this post we will describe how we built our PKI, how we use it internally, and how to run your own with our open source software. This is a long post with lots of information, grab a coffee!</p>
    <div>
      <h2>Protection at the application layer</h2>
      <a href="#protection-at-the-application-layer">
        
      </a>
    </div>
    <p>Most reasonably complex modern web services are not made up of one monolithic application. In order to handle complex operations, an application is often split up into multiple “services” that handle different portions of the business logic or data storage. Each of these services may live on different machines or even in different datacenters.</p><p>The software stacks of large service providers are made up of many components. For CloudFlare, this includes a web application to handle user actions, a main database to maintain DNS records and user rules, a data pipeline to distribute these rules to the edge network, services for caching, a log transport pipeline, data analysis services and much, much more.</p><p>Some service-to-service communication can happen within a machine, some within a datacenter and some across a broader network like the Internet. Managing which communications should use which type of network in our evolving services is not a simple task. A single accidental configuration change could result in messages that are supposed to never leave a machine going through an untrusted connection on the Internet. The system should be designed so that these messages are secure even if they go over the wrong network.</p>
    <div>
      <h2>Enter TLS</h2>
      <a href="#enter-tls">
        
      </a>
    </div>
    <p>One approach to mitigate the risks posed by attackers is to encrypt and authenticate data in transit. Our approach is to require that all new services use an encrypted protocol, Transport Layer Security (TLS), to keep inter-service communication protected. It was a natural choice: TLS is the “S” in HTTPS and is the foundation of the encrypted web. Furthermore, modern web services and <a href="https://www.cloudflare.com/learning/security/api/what-is-an-api/">APIs</a> have embraced TLS as the de-facto standard for application layer encryption. It works seamlessly with RESTful services, is supported in <a href="/kyoto-tycoon-secure-replication/">Kyoto Tycoon</a>, <a href="http://www.postgresql.org/docs/8.3/static/libpq-ssl.html">PostgreSQL</a>, and the Go standard library.</p><p>As we have described in <a href="/an-introduction-to-javascript-based-ddos/">previous blog posts</a>, unauthenticated encryption can be foiled by <a href="/introducing-strict-ssl-protecting-against-a-man-in-the-middle-attack-on-origin-traffic/">on-path attackers</a>. Encryption without authentication does not protect data in transit. For connections to be safe, each party needs to prove their identity to the other. Public key cryptography provides many mechanisms for trust, including PGP’s “web of trust” and HTTPS’s public key infrastructure (PKI) model. We chose the PKI model because of ease of use and deployment. TLS with PKI provides trusted communication.</p>
    <div>
      <h2>Be picky with your PKI</h2>
      <a href="#be-picky-with-your-pki">
        
      </a>
    </div>
    <p>Trust is the bedrock of secure communication. For two parties to securely exchange information, they need to know that the other party is legitimate. PKI provides just that: a mechanism for trusting identities online.</p><p>The tools that enable this are digital certificates and public key cryptography. A certificate lets a website or service prove its identity. Practically speaking, a certificate is a file with some identity information about the owner, a public key, and a signature from a certificate authority (CA). Each certificate also contains a public key. Each public key has an associated private key, which is kept securely under the certificate owner’s control. The private key can be used to create digital signatures that can be verified by the associated public key.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4zk0sFLWqQIg6Fh9Qc5kPU/8105c11afdaffc285ec06c30e9418eee/anatomy-of-a-certificate.png" />
            
            </figure><p>A certificate typically contains</p><ul><li><p>Information about the organization that the certificate is issued to</p></li><li><p>A public key</p></li><li><p>Information about the organization that issued the certificate</p></li><li><p>The rights granted by the issuer</p></li><li><p>The validity period for the certificate</p></li><li><p>Which hostnames the certificate is valid for</p></li><li><p>The allowed uses (client authentication, server authentication)</p></li><li><p>A digital signature by the issuer certificate’s private key</p></li></ul><p>A certificate is a powerful tool for proving your identity online. The owner of a certificate can digitally sign data, and a verifier can use the public key from the certificate to verify it. The fact that the certificate is itself digitally signed by a third party CA means that if the verifier trusts the third party, they have assurances that the certificate is legitimate. The CA can give a certificate certain rights, such as a period of time in which the identity of the certificate should be trusted.</p><p>Sometimes certificates are signed by what’s called an intermediate CA, which is itself signed by a different CA. In this case, a certificate verifier can follow the chain until they find a certificate that they trust — the root.</p><p>This chain of trust model can be very useful for the CA. It allows the root certificate’s private key to be kept offline and only used for signing intermediate certificates. Intermediate CA certificates can be shorter lived and be used to sign endpoint certificates on demand. Shorter-lived online intermediates are easier to manage and revoke if compromised.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1mgZiSD0E5rW6KjaGEFPa0/0428f6fc0637a81525dcbed41586192b/certificate-chain-of-trust.png" />
            
            </figure><p>This is the same system used for HTTPS on the web. For example, cloudflare.com has a certificate signed by Comodo’s Intermediate certificate, which is in turn signed by the Comodo offline root. Browsers trust the Comodo root, and therefore also trust the intermediate and web site certificate.</p><p>This model works for the web because browsers only trust a small set of certificate authorities, who each have stringent requirements to only issue certificates after validating the ownership of a website. For internal services that are not accessed via browsers, there is *no need * to go through a third party certificate authority. Trusted certificates do not have to be from Globalsign, Comodo, Verisign or any other CA — they can be from a CA you operate yourself.</p>
    <div>
      <h2>Building your own CA</h2>
      <a href="#building-your-own-ca">
        
      </a>
    </div>
    <p>The most painful part of getting a certificate for a website is going through the process of obtaining it. For websites, we eliminated this pain by launching <a href="/introducing-universal-ssl/">Universal SSL</a>. The most painful part of running a CA is the administration. When we decided to build our internal CA, we sought to make both obtaining certificates and operating the CA painless and even fun.</p><p>The software we are using is <a href="https://github.com/cloudflare/cfssl">CFSSL</a>, CloudFlare’s open source PKI toolkit. This tool was open sourced last year and has all the capabilities needed to run a certificate authority. Although CFSSL was built for an internal CA, it’s robust enough to be use a publicly trusted CA; in fact, the <a href="https://letsencrypt.org">Let’s Encrypt</a> project is using CFSSL as a core part of their CA infrastructure.</p>
    <div>
      <h3>Key protection</h3>
      <a href="#key-protection">
        
      </a>
    </div>
    <p>To run a CA, you need the CA certificate and corresponding private key. This private key is extremely sensitive. Any person who knows the value of the key can act as the CA and issue certificates. Browser-trusted certificate authorities are required to keep their private keys inside of specialized hardware known as Hardware Security Modules (HSMs). The requirements for protecting private keys for corporate infrastructures are not necessarily as stringent, so we provided several mechanisms to protect keys.</p><p>CFSSL supports three different modes of protection for private keys:</p><ol><li><p><i>Hardware Security Module (HSM)</i>CFSSL allows the CA server to use an HSM to compute digital signatures. Most HSMs use an interface called PKCS#11 to interact with them, and CFSSL natively supports this interface. Using an HSM ensures that private keys do not live in memory and it provides tamper protection against physical adversaries.</p></li><li><p><i>Red October</i>Private Keys can be encrypted using <a href="/red-october-cloudflares-open-source-implementation-of-the-two-man-rule/">Red October</a> (another open source CloudFlare project). A key protected with Red October can only be decrypted with the permission of multiple key owners. In order to use CFSSL with a Red October key, the key owners need to authorize the use of the private key. This ensures that the CA key is never unencrypted on disk, in source control, or in configuration management. Note: Red October support in CFSSL is experimental and subject to change.</p></li><li><p><i>Plaintext</i>CFSSL accepts plain unencrypted private keys. This works well when the private key is generated on the machine running CFSSL or by another program. If the machine that is running the CA is highly secure, this mode is a compromise between security, cost, and usability. This is also useful in development mode, allowing users to test changes to their infrastructure designs.</p></li></ol><p>Next I’ll show you how to quickly configure an internal CA using plaintext private keys. Note: The following expects <a href="https://github.com/cloudflare/cfssl#readme">CFSSL to be installed</a>.</p>
    <div>
      <h3>Generating a CA key and certificate</h3>
      <a href="#generating-a-ca-key-and-certificate">
        
      </a>
    </div>
    <p>To start, you need some information about what metadata you want to include in your certificate. Start by creating a file called <code>csr_ca.json</code> containing this basic information (feel free to fill in your own organization's details):</p>
            <pre><code>{
  "CN": "My Awesome CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
    "names": [
       {
         "C": "US",
         "L": "San Francisco",
         "O": "My Awesome Company",
         "OU": "CA Services",
         "ST": "California"
       }
    ]
}</code></pre>
            <p>With this you can create your CA with a single call"<code>$ cfssl gencert -initca csr_ca.json | cfssljson -bare ca</code></p><p>This generates the two files you need to start your CA:</p><ul><li><p><code>ca-key.pem</code>: your private key</p></li><li><p><code>ca.pem</code>: your certificate</p></li><li><p><code>ca.csr</code>: your certificate signing request (needed to get your CA cross-signed by another CA)</p></li></ul><p>The key and certificate are the bare minimum you need to start running a CA.</p>
    <div>
      <h3>Policy</h3>
      <a href="#policy">
        
      </a>
    </div>
    <p>Once the CA certificate and key are created, the CA software needs to know what kind of certificates it will issue. This is determined in the CFSSL configuration file’s signing policy section.</p><p>Here’s an example of a simple policy for a CA that can issue certificates that are valid for a year and can be used for server authentication.</p>
            <pre><code>config_ca.json
{
  "signing": {
    "default": {
      "auth_key": "key1",
      "expiry": "8760h",
      "usages": [
         "signing",
         "key encipherment",
         "server auth"
       ]
     }
  },
  "auth_keys": {
    "key1": {
      "key": &lt;16 byte hex API key here&gt;,
      "type": "standard"
    }
  }
}</code></pre>
            <p>We also added an authentication key to this signing policy. This authentication key should be randomly generated and kept private. The API key is a basic authentication mechanism that prevents unauthorized parties from requesting certificates. There are several other features you can use for the CA (subject name allowlisting, etc.), <a href="https://github.com/cloudflare/cfssl/tree/master/doc">CFSSL documentation</a> for more information.</p><p>To run the service, call<code>$ cfssl serve -ca-key ca-key.pem -ca ca.pem -config config_ca.json</code></p><p>This opens up a CA service listening on port 8888.</p>
    <div>
      <h3>Issuing certificates</h3>
      <a href="#issuing-certificates">
        
      </a>
    </div>
    <p>Certificate authorities do not just create certificates out of a private key and thin air, they need a public key and metadata to populate the certificate’s data fields. This information is typically communicated to a CA via a certificate signing request (CSR).</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1XFNOUGDbNZ98c8QiaJ8hA/12c40f70676beb344b0adbae792cbf16/illustrations-ssl-blog-june-2015-03.png" />
            
            </figure><p>A CSR is very similar in structure to a certificate. The CSR contains:</p><ul><li><p>Information about the organization that is requesting the certificate</p></li><li><p>A public key</p></li><li><p>A digital signature by the requestor’s private key</p></li></ul><p>Given a CSR, a certificate authority can create a certificate. First, it verifies that the requestor has control over the associated private key. It does this by checking the CSR’s signature. Then the CA will check to see if the requesting party should be given a certificate and which domains/IPs it should be valid for. This can be done with a database lookup or through a registration authority. If everything checks out, the CA uses its private key to create and sign the certificate to send back to the requestor.</p>
    <div>
      <h3>Requesting Certificates</h3>
      <a href="#requesting-certificates">
        
      </a>
    </div>
    <p>Let’s say you have CFSSL set up as CA as described above and it’s running on a server called “ca1.mysite.com” with an authentication API key. How do you get this CA to issue a certificate? CFSSL provides two commands to help with that: <code>gencert</code> and <code>sign</code>. They are available as JSON API endpoints or command line options.</p><p>The <code>gencert</code> command will automatically handle the whole certificate generation process. It will create your private key, generate a CSR, send the CSR to the CA to be signed and return your signed certificate.</p><p>There are two configuration files needed for this. One to tell the local CFSSL client where the CA is and how to authenticate the request, and a CSR configuration used to populate the CSR.</p><p>Here’s an example for creating a certificate for a generic database server, db1.mysite.com.</p><p><code>csr_client.json</code></p>
            <pre><code>{
  "hosts": [
    	"db1.mysite.com"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "San Francisco",
      "O": “My Awesome Company",
      "OU": “Data Services",
      "ST": "California"
    }
  ]
}</code></pre>
            <p><code>config_client.json</code></p>
            <pre><code>{
  "signing": {
    "default": {
      "auth_key": "key1",
      "remote": "caserver"
    }
  },
  "auth_keys": {
    "key1": {
    "key": &lt;16 byte hex API key here&gt;,
    "type": "standard"
    }
  },
  "remotes": {
    "caserver": “ca1.mysite.com:8888"
  }
}</code></pre>
            <p>With these two configuration files set, you can create your certificate.<code>$ cfssl gencert -config config_client.json csr_client.json | cfssljson -bare db</code></p><p>This results in three files:</p><ul><li><p><code>db-key.pem</code>: your private key</p></li><li><p><code>db.pem</code>: your certificate</p></li><li><p><code>db.csr</code>: your CSR</p></li></ul><p>The CSR can be resubmitted to the CA to be signed again at any point with the <code>sign</code> command</p><p><code>$ cfssl sign -config config_client.json db.csr | cfssljson -bare db-new</code></p><p>resulting in:</p><ul><li><p><code>db-new.pem</code>: your re-signed certificate</p></li></ul><p>These two commands let you easily and conveniently set up a private PKI. As a startup or a growing business moving to a service-oriented or even a microservice architecture, having a PKI can be very convenient. Next we’ll describe how CloudFlare set up its own internal PKI to help make its services encrypted by default.</p>
    <div>
      <h2>Using a PKI for services</h2>
      <a href="#using-a-pki-for-services">
        
      </a>
    </div>
    <p>So now you have a complex set of services that can all speak TLS, and a central certificate authority server that can issue certificates. What’s next? Getting certificates and keys for the applications. There are several ways to do this including a centrally managed way and a distributed way.</p>
    <div>
      <h3>Centralized distribution vs on demand</h3>
      <a href="#centralized-distribution-vs-on-demand">
        
      </a>
    </div>
    <p>One way to create certificates and keys for your applications is to create them all on a central provisioning server and then send them out to each of the servers. In this model, a central server creates certificates and keys and sends them over a secure tunnel to the application servers.</p><p>This model creates a sort of chicken and egg problem. How do you transport private keys if you need those private keys to encrypt your transport?</p><p>A distributed key management model fits better with the way modern services are typically deployed and run. The trick is creating the private keys directly in the application server. At install or run time, a service creates its own private key and sends a request to a certificate authority to issue a certificate. This can be repeated on demand if the current certificate is close to expiring.</p><p>For example, many companies are starting to use Docker, or other lightweight container technologies, to encapsulate and run individual services. Under load, services can be scaled up by automatically running new containers. In a centralized distribution model, certificates and keys for each container need to be created before the containers are deployed.</p><p>In the centralized distribution model, the provisioning service needs to create and manage a key and certificate for each service. Keeping this sort of central database in a complex and dynamic topology seems like the wrong approach. It would be preferable if the CA itself was stateless and generated a set of logs.</p><p>The idea that keys need to be transported to their destination instead of generated locally is also troubling. Transporting private keys introduces an unnecessary risk to the system. When a new service comes into being, it should generate its key locally and request a certificate for use.</p>
    <div>
      <h3>Trust across services</h3>
      <a href="#trust-across-services">
        
      </a>
    </div>
    <p>Internal services need to trust each other. Browsers validate website certificates by checking the signature on the certificate and checking the hostname against the list of Subject Alternative Names (SANs) in the certificate. This type of explicit check is useful, but it has a record of <a href="https://cwe.mitre.org/data/definitions/297.html">not working as expected</a>. Another way for services to trust each other is an implicit check based on per-service CAs.</p><p>The idea is simple: use a different CA for each set of services. Issue all database certificates from a database CA and all API servers from an API server CA.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/25QdARnmhs56cQyEzRWRZs/c0abd815cfbbc0267b7f19aeaccdaa7c/provisioning-app-certificates.png" />
            
            </figure><p>When setting these services up to talk to each other with mutual TLS authentication configure the trust stores as follows:</p><ul><li><p>API server only trusts DB CA</p></li><li><p>DB only trusts API CA</p></li></ul><p>This approach is less fine-grained than an explicit check against a SAN, but it is more robust and easier to manage on the CA policy side. With an implicit trust system in place, you can guarantee that services of type A can only communicate with services of type B.</p><p>The following diagram describes how two applications can trust each other with mutually authenticated TLS.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6zHWhhn4tWw94Y9yGmBFjy/a76107c0a0268e886c15c7f54261c669/service-to-service-communication.png" />
            
            </figure><p>In this diagram, the API server trusts the DB CA (in red). It will therefore only accept certificates that are signed by the DB CA (i.e. with a red ribbon). Conversely, the database server only accepts certificates with a signature from the API CA (orange ribbon). To establish a trusted connection, each party sends a key share to the other, signed with their certificate’s private key. The key shares are combined to create a session key, with which both parties can encrypt their data. The chain of verification from key share to certificate to CA assure that the other party is authentic.</p><p>Establishing a mutually authenticated trusted tunnel between services prevents attackers from accessing or modifying data in transit and causing havoc on your services. With a strong PKI in place, every service can communicate securely and confidentially over any network, even the Internet.</p>
    <div>
      <h2>Using a PKI for remote services</h2>
      <a href="#using-a-pki-for-remote-services">
        
      </a>
    </div>
    <p>Internal PKIs are very flexible and can be used to issue certificates to third parties who are integrating with your network. For example, CloudFlare has a service called <a href="https://www.cloudflare.com/railgun">Railgun</a> that can be used to optimize connections between CloudFlare and an origin server. Communication between Railgun and CloudFlare is done over an encrypted and authenticated channel using certificates from a CloudFlare certificate authority.</p><p>This ensures that data is secure in transit. When a new Railgun instance is set up on the origin server, it creates a private key and sends a CSR to CloudFlare, which then issues the appropriate certificate. The Railgun server keeps the private key in memory and deletes it when it shuts down, preventing other services from getting access to it.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6MzHk6TL9t4sBWgQz4kEQ6/009bdae54937d9e446064477f494cb87/illustrations-ssl-blog-june-2015-02-1.png" />
            
            </figure><p>This model works great for not only Railgun, but several other initiatives at CloudFlare such as the <a href="/universal-ssl-encryption-all-the-way-to-the-origin-for-free/">Origin CA</a> and <a href="/keyless-ssl-the-nitty-gritty-technical-details/">Keyless SSL</a>.</p>
    <div>
      <h2>Conclusion</h2>
      <a href="#conclusion">
        
      </a>
    </div>
    <p>Securing data at the application level is an important step for securing a distributed systems architecture, but is only truly effective with a strong PKI in place.</p> ]]></content:encoded>
            <category><![CDATA[TLS]]></category>
            <category><![CDATA[HTTPS]]></category>
            <category><![CDATA[Encryption]]></category>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[CFSSL]]></category>
            <category><![CDATA[Security]]></category>
            <guid isPermaLink="false">71loFFBcz7GMVazjFt5flh</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
        <item>
            <title><![CDATA[Universal SSL: Encryption all the way to the origin, for free]]></title>
            <link>https://blog.cloudflare.com/universal-ssl-encryption-all-the-way-to-the-origin-for-free/</link>
            <pubDate>Tue, 24 Feb 2015 20:15:12 GMT</pubDate>
            <description><![CDATA[ Last September, CloudFlare unveiled Universal SSL, enabling HTTPS support for all sites by default. All sites using CloudFlare now support strong cryptography from the browser to CloudFlare’s servers. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Last September, CloudFlare unveiled <a href="/introducing-universal-ssl/">Universal SSL</a>, enabling HTTPS support for all sites by default. All sites using CloudFlare now support strong cryptography from the browser to CloudFlare’s servers. One of the most popular requests for Universal SSL was to make it easier to encrypt the other half of the connection: from CloudFlare to the origin server.</p><p>Until today, encryption from CloudFlare to the origin required the purchase of a trusted certificate from a third party. The certificate purchasing process can be tedious and sometimes costly. To remedy this, CloudFlare has created a new Origin CA service in which we provide free limited-function certificates to customer origin servers.</p><p>Today we are excited to announce the public beta of this service, providing full encryption of all data from the browser to the origin, for free.</p>
    <div>
      <h3>Encrypted all the way</h3>
      <a href="#encrypted-all-the-way">
        
      </a>
    </div>
    <p>CloudFlare offers three modes for HTTPS: Flexible, Full and Strict. In Flexible mode, traffic from browsers to CloudFlare is encrypted, but traffic from CloudFlare to a site's origin server is not. In Full and Strict modes, traffic between CloudFlare and the origin server is encrypted. Strict mode adds validation of the origin server’s certificate. We strongly encourage customers to select Strict mode for their websites to ensure their visitors get the strongest data security possible.</p><p>As we <a href="/origin-server-connection-security-with-universal-ssl/">previously discussed</a>, sites on <a href="https://www.cloudflare.com/plans/free/">CloudFlare’s Free plan</a> default to Flexible SSL mode. To take advantage of our Strict SSL mode it’s necessary to install a certificate on the origin server, which until now required them to buy one from a third party. Now customers can get that certificate directly from CloudFlare, for free.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1uVSxqXR6vUpUQ6ugD42yo/79d259ee62d60e2105efd2e36ec13cbf/illustration-strict-ssl--2-.png" />
            
            </figure><p>This certificate is only used to protect the traffic between the origin server and CloudFlare; it is never presented to browsers. For now you should only use it behind orange-clouded sites on CloudFlare.</p><p>If you are a CloudFlare customer and want to sign up for the beta, just send an email to <a>origin-ca-beta@cloudflare.com</a> with the following:</p><ul><li><p>A certificate signing request (CSR)</p></li><li><p>The domain name of the orange-clouded zone you want to install the certificate on</p></li></ul><p>The first <i>ten</i> brave beta customers will get a shiny new certificate to install on their web server. Note: do <i>not</i> send your private key to CloudFlare, only the CSR is needed.</p><p><i>Update: The beta is full! Thanks to those who are participating.</i></p>
    <div>
      <h3>CloudFlare’s Origin Certificate Authority</h3>
      <a href="#cloudflares-origin-certificate-authority">
        
      </a>
    </div>
    <p>In order to grant certificates to customer origins, CloudFlare had to create its own Certificate Authority. This consists of a set of processes and systems to validate certificate requests and create new certificates. For the Origin CA, CloudFlare created a private key and certificate for the specific purpose of signing certificates for origin servers.</p>
    <div>
      <h4>Software</h4>
      <a href="#software">
        
      </a>
    </div>
    <p>The certificate authority software we use is <a href="/introducing-cfssl/">CFSSL</a>, our open source PKI toolkit written in Go. It allows us to validate CSRs and use them to create new certificates for sites. These certificates are signed with our certificate authority private key, and validated when CloudFlare connects to the origin in Strict SSL mode.</p><p>In collaboration with other members of the industry (such as Richard Barnes from the <a href="https://letsencrypt.org/">Let's Encrypt</a> project), we have updated CFSSL with several new features that help make it a viable certificate authority tool. These include <a href="http://en.wikipedia.org/wiki/PKCS_11">PKCS#11</a> support, which makes it possible for CFSSL to use a Hardware Security Module (HSM) to store private keys and <a href="http://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol">OCSP</a> support, which lets CFSSL answer questions about the revocation status of a certificate.</p>
    <div>
      <h4>Validation</h4>
      <a href="#validation">
        
      </a>
    </div>
    <p>CAs are supposed to only give certificates to sites that own the domain(s) listed in the certificate. Domain validation is usually done in one of three ways:</p><ul><li><p>Putting a challenge in the DNS zone</p></li><li><p>Putting a challenge into a meta-tag of an HTML page hosted on the domain</p></li><li><p>Sending an email challenge to the domain registrant from the WhoIs DB</p></li></ul><p>Since CloudFlare is both a <a href="https://www.cloudflare.com/learning/cdn/what-is-a-cdn/">content delivery network</a> and a DNS provider, both DNS and HTML validation can be done by CloudFlare on behalf of the site. If your site is on CloudFlare and orange-clouded, we will give you a certificate for your site.</p>
    <div>
      <h4>Public trust</h4>
      <a href="#public-trust">
        
      </a>
    </div>
    <p>The CloudFlare Origin CA is currently not trusted by browsers, so these certificates should not be used on sites that are not behind CloudFlare. To issue certificates that are trusted by browsers, we would have to convince a publicly trusted certificate authority to cross-sign our CA certificate. This is not necessary in this case since it is CloudFlare that determines which certificates we trusted and the Origin CA is on our list.</p><hr />
    <div>
      <h3>Bonus: How to create Certificate Signing Requests</h3>
      <a href="#bonus-how-to-create-certificate-signing-requests">
        
      </a>
    </div>
    <p>The certificate signing request (CSR) is the standard mechanism for obtaining a certificate from a certificate authority. It contains a public key, some metadata such as which domain it is for and is digitally signed by a private key. It lets CloudFlare know that you own the private key.</p>
    <div>
      <h4>Creating a CSR and private key with CFSSL</h4>
      <a href="#creating-a-csr-and-private-key-with-cfssl">
        
      </a>
    </div>
    <p>CFSSL is not only a tool that can be used for running a CA, but it can be used to create CSRs too. Following these instructions will get you a private key and a CSR to submit to a certificate authority.</p><h6>1) Install Go:</h6><p><a href="https://golang.org/doc/install">https://golang.org/doc/install</a></p><h6>2) Install CFSSL</h6>
            <pre><code>$ go get github.com/cloudflare/cfssl/cmd/...</code></pre>
            <h6>3) Create a CSR template</h6><p>Use the following template for <code>csr.json</code> and replace “mysite.com” with your site’s <a href="https://www.cloudflare.com/learning/dns/glossary/what-is-a-domain-name/">domain name</a> and names with your company's information.</p><p>csr.json:</p>
            <pre><code>{
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "hosts": [
    “mysite.com"
  ],
 "CN": "mysite.com",
  "names": [
    {
      "C": "US",
      "L": "San Francisco",
      "ST": "California",
      "O": "My Company, Inc.",
      "OU": "My Company’s IT Department"
    }
  ]
}</code></pre>
            <h6>4) Create the certificate</h6>
            <pre><code>$ cfssl genkey csr.json | cfssljson -bare site</code></pre>
            <p>This creates two files:</p><ul><li><p><code>site.csr</code>: your CSR</p></li><li><p><code>site-key.pem</code>: your private key</p></li></ul>
    <div>
      <h5>Other resources</h5>
      <a href="#other-resources">
        
      </a>
    </div>
    <p>If CFSSL is not working for you, here are some more resources for creating CSRs:</p><ul><li><p><a href="https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/1/19/csr-generation-using-openssl-apache-wmod_ssl-nginx-os-x">Comodo</a></p></li><li><p><a href="https://support.globalsign.com/customer/portal/articles/1229769-certificate-signing-request-csr---overview">GlobalSign</a></p></li><li><p><a href="https://www.digicert.com/csr-creation.htm">Digicert</a></p></li></ul><p>In the future we plan on releasing tools to make certificate generation even easier and more automatic.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/gkjU9sNg6L0UT6j0x6keC/bd0b762f12482a99f8a66eba329b7331/cloudflare_ssl-week-2.png" />
            
            </figure><p></p> ]]></content:encoded>
            <category><![CDATA[HTTPS]]></category>
            <category><![CDATA[CFSSL]]></category>
            <category><![CDATA[Universal SSL]]></category>
            <category><![CDATA[Encryption]]></category>
            <category><![CDATA[Certificate Authority]]></category>
            <category><![CDATA[Security]]></category>
            <guid isPermaLink="false">47jKviMlM0kk9qsg8TQ3xz</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
    </channel>
</rss>