
<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 12:23:55 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Securing Certificate Issuance using Multipath Domain Control Validation]]></title>
            <link>https://blog.cloudflare.com/secure-certificate-issuance/</link>
            <pubDate>Tue, 18 Jun 2019 13:00:00 GMT</pubDate>
            <description><![CDATA[ Trust on the Internet is underpinned by the Public Key Infrastructure (PKI). PKI grants servers the ability to securely serve websites by issuing digital certificates, providing the foundation for encrypted and authentic communication.  ]]></description>
            <content:encoded><![CDATA[ <p></p><p>This blog post is part of <a href="/welcome-to-crypto-week-2019/">Crypto Week 2019</a>.</p><p>Trust on the Internet is underpinned by the Public Key Infrastructure (PKI). PKI grants servers the ability to securely serve websites by issuing digital certificates, providing the foundation for encrypted and authentic communication.</p><p>Certificates make HTTPS encryption possible by using the public key in the certificate to verify server identity. HTTPS is especially important for websites that transmit sensitive data, such as banking credentials or private messages. Thankfully, modern browsers, such as Google Chrome, flag websites not secured using HTTPS by marking them “Not secure,” allowing users to be more security conscious of the websites they visit.</p><p>This blog post introduces a new, free tool Cloudflare offers to CAs so they can further secure certificate issuance. But before we dive in too deep, let’s talk about where certificates come from.</p>
    <div>
      <h3>Certificate Authorities</h3>
      <a href="#certificate-authorities">
        
      </a>
    </div>
    <p>Certificate Authorities (CAs) are the institutions responsible for issuing certificates.</p><p>When issuing a certificate for any given domain, they use Domain Control Validation (DCV) to verify that the entity requesting a certificate for the domain is the legitimate owner of the domain. With DCV the domain owner:</p><ol><li><p>creates a DNS resource record for a domain;</p></li><li><p>uploads a document to the web server located at that domain; OR</p></li><li><p>proves ownership of the domain’s administrative email account.</p></li></ol><p>The DCV process prevents adversaries from obtaining private-key and certificate pairs for domains not owned by the requestor.  </p><p>Preventing adversaries from acquiring this pair is critical: if an incorrectly issued certificate and private-key pair wind up in an adversary’s hands, they could pose as the victim’s domain and serve sensitive HTTPS traffic. This violates our existing trust of the Internet, and compromises private data on a potentially massive scale.</p><p>For example, an adversary that tricks a CA into mis-issuing a certificate for gmail.com could then perform TLS handshakes while pretending to be Google, and exfiltrate cookies and login information to gain access to the victim’s Gmail account. The risks of certificate mis-issuance are clearly severe.</p>
    <div>
      <h3>Domain Control Validation</h3>
      <a href="#domain-control-validation">
        
      </a>
    </div>
    <p>To prevent attacks like this, CAs only issue a certificate after performing DCV. One way of validating domain ownership is through HTTP validation, done by uploading a text file to a specific HTTP endpoint on the webserver they want to secure.  Another DCV method is done using email verification, where an email with a validation code link is sent to the administrative contact for the domain.</p>
    <div>
      <h3>HTTP Validation</h3>
      <a href="#http-validation">
        
      </a>
    </div>
    <p>Suppose Alice <a href="https://www.cloudflare.com/learning/dns/how-to-buy-a-domain-name/">buys</a> the domain name aliceswonderland.com and wants to get a dedicated certificate for this domain. Alice chooses to use Let’s Encrypt as their certificate authority. First, Alice must generate their own private key and create a certificate signing request (CSR). She sends the CSR to Let’s Encrypt, but the CA won’t issue a certificate for that CSR and private key until they know Alice owns aliceswonderland.com. Alice can then choose to prove that she owns this domain through HTTP validation.</p><p>When Let’s Encrypt performs DCV over HTTP, they require Alice to place a randomly named file in the <code>/.well-known/acme-challenge</code> path for her website. The CA must retrieve the text file by sending an HTTP <code>GET</code> request to <code>http://aliceswonderland.com/.well-known/acme-challenge/&lt;random_filename&gt;</code>. An expected value must be present on this endpoint for DCV to succeed.</p><p>For HTTP validation, Alice would upload a file to <code>http://aliceswonderland.com/.well-known/acme-challenge/YnV0dHNz</code></p><p>where the body contains:</p>
            <pre><code>curl http://aliceswonderland.com/.well-known/acme-challenge/YnV0dHNz

GET /.well-known/acme-challenge/YnV0dHNz
Host: aliceswonderland.com

HTTP/1.1 200 OK
Content-Type: application/octet-stream

YnV0dHNz.TEST_CLIENT_KEY</code></pre>
            <p>The CA instructs them to use the Base64 token <code>YnV0dHNz</code>. <code>TEST_CLIENT_KEY</code> in an account-linked key that only the certificate requestor and the CA know. The CA uses this field combination to verify that the certificate requestor actually owns the domain. Afterwards, Alice can get her certificate for her website!</p>
    <div>
      <h3>DNS Validation</h3>
      <a href="#dns-validation">
        
      </a>
    </div>
    <p>Another way users can validate domain ownership is to add a DNS TXT record containing a verification string or <i>token</i> from the CA to their domain’s resource records. For example, here’s a domain for an enterprise validating itself towards Google:</p>
            <pre><code>$ dig TXT aliceswonderland.com
aliceswonderland.com.	 28 IN TXT "google-site-verification=COanvvo4CIfihirYW6C0jGMUt2zogbE_lC6YBsfvV-U"</code></pre>
            <p>Here, Alice chooses to create a TXT DNS resource record with a specific token value. A Google CA can verify the presence of this token to validate that Alice actually owns her website.</p>
    <div>
      <h3>Types of BGP Hijacking Attacks</h3>
      <a href="#types-of-bgp-hijacking-attacks">
        
      </a>
    </div>
    <p>Certificate issuance is required for servers to securely communicate with clients. This is why it’s so important that the process responsible for issuing certificates is also secure. Unfortunately, this is not always the case.</p><p>Researchers at Princeton University recently discovered that common DCV methods are vulnerable to attacks executed by network-level adversaries. If Border Gateway Protocol (BGP) is the “postal service” of the Internet responsible for delivering data through the most efficient routes, then Autonomous Systems (AS) are individual post office branches that represent an Internet network run by a single organization. Sometimes network-level adversaries advertise false routes over BGP to steal traffic, especially if that traffic contains something important, like a domain’s certificate.</p><p><a href="https://www.princeton.edu/~pmittal/publications/bgp-tls-usenix18.pdf"><i>Bamboozling Certificate Authorities with BGP</i></a> highlights five types of attacks that can be orchestrated during the DCV process to obtain a certificate for a domain the adversary does not own. After implementing these attacks, the authors were able to (ethically) obtain certificates for domains they did not own from the top five CAs: Let’s Encrypt, GoDaddy, Comodo, Symantec, and GlobalSign. But how did they do it?</p>
    <div>
      <h3>Attacking the Domain Control Validation Process</h3>
      <a href="#attacking-the-domain-control-validation-process">
        
      </a>
    </div>
    <p>There are two main approaches to attacking the DCV process with BGP hijacking:</p><ol><li><p>Sub-Prefix Attack</p></li><li><p>Equally-Specific-Prefix Attack</p></li></ol><p>These attacks create a vulnerability when an adversary sends a certificate signing request for a victim’s domain to a CA. When the CA verifies the network resources using an <code>HTTP GET</code>  request (as discussed earlier), the adversary then uses BGP attacks to hijack traffic to the victim’s domain in a way that the CA’s request is rerouted to the adversary and not the domain owner. To understand how these attacks are conducted, we first need to do a little bit of math.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/55IOsCmOIvDukAEqazUFq9/2a480249d3d70e5a1b271367f9eeb719/Domain-Control-Validation-Process_1.5x.png" />
            
            </figure><p>Every device on the Internet uses an IP (Internet Protocol) address as a numerical identifier. IPv6 addresses contain 128 bits and follow a slash notation to indicate the size of the prefix. So, in the network address <b>2001:DB8:1000::/48</b>, “<b>/48</b>” refers to how many bits the network contains. This means that there are 80 bits left that contain the host addresses, for a total of 10,240 host addresses. The smaller the prefix number, the more host addresses remain in the network. With this knowledge, let’s jump into the attacks!</p>
    <div>
      <h4>Attack one: Sub-Prefix Attack</h4>
      <a href="#attack-one-sub-prefix-attack">
        
      </a>
    </div>
    <p>When BGP announces a route, the router always prefers to follow the more specific route. So if <b>2001:DB8::/32</b> and <b>2001:DB8:1000::/48</b> are advertised, the router will use the latter as it is the more specific prefix. This becomes a problem when an adversary makes a BGP announcement to a specific IP address while using the victim’s domain IP address. Let’s say the IP address for our victim, leagueofentropy.com, is <b>2001:DB8:1000::1</b> and announced as <b>2001:DB8::/32</b>. If an adversary announces the prefix <b>2001:DB8:1000::/48</b>, then they will capture the victim’s traffic, launching a <i>sub-prefix hijack attack</i>.</p><p>In an IPv4 attack, such as the <a href="/bgp-leaks-and-crypto-currencies/">attack</a> during April 2018, this was /24 and /23 announcements, with the more specific /24 being announced by the nefarious entity. In IPv6, this could be a /48 and /47 announcement. In both scenarios, /24's and /48's are the smallest blocks allowed to be routed globally. In the diagram below, <b>/47</b> is Texas and <b>/48</b> is the more specific Austin, Texas. The new (but nefarious) routes overrode the existing routes for portions of the Internet. The attacker then ran a nefarious DNS server on the normal IP addresses with DNS records pointing at some new nefarious web server instead of the existing server. This attracted the traffic destined for the victim’s domain within the area the nefarious routes were being propagated. The reason this attack was successful was because a more specific prefix is always preferred by the receiving routers.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1u8kdog1lBPYcQsjARPOkV/03c3da0661363f6fe10e589673c9aeab/1-Traditional-Equally-specific-Sub-Prefix-Attack-KC-0A-_3x.png" />
            
            </figure>
    <div>
      <h4>Attack two: Equally-Specific-Prefix Attack</h4>
      <a href="#attack-two-equally-specific-prefix-attack">
        
      </a>
    </div>
    <p>In the last attack, the adversary was able to hijack traffic by offering a more specific announcement, but what if the victim’s prefix is <b>/48</b> and a sub-prefix attack is not viable? In this case, an attacker would launch an <b>equally-specific-prefix hijack</b>, where the attacker announces the same prefix as the victim. This means that the AS chooses the preferred route between the victim and the adversary’s announcements based on properties like path length. This attack only ever intercepts a portion of the traffic.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3BKdC4cWYQO25VBryOZey1/828259a83952227bffd27fc4b655bc94/2-Traditional-EquallyPrefix-Attack-0A-KC_3x.png" />
            
            </figure><p>There are more advanced attacks that are covered in more depth in the paper. They are fundamentally similar attacks but are more stealthy.</p><p>Once an attacker has successfully obtained a bogus certificate for a domain that they do not own, they can perform a convincing attack where they pose as the victim’s domain and are able to decrypt and intercept the victim’s TLS traffic. The ability to decrypt the TLS traffic allows the adversary to completely Monster-in-the-Middle (MITM) encrypted TLS traffic and reroute Internet traffic destined for the victim’s domain to the adversary. To increase the stealthiness of the attack, the adversary will continue to forward traffic through the victim’s domain to perform the attack in an undetected manner.</p>
    <div>
      <h3>DNS Spoofing</h3>
      <a href="#dns-spoofing">
        
      </a>
    </div>
    <p>Another way an adversary can gain control of a domain is by spoofing DNS traffic by using a source IP address that belongs to a DNS nameserver. Because anyone can modify their packets’ outbound IP addresses, an adversary can fake the IP address of any DNS nameserver involved in resolving the victim’s domain, and impersonate a nameserver when responding to a CA.</p><p>This attack is more sophisticated than simply spamming a CA with falsified DNS responses. Because each <a href="https://www.cloudflare.com/learning/dns/what-is-dns/">DNS query</a> has its own randomized query identifiers and source port, a fake DNS response must match the DNS query’s identifiers to be convincing. Because these query identifiers are random, making a spoofed response with the correct identifiers is extremely difficult.</p><p>Adversaries can fragment User Datagram Protocol (UDP) DNS packets so that identifying DNS response information (like the random DNS query identifier) is delivered in one packet, while the actual answer section follows in another packet. This way, the adversary spoofs the DNS response to a legitimate DNS query.</p><p>Say an adversary wants to get a mis-issued certificate for victim.com by forcing packet fragmentation and spoofing DNS validation. The adversary sends a DNS nameserver for victim.com a ICMP "fragmentation needed" packet with a small Maximum Transmission Unit, or maximum byte size. This gets the nameserver to start fragmenting DNS responses. When the CA sends a DNS query to a nameserver for victim.com asking for victim.com’s TXT records, the nameserver will fragment the response into the two packets described above: the first contains the query ID and source port, which the adversary cannot spoof, and the second one contains the answer section, which the adversary can spoof. The adversary can continually send a spoofed answer to the CA throughout the DNS validation process, in the hopes of sliding their spoofed answer in before the CA receives the real answer from the nameserver.</p><p>In doing so, the answer section of a DNS response (the important part!) can be falsified, and an adversary can trick a CA into mis-issuing a certificate.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7LqZ3us0OcigAJXbwPyIbf/656eba59808bab008b5694eb195525c2/DNS-Spoofing_3x.png" />
            
            </figure>
    <div>
      <h3>Solution</h3>
      <a href="#solution">
        
      </a>
    </div>
    <p>At first glance, one could think a Certificate Transparency log could expose a mis-issued certificate and allow a CA to quickly revoke it. CT logs, however, can take up to 24 hours to include newly issued certificates, and certificate revocation can be inconsistently followed among different browsers. We need a solution that allows CAs to proactively prevent this attacks, not retroactively address them.</p><p>We’re excited to announce that Cloudflare provides CAs a free API to leverage our global network to perform DCV from multiple vantage points around the world. This API bolsters the DCV process against BGP hijacking and off-path DNS attacks.</p><p>Given that Cloudflare runs 175+ datacenters around the world, we are in a unique position to perform DCV from multiple vantage points. Each datacenter has a unique path to DNS nameservers or HTTP endpoints, which means that successful hijacking of a BGP route can only affect a subset of DCV requests, further hampering BGP hijacks. And since we use RPKI, we actually sign and verify BGP routes.</p><p>This DCV checker additionally protects CAs against off-path, DNS spoofing attacks. An additional feature that we built into the service that helps protect against off-path attackers is DNS query source IP randomization. By making the source IP unpredictable to the attacker, it becomes more challenging to spoof the second fragment of the forged DNS response to the DCV validation agent.</p><p>By comparing multiple DCV results collected over multiple paths, our DCV API makes it virtually impossible for an adversary to mislead a CA into thinking they own a domain when they actually don’t. CAs can use our tool to ensure that they only issue certificates to rightful domain owners.</p><p>Our multipath DCV checker consists of two services:</p><ol><li><p>DCV agents responsible for performing DCV out of a specific datacenter, and</p></li><li><p>a DCV orchestrator that handles multipath DCV requests from CAs and dispatches them to a subset of DCV agents.</p></li></ol><p>When a CA wants to ensure that DCV occurred without being intercepted, it can send a request to our API specifying the type of DCV to perform and its parameters.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6yKDxJFYuvSllzdqYBDWfx/8c7e27f099e2bf94b54df5bf1810e9f6/Mulitpath-DCV_3x.png" />
            
            </figure><p>The DCV orchestrator then forwards each request to a random subset of over 20 DCV agents in different datacenters. Each DCV agent performs the DCV request and forwards the result to the DCV orchestrator, which aggregates what each agent observed and returns it to the CA.</p><p>This approach can also be generalized to performing multipath queries over DNS records, like Certificate Authority Authorization (CAA) records. CAA records authorize CAs to issue certificates for a domain, so spoofing them to trick unauthorized CAs into issuing certificates is another attack vector that multipath observation prevents.</p><p>As we were developing our multipath checker, we were in contact with the Princeton research group that introduced the proof-of-concept (PoC) of certificate mis-issuance through BGP hijacking attacks. Prateek Mittal, coauthor of the <i>Bamboozling Certificate Authorities with BGP</i> paper, wrote:</p><blockquote><p>“Our analysis shows that domain validation from multiple vantage points significantly mitigates the impact of localized BGP attacks. We recommend that all certificate authorities adopt this approach to enhance web security. A particularly attractive feature of Cloudflare’s implementation of this defense is that Cloudflare has access to a vast number of vantage points on the Internet, which significantly enhances the robustness of domain control validation.”</p></blockquote><p>Our DCV checker follows our belief that trust on the Internet must be distributed, and vetted through third-party analysis (like that provided by Cloudflare) to ensure consistency and security. This tool joins our <a href="/introducing-certificate-transparency-and-nimbus/">pre-existing Certificate Transparency monitor</a> as a set of services CAs are welcome to use in improving the accountability of certificate issuance.</p>
    <div>
      <h3>An Opportunity to Dogfood</h3>
      <a href="#an-opportunity-to-dogfood">
        
      </a>
    </div>
    <p>Building our multipath DCV checker also allowed us to <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food"><i>dogfood</i></a> multiple Cloudflare products.</p><p>The DCV orchestrator as a simple fetcher and aggregator was a fantastic candidate for <a href="https://developers.cloudflare.com/workers/">Cloudflare Workers</a>. We <a href="/generating-documentation-for-typescript-projects/">implemented the orchestrator in TypeScript</a> using this post as a guide, and created a typed, reliable orchestrator service that was easy to deploy and iterate on. Hooray that we don’t have to maintain our own <code>dcv-orchestrator</code>  server!</p><p>We use <a href="https://developers.cloudflare.com/argo-tunnel/">Argo Tunnel</a> to allow Cloudflare Workers to contact DCV agents. Argo Tunnel allows us to easily and securely expose our DCV agents to the Workers environment. Since Cloudflare has approximately 175 datacenters running DCV agents, we expose many services through Argo Tunnel, and have had the opportunity to load test Argo Tunnel as a power user with a wide variety of origins. Argo Tunnel readily handled this influx of new origins!</p>
    <div>
      <h3>Getting Access to the Multipath DCV Checker</h3>
      <a href="#getting-access-to-the-multipath-dcv-checker">
        
      </a>
    </div>
    <p>If you and/or your organization are interested in trying our DCV checker, email <a>dcv@cloudflare.com</a> and let us know! We’d love to hear more about how multipath querying and validation bolsters the security of your certificate issuance.</p><p>As a new class of BGP and IP spoofing attacks threaten to undermine PKI fundamentals, it’s important that website owners advocate for multipath validation when they are issued certificates. We encourage all CAs to use multipath validation, whether it is Cloudflare’s or their own. Jacob Hoffman-Andrews, Tech Lead, Let’s Encrypt, wrote:</p><blockquote><p>“BGP hijacking is one of the big challenges the web PKI still needs to solve, and we think multipath validation can be part of the solution. We’re testing out our own implementation and we encourage other CAs to pursue multipath as well”</p></blockquote><p>Hopefully in the future, website owners will look at multipath validation support when selecting a CA.</p> ]]></content:encoded>
            <category><![CDATA[Crypto Week]]></category>
            <category><![CDATA[Cryptography]]></category>
            <category><![CDATA[DNS]]></category>
            <category><![CDATA[BGP]]></category>
            <category><![CDATA[TLS]]></category>
            <category><![CDATA[CFSSL]]></category>
            <category><![CDATA[HTTPS]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <guid isPermaLink="false">142PyPkCaDGbaxHJsIruoK</guid>
            <dc:creator>Dina Kozlov</dc:creator>
            <dc:creator>Gabbi Fisher</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing CFSSL 1.2]]></title>
            <link>https://blog.cloudflare.com/introducing-cfssl-1-2/</link>
            <pubDate>Thu, 31 Mar 2016 12:00:00 GMT</pubDate>
            <description><![CDATA[ Continuing our commitment to high quality open-source software, we’re happy to announce release 1.2 of CFSSL, our TLS/PKI Swiss Army knife. We haven’t written much about CFSSL here since we originally open sourced the project in 2014, so we thought we’d provide an update. ]]></description>
            <content:encoded><![CDATA[ <p>Continuing our commitment to high quality open-source software, we’re happy to announce release 1.2 of CFSSL, our TLS/PKI Swiss Army knife. We haven’t written much about CFSSL here since we <a href="/introducing-cfssl/">originally open sourced the project</a> in 2014, so we thought we’d provide an update. In the last 20 months, we have added a ton of great features, and CFSSL has attracted an active community of users and <a href="https://github.com/cloudflare/cfssl/graphs/contributors">contributors</a>. Users range from large SaaS providers (Heroku) to game companies (Riot Games) and the newest Certificate Authority (Let’s Encrypt). For them and for CloudFlare, CFSSL has become a core tool for automating certificates and TLS configurations. With added support for configuration scanning, automated provisioning via the transport package, revocation, certificate transparency and PKCS#11, CFSSL is now even more powerful.</p><p>We’re also happy to announce CFSSL’s new home: <a href="http://cfssl.org">cfssl.org</a>. From there you can try out CFSSL’s user interface, download binaries, and test some of its features.</p>
    <div>
      <h3>Motivation</h3>
      <a href="#motivation">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4dDeCSuAPv9TzI9o5urty5/d62243397e9a4bfc071af63314ab9950/image_0.jpg" />
            
            </figure><p><a href="https://commons.wikimedia.org/wiki/File:NSA_Muscular_Google_Cloud.jpg">Licensing: Public Domain</a></p><p>This 2013 National Security Agency (NSA) slide describing how data from Google’s internal network was collected by intelligence agencies was eye-opening—and shocking—to many technology companies. The idea that an attacker could read messages passed between services wasn’t technically groundbreaking, but it did reveal a security flaw in the way many distributed systems were designed. Many companies only encrypted the data to the border of their datacenter, not inside. The slide showed that private physical networks are being subverted to extract data passing through them. And just because a network has a <a href="https://www.cloudflare.com/learning/access-management/what-is-the-network-perimeter/">security perimeter</a>, it doesn’t mean that data can be safely sent between applications unencrypted inside that perimeter. In short: treat your own network as hostile.</p><p>This mentality helped shape CloudFlare’s philosophy for securing internal services and resulted in a simple rule:</p><blockquote><p>Services should only communicate with each other using encrypted and mutually authenticated protocols.</p></blockquote><p>With this in mind we started tackling the harder problem of how to manage the encryption keys for these services. To tackle the issue of service-to-service encryption, <a href="/how-to-build-your-own-public-key-infrastructure/">we built our own public key infrastructure</a> using CFSSL. Much of the new features we’re introducing in this post came about from our effort to make this system robust.</p><p>We have also made an effort to use standards-compliant and interoperable technology. By incorporating support for <a href="http://www.certificate-transparency.org/">certificate transparency</a>, <a href="https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol">OSCP</a>, and <a href="https://en.wikipedia.org/wiki/Revocation_list">CRL</a>, the standards used by the public Internet can now be used in your private infrastructure. Now, on to the new features.</p>
    <div>
      <h3>Scan</h3>
      <a href="#scan">
        
      </a>
    </div>
    <p>CFSSL now has a full-featured TLS endpoint scanner.</p><p>Just because a server uses encryption, it doesn’t mean that it is secure. There have been a <a href="https://www.youtube.com/watch?v=oovK9YkJ8Co">series of vulnerabilities</a> in TLS that only affect some configurations. To keep your server and its visitors protected against the nearly monthly new attacks you need to pick the right configuration. Staying secure requires testing your configuration against the latest vulnerabilities, and keeping your configuration updated against new threats.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7o6R0dw4TmHnB7cDYIwsvY/7ac9e5e632520f3ca97851f1e7fed8d4/image_1.png" />
            
            </figure><p>History of vulnerabilities in SSL/TLS</p><p>The gold standard for testing a website’s TLS configuration is Ivan Ristić’s <a href="https://www.ssllabs.com">SSL Labs</a>. It provides a simple letter grade for your site’s configuration (sites using CloudFlare get an A, by the way, and A+ if you <a href="/enforce-web-policy-with-hypertext-strict-transport-security-hsts/">enable HSTS</a>). The drawback of SSL Labs is that it only works on public websites: you can’t use it for internal services. At CloudFlare, we needed an easy way to check the configuration of our services as well as our customers’ origins (which are typically not publicly accessible).</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3RPq6XPIXqld31gzAhaqVl/6b925d22874b349e657aeddb99459f78/image_2.png" />
            
            </figure><p>To solve this, CloudFlare added functionality to CFSSL to scan a TLS endpoint to evaluate how securely it’s configured. With it, we are able to check the configuration of internal services and protected customer origins for the following configuration issues:</p><ul><li><p>IPv4/IPv6 connectivity</p></li><li><p>Certificate validity (expiration, trust chain, hostnames, etc.)</p></li><li><p>Supported cipher suites and algorithms</p></li><li><p>Session resumption</p></li><li><p>Revoked certificates</p></li></ul><p>Each scan provides a grade of "Good" or "Bad". CFSSL Scan can also be used to scan entire IP ranges or lists of hosts. It can be used either as a CLI or as API-driven server.</p><p>Using the CLI is a simple command:</p>
            <pre><code>$ cfssl scan cloudflare.com
{
  "Connectivity": {
	"DNSLookup": {
	  "grade": "Good",
	  "output": [
		"198.41.215.162",
		"198.41.214.162",
		"2400:cb00:2048:1::c629:d6a2",
		"2400:cb00:2048:1::c629:d7a2"
	  ]
	},
	"TCPDial": {
	  "grade": "Good"
	},
	"TLSDial": {
	  "grade": "Good"
	}
  },
  "PKI": {
	"ChainExpiration": {
	  "grade": "Good",
	  "output": "2016-11-30T23:59:59Z"
	},
	"ChainValidation": {
	  "grade": "Warning",
	  "output": [
		"Certificate for COMODO ECC Extended Validation Secure Server CA is valid for too long"
	  ]
	},
	"MultipleCerts": {
	  "grade": "Good"
	}
  },
  "TLSHandshake": {
	"CertsByCiphers": {
	  "grade": "Good",
	  "output": {
		"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA": "SHA256WithRSA",
		"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "SHA256WithRSA",
		"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256": "SHA256WithRSA",
		"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256": "SHA256WithRSA",
		"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "SHA256WithRSA",
		"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384": "SHA256WithRSA",
		"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384": "SHA256WithRSA",
		"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256": "SHA256WithRSA",
		"TLS_RSA_WITH_3DES_EDE_CBC_SHA": "SHA256WithRSA",
		"TLS_RSA_WITH_AES_128_CBC_SHA": "SHA256WithRSA",
		"TLS_RSA_WITH_AES_128_CBC_SHA256": "SHA256WithRSA",
		"TLS_RSA_WITH_AES_128_GCM_SHA256": "SHA256WithRSA",
		"TLS_RSA_WITH_AES_256_CBC_SHA": "SHA256WithRSA",
		"TLS_RSA_WITH_AES_256_CBC_SHA256": "SHA256WithRSA",
		"TLS_RSA_WITH_AES_256_GCM_SHA384": "SHA256WithRSA"
	  }
	}
  }
}</code></pre>
            <p>CFSSL Scan also accessible as part of the new <a href="https://cfssl.org/scan">CFSSL UI</a>.</p>
    <div>
      <h3>Transport Package</h3>
      <a href="#transport-package">
        
      </a>
    </div>
    <p>An important design pattern in security engineering is secure defaults. Developers want to write secure software and aren’t always security experts, let alone crypto gurus. The two trickiest parts of deploying an application that speaks TLS are:</p><ol><li><p>Configuration</p></li><li><p>Key management</p></li></ol><p>Simplicity is the key to empowering developers to use encryption in their services. We created the CFSSL Transport package to make these two tasks easy for our Go developers.</p><p>Transport is a Go library that takes regular HTTP or TCP connections, and transparently turns them into encrypted connections. Transport handles all the sticky points so that the developer doesn’t have to. This includes creating a private key, getting a certificate for it using a CFSSL CA, renewing certificates before they expire, and choosing the correct cryptographic parameters. If you’re writing a service in Go, you no longer need to know how PKI works.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/LB668vaQzSx7sH0ziXtVI/e520c040366a84eef9f5081ec96af82f/image_3.png" />
            
            </figure><p>Certificate Issuance with CFSSL CA</p><p>Not only does the Transport handle setting up and rotating certificates, it automatically checks to make sure the services your service are connecting to are using a valid certificate, including checking for revocation (more on that later).</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/VvQlLi9gWnu1bQzcOZbPN/25fd2cc8aa99655aa67487c04f428861/image_4.png" />
            
            </figure><p>OCSP Check with CFSSL CA</p><p>Internal CAs can be used to set up coarse-grained authorization between services. For example, if you have both an API server and a database, you can set up a dedicated CA for each of them. In the example below, the API server CA is in orange and the DB CA is in red. You can then configure the DB to only trust connections from the API server and vice versa. This type of setup can provide a baseline level of authorization enforcement for your applications. The transport package lets you automate the setup of these mutually-authenticated connections. This type of setup is covered in a <a href="/how-to-build-your-own-public-key-infrastructure/">previous blog post</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2aisydnjxkRWE49YnloHJh/7e46ea56a393031cf1339f2d508f14f3/image_5-1.png" />
            
            </figure><p>Once you have a CFSSL CA (or a multi-root CA) up and running, it just takes a few lines of code to start using TLS in your Go application. Just swap your standard <code>net.Dial</code> or <code>net.Listen/Accept</code> with <code>transport.Dial</code> and <code>transport.Listen/Accept</code>.</p><p>Before:</p>
            <pre><code>conn, err := net.Dial("tcp", addr)
if err != nil {
	// handle error
}</code></pre>
            <p>After (configuration file location stored in the <code>conf</code> variable):</p>
            <pre><code>var id = new(core.Identity)
data, err := ioutil.ReadFile(conf)
if err != nil {
	// handle error
}
err = json.Unmarshal(data, id)
if err != nil {
	// handle error
}

    // Renew 5 minutes before expiry
tr, err := transport.New(5 * time.Minute, id)
if err != nil {
	// handle error
}
conn, err := transport.Dial(addr, tr)
if err != nil {
	// handle error
}</code></pre>
            <p>You can start playing around with the transport package with some examples from Github:</p><p><a href="https://github.com/cloudflare/cfssl/tree/master/transport/example">https://github.com/cloudflare/cfssl/tree/master/transport/example</a></p>
    <div>
      <h3>Revocation and PostgreSQL support</h3>
      <a href="#revocation-and-postgresql-support">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/SozAa3OGRFEYvvIIf2AYd/39af18862a24b84f6280dd7fb5030f00/image_7-1.png" />
            
            </figure><p><a href="https://commons.wikimedia.org/wiki/File:Database-postgres.svg">CC Creative Commons Attribution-Share Alike 3.0 Unported</a></p><p>One of the nice things about CFSSL is that you can easily spin it up inside your infrastructure and have a certificate authority. One of the risks of running a PKI is infrastructure compromise. If the private key material for a certificate falls into the wrong hands, there need to be mechanisms so that the rest of the system knows to no longer trust that certificate.</p><p>The first step in knowing which certificates are trusted is knowing which certificates have been issued. To solve this, we added the ability to keep track, in a persistent database, of which certificates have been issued and the subset of those that have been revoked. We are big fans of PostgreSQL, so we built a database backend for CFSSL in PostgreSQL, but other backends like MySQL are <a href="https://github.com/cloudflare/cfssl/pull/562">in development</a>. You can now set up CFSSL to use a certificate database with very little work, and we leveraged that integration to create an automated revocation system.</p><p>The two standard mechanisms for signaling that a certificate is no longer trusted are certificate revocation lists (CRLs) and the online certificate status protocol (OCSP). CFSSL now fully supports both of these mechanisms.</p><p>A CRL is simply a list of revoked certificate serial numbers. It covers all certificates issued by a CA that have not expired, and is digitally signed by the CA’s private key. When a client obtains a certificate, it can simply look at this list to check to see if the certificate has been revoked. CRL files can grow quite a bit if a lot of certificates are revoked, and can therefore cause some scalability issues. We saw this <a href="/the-heartbleed-aftermath-all-cloudflare-certificates-revoked-and-reissued/">after Heartbleed</a>, when we revoked a large number of customer certificates at once.</p><p>Partly to combat these scalability issues, OCSP was introduced. OCSP provides on-demand answers about the revocation status of a given certificate. An OCSP responder is a service that returns signed answers to the question "is this certificate revoked?". The response is either "Yes" or "No". Each response is signed by the CA and has a validity period so the client knows how long to cache the response.</p><p>CFSSL now has an OCSP responder service that can be configured to run in a distributed way, without access to the CA. There are also OCSP management tools in CFSSL to automatically populate the data for the OCSP responder and keep it fresh using the certificate database.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4v0OiQafB9lqAwRrAVssdq/383b720297e414fa6a54c20fedb6db20/image_8.png" />
            
            </figure><p>In CFSSL, you can now programmatically create CRLs and OCSP responses for certificates issued by your CA. Using standards-compatible revocation mechanisms allows these certificates to be shared outside of our infrastructure and to work with most software that implements TLS.</p>
    <div>
      <h3>Certificate Transparency</h3>
      <a href="#certificate-transparency">
        
      </a>
    </div>
    <p>Another exciting new PKI standard is Certificate Transparency (CT). It helps provide (as the name implies) transparency into the workings of a certificate authority by providing an append-only log of issued certificates.</p><p>You can think of CT as a public ledger of all certificates issued. Any certificate on the list (even if issued for use on a private network) is made public and can be checked to see if it was issued according to the rules of the CA/Browser forum. If you encounter a certificate that is not on the ledger, then it may have been created fraudulently. Google Chrome <a href="https://www.certificate-transparency.org/ev-ct-plan">currently requires</a> all Extended Validation certificates used by websites to be in the CT log.</p><p>CFSSL now allows you to submit certificates to a CT log at issuance time and automatically embed the proof that it has been logged into the certificate. Running a CT log inside your internal infrastructure is a nice way to audit your CA and catch mis-issuances.</p>
    <div>
      <h3>PKCS #11</h3>
      <a href="#pkcs-11">
        
      </a>
    </div>
    <p>CFSSL is great for software deployments, as you can spin it up anywhere and run it on any platform that Go supports. You can even use our convenient Dockerfiles to deploy it in a containerized environment. However, in some situations (like running a publicly-trusted CA), keeping a private key in software is not secure enough. For these situations, hardware-based protection is needed.</p><p>The industry standard protocol for working with cryptographic hardware is called <a href="https://en.wikipedia.org/wiki/PKCS_11">PKCS#11</a>. With help from Richard Barnes of Mozilla and others we were able to add support for PKCS#11 into CFSSL. This feature is can be enabled in programs that use the <a href="https://github.com/cloudflare/cfssl/tree/master/signer/local">signer/local package</a> and the <a href="https://github.com/letsencrypt/pkcs11key">pkcs11key package</a>. We also have plans to add command line support using the <a href="https://tools.ietf.org/html/rfc7512">PKCS#11 URI specification</a>. If you have a PKCS#11 interface to your HSM, certificate creation using that key is fully supported by the <code>cfssl/signer</code> package. Power users including Let’s Encrypt use CFSSL to run their publicly trusted CA while keeping the private key in a FIPS 140-2 certified HSM.</p>
    <div>
      <h3>Conclusion</h3>
      <a href="#conclusion">
        
      </a>
    </div>
    <p>Open source is hard. Different people have different needs, and as a project maintainer you have to be respectful of these needs while honoring the spirit of the project. CloudFlare’s needs for CFSSL are not identical to the needs of its other users. We have attempted to strike a balance between building a tool for our own specific use cases and building a great general-purpose toolkit for PKI/TLS. We are grateful to the open source community for their valuable contributions to this project and are proud to be part of the tradition of free and open source software.</p><p>I’d like to thank one of the largest contributors to CFSSL over the last year: the Let’s Encrypt project. They have contributed code reviews and useful features while integrating CFSSL into Boulder, the software that manages their certificate authority. I’d also like to thank the Open Academy participants from Cornell and UCSD who worked on the project for a semester, and everyone else who helped contribute to this release. The core CFSSL team is Kyle Isom, Zi Lin, Jacob Haven, and Nick Sullivan.</p> ]]></content:encoded>
            <category><![CDATA[TLS]]></category>
            <category><![CDATA[CFSSL]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[Postgres]]></category>
            <category><![CDATA[OCSP]]></category>
            <category><![CDATA[Programming]]></category>
            <category><![CDATA[Security]]></category>
            <guid isPermaLink="false">68velcvOW35if8MiypaluK</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[Contributing back to the security community]]></title>
            <link>https://blog.cloudflare.com/contributing-back-to-the-security-community/</link>
            <pubDate>Tue, 21 Apr 2015 22:14:26 GMT</pubDate>
            <description><![CDATA[ This Friday at the RSA Conference in San Francisco, along with Marc Rogers, Principal Security Researcher at CloudFlare, I'm speaking about a version of The Grugq's PORTAL, an open source network security device designed to make life easier and safer. ]]></description>
            <content:encoded><![CDATA[ <p>This <a href="https://www.rsaconference.com/events/us15/agenda/sessions/1689/portal-open-source-secure-travel-router-for">Friday at the RSA Conference</a> in San Francisco, along with <a href="https://marcrogers.org/">Marc Rogers, Principal Security Researcher at CloudFlare</a>, I'm speaking about a version of <a href="https://github.com/grugq/portal">The Grugq's PORTAL</a>, an open source network security device designed to make life easier and safer for anyone traveling, especially internationally, with phones, tablets, laptops, and other network-connected devices.</p><p>Portal uses open-source software and services to take inexpensive, commodity travel routers and turn them into powerful security devices. Since this is pretty far from CloudFlare's core business, it warrants a brief digression into why we support projects like this.</p><p>Computer security was for a very long time only of interest to hobbyists, academics, and obscure government agencies. Cryptography was an interesting offshoot of number theory, a foundational but very abstract part of mathematics, and many of the early infrastructure components of the Internet didn't include security at all -- there was an assumption that anyone who could gain access would be responsible and well-intentioned, a consequence of the academic origins; after all, why would they want to break or steal things which were freely available.</p><p>Before the "cambrian explosion" of commercial computer security, there was still a lot of great security research -- it was just done by academics and by individuals in the "security community", who were motivated by a desire to understand how things worked, and to make tools because they loved the technology and wanted to solve their own problems. Some of the most interesting and powerful security tools available today trace their origins to rather humble open-source, hobbyist, or academic beginnings -- <a href="http://www.openpgp.org/">PGP</a>, <a href="https://www.torproject.org/">Tor</a>, <a href="https://otr.cypherpunks.ca/">OTR</a>, various forms of <a href="https://books.google.com/books?id=QKjhgCNu1D4C&amp;pg=PA239&amp;lpg=PA239&amp;dq=electronic+cash+cypherpunks&amp;source=bl&amp;ots=2tCBInnMLD&amp;sig=9cH2JVoStquYxVQQbMvO9xujO_0&amp;hl=en&amp;sa=X&amp;ei=QEk2Va_TGM_2oATVtYCgDQ&amp;ved=0CEwQ6AEwCA#v=onepage&amp;q=electronic%20cash%20cypherpunks&amp;f=false">electronic cash</a>, and many others. Many of today's most respected people in computer security entered the field during this period, out of personal curiosity or academic interest.</p><p>While CloudFlare is an eager participant in the commercial security world (we're the easiest and fastest way to set up TLS for any website, and we provide edge security and performance to millions of sites, including some of the largest sites on the Internet -- both with free service and paid services in various tiers), we are also very aware of the broad and deep foundation of security tools and research on which we're built.</p><p>CloudFlare makes extensive use of open source software, such as the <a href="http://wiki.nginx.org/Main">Nginx</a> web server, community collections of Web Application Firewall (WAF) rules originally generated by <a href="https://www.owasp.org/index.php/Main_Page">OWASP</a>, and powerful cryptographic algorithms developed in academia and implemented by open source efforts such as the OpenSSL Project.</p><p>Where possible, CloudFlare also contributes back to the community in those areas. We contribute bugfixes and new functionality back to open source packages, and we employ developers who in their spare time make additional contributions to open source software. <a href="https://cloudflare.github.io/">CloudFlare's GitHub Open Source</a> page is a great collection of many of our contributions to open source.</p><p>One of our biggest contributions to date has been <a href="https://github.com/cloudflare/cfssl">CFSSL</a>, CloudFlare's PKI toolkit. We're constantly hearing from various projects and companies how CFSSL has been helpful to them -- one of the most exciting being the <a href="https://letsencrypt.org/">Let's Encrypt</a> community Certificate Authority project. Nick Sullivan has written in the <a href="/introducing-cfssl/">CloudFlare blog announcing CFSSL</a>, and exciting things are continuing to happen with that software.</p><p>CloudFlare, like many other companies in computer security, makes other contributions to the security community. One of the most interesting is that we, like some other companies, values having employees participate in the security community in a variety of ways. Encouraging side projects independent of work -- research, finding new vulnerabilities and responsibly disclosing them, creating new tools, participating in conferences or working groups, running tutorials, and being active in standards bodies -- sometimes doesn't have a direct connection to the company's products, but contributes to a vibrant security ecosystem. There are often unforeseen benefits of these collaborations -- learning about new tools, finding great engineers -- <a href="https://www.cloudflare.com/join-our-team">we're actively hiring for a variety of roles</a> -- and many others.</p><p>Marc and I are grateful to CloudFlare for the time to work on this open source tool and to present it to the world, and we're looking forward to presenting at RSA.</p> ]]></content:encoded>
            <category><![CDATA[CFSSL]]></category>
            <category><![CDATA[RSA]]></category>
            <category><![CDATA[Events]]></category>
            <category><![CDATA[Security]]></category>
            <guid isPermaLink="false">1xwrvpki4ppkGolv6DWRvc</guid>
            <dc:creator>Ryan Lackey</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>
        <item>
            <title><![CDATA[Origin Server Connection Security with Universal SSL]]></title>
            <link>https://blog.cloudflare.com/origin-server-connection-security-with-universal-ssl/</link>
            <pubDate>Mon, 29 Sep 2014 23:14:00 GMT</pubDate>
            <description><![CDATA[ Earlier today, CloudFlare enabled Universal SSL: HTTPS support for all sites by default. Universal SSL provides state-of-the-art encryption between browsers and CloudFlare’s edge servers keeping web traffic private and secure from tampering. ]]></description>
            <content:encoded><![CDATA[ <p>Earlier today, CloudFlare enabled Universal SSL: HTTPS support for all sites by default. Universal SSL provides state-of-the-art encryption between browsers and CloudFlare’s edge servers keeping web traffic private and secure from tampering.</p><p>CloudFlare’s Flexible SSL mode is the default for CloudFlare sites on the Free plan. Flexible SSL mode means that traffic from browsers to CloudFlare will be encrypted, but traffic from CloudFlare to a site's origin server will not be. To take advantage of our <a href="https://www.cloudflare.com/ssl">Full and Strict SSL</a> mode—which encrypts the connection between CloudFlare and the origin server—it’s necessary to install a certificate on the origin server.</p><p>We made Universal SSL free so that everyone can use modern, strong encryption tools to protect their web traffic. More encrypted traffic helps build a safer, better Internet. In keeping with CloudFlare’s goal to help build a better Internet, we have some tips on how to upgrade your site from Flexible SSL to Full or Strict SSL.</p>
    <div>
      <h3>Option 1: Full SSL: create a self-signed certificate</h3>
      <a href="#option-1-full-ssl-create-a-self-signed-certificate">
        
      </a>
    </div>
    <p>Dealing with Certificate Authorities (CAs) can be frustrating, and the process of obtaining a certificate can be time consuming. In the meantime, you can get started by installing a self-signed certificate on your origin server. This allows CloudFlare to encrypt the communication with the origin, protecting the communication against passive surveillance, but not against <a href="/introducing-strict-ssl-protecting-against-a-man-in-the-middle-attack-on-origin-traffic/">active attackers</a>.</p><p>Our <a href="https://github.com/cloudflare/cfssl/wiki/Creating-a-new-CSR">handy CSR guide</a> for <a href="https://github.com/cloudflare/cfssl">CFSSL</a> describes how to generate a self-signed certificate. Using <a href="http://msol.io/blog/tech/2013/10/06/create-a-self-signed-ecc-certificate/">OpenSSL to create it</a> is another option.</p><p>Once you have created a self-signed certificate and private key, you can install them on your origin server. Digicert has a guide for <a href="https://www.digicert.com/ssl-certificate-installation.htm">installing a certificate</a> that covers the most popular server software.</p><p>Keep in mind that a self-signed certificate is not signed by a trusted CA. This means that you can change your SSL setting from Flexible SSL to Full, but not Full (strict). Full SSL won’t be able to provide authentication, but it will make sure the connection to the origin is encrypted and protected from passive snoopers.</p>
    <div>
      <h3>Option 2: Strict SSL: get a certificate from trusted CA</h3>
      <a href="#option-2-strict-ssl-get-a-certificate-from-trusted-ca">
        
      </a>
    </div>
    <p>Most CAs offer low-cost or even free certificates. A popular CA that offers <a href="https://www.cloudflare.com/application-services/products/ssl/">free SSL certificates</a> is <a href="https://www.startssl.com/">StartSSL</a>. Buying and installing a trusted certificate on your origin server is currently the simplest way to enable Strict SSL on your site.</p><p>To enable TLS on your server, you need both a certificate and a corresponding private key. The first step in obtaining a certificate from a CA is creating a Certificate Signing Request (CSR). A CSR contains your public key and a proof that you have the associated private key. The CA will verify it and give you back a certificate that you install on your web server. We <a href="https://github.com/cloudflare/cfssl/wiki/Creating-a-new-CSR">put together a guide</a> to creating a private key and CSR with CloudFlare’s CFSSL tool that you can use, or alternatively, there’s always <a href="http://www.rackspace.com/knowledge_center/article/generate-a-csr-with-openssl">OpenSSL</a>.</p><p>Once you have a certificate installed on your origin server, you can change your SSL setting from Flexible to Full (strict) and have the added benefit of an authenticated and encrypted connection to your origin server.</p>
    <div>
      <h3>Option 3: (sneak preview) The CloudFlare Origin CA/Certificate Pinning</h3>
      <a href="#option-3-sneak-preview-the-cloudflare-origin-ca-certificate-pinning">
        
      </a>
    </div>
    <p>Soon you will be able to send your CSR to CloudFlare to get a certificate instantaneously, speeding up the certificate acquisition process. This process will be like that of a regular CA, but much faster. These certificates aren't yet trusted by browsers, but <i>will</i> be trusted by CloudFlare, allowing the back end connection to be both encrypted and authenticated. This also protects your site if one of the publicly trusted certificate authorities is compromised <a href="http://threatpost.com/final-report-diginotar-hack-shows-total-compromise-ca-servers-103112/77170">by attackers</a> and used to issue <a href="http://www.zdnet.com/indian-government-agency-issues-fake-google-certificates-7000031396/">illegitimate certificates</a>.</p><p>We’re also investigating the possibility of adding a feature called <a href="https://www.google.com/webhp?sourceid=chrome-instant&amp;ion=1&amp;espv=2&amp;ie=UTF-8#safe=active&amp;q=certificate+pinning">Certificate Pinning</a>. Certificate Pinning would allow you to tell CloudFlare exactly which certificate to trust for your origin. This would allow customers to use hosting services that don’t allow custom certificates to have the benefit of a fully encrypted tunnel, or to simply use a self-signed certificate and get the benefit of both authentication and encryption.</p> ]]></content:encoded>
            <category><![CDATA[HTTPS]]></category>
            <category><![CDATA[Universal SSL]]></category>
            <category><![CDATA[Encryption]]></category>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[CFSSL]]></category>
            <category><![CDATA[Security]]></category>
            <guid isPermaLink="false">3gC9ZZvYX0en9ddjBpvtRS</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing CFSSL - CloudFlare's PKI toolkit]]></title>
            <link>https://blog.cloudflare.com/introducing-cfssl/</link>
            <pubDate>Thu, 10 Jul 2014 04:00:00 GMT</pubDate>
            <description><![CDATA[ Today we’re proud to introduce CFSSL—our open source toolkit for everything TLS/SSL. CFSSL is used internally by CloudFlare for bundling TLS/SSL certificates chains, and for our internal Certificate Authority infrastructure. ]]></description>
            <content:encoded><![CDATA[ <p>Today we’re proud to introduce CFSSL—our open source toolkit for everything TLS/SSL. CFSSL is used internally by CloudFlare for bundling TLS/SSL certificates chains, and for our internal Certificate Authority infrastructure. We use this tool for all our TLS certificates.</p><p>Creating a certificate bundle is a common pain point for website operators, and doing it right is important for <a href="https://www.cloudflare.com/learning/security/how-to-secure-a-website/">website security</a> AND speed (CloudFlare does both). Getting the correct bundle together is a black art, and can quickly become a debugging nightmare if it's not done correctly. We wrote CFSSL to make bundling easier. By picking the right chain of certificates, CFSSL solves the balancing act between performance, security, and compatibility.</p><p>Staying true to our <a href="/what-we-just-did-to-make-ssl-even-faster">promise</a> to make the web fast and safe, we’re open sourcing CFSSL. We believe CFSSL will be useful for anyone building a site using HTTPS—from website owners to large software-as-a-service companies. CFSSL is written in Go and available on the <a href="https://github.com/cloudflare/cfssl">CloudFlare Github account</a>. It can be used as a web service with a JSON API, and as a handy command line tool.</p><p>CFSSL is the result of real-world expertise about how the TLS ecosystem on the Web works that you can gain by working at CloudFlare’s scale. These are hard-won lessons, applied in code. The rest of this blog post serves as an under-the-hood look at how and why CFSSL works, and how you can use it as a certificate bundler or as a lightweight CA.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/8WQQFZJ2zXV0Z0syJB0W4/b8552d223bc0632d986a4f5f7630c3cf/image02_2.png" />
            
            </figure><p>As you can see in the above image, the key is owned by CloudFlare, Inc., and the issuer is GlobalSign (a well-known CA). GlobalSign has issued a certificate named “GlobalSign Extended Validation CA - SHA256 - G2”; this G2 certificate is signed by another certificate called “GlobalSign Root CA - R2”. Note that the root certificate does not have an issuer—it is signed by its own private key. In other words, the root vouches for itself.</p><p>The reason your browser trusts a root certificate is because browsers have a list of root certificates that they implicitly trust, and when a site is trusted it will show the lock icon to the left of the web address (see image below). Certain certificates are on the list typically because they have been around for some time, and they belong to certificate authorities that have gone through a rigorous security audit. GlobalSign is one of these trusted authorities; therefore, its root certificate is in the list of trusted root certificates for nearly every browser.</p>
    <div>
      <h3>What Are SSL Certificates?</h3>
      <a href="#what-are-ssl-certificates">
        
      </a>
    </div>
    <p><a href="https://www.cloudflare.com/application-services/products/ssl/">SSL certificates</a> form the core of trust on the web by assuring the identity of websites. This trust is built by digitally binding a cryptographic key to an organization’s identity. An SSL certificate will bind domain names to server names, and company names to locations. This ensures that if you go to your bank’s web site, for example, you know for sure it is your bank, and you are not giving out your information to a phishing scam.</p><p>A certificate is a file that contains a public key which is bound to a record of its owner. The mechanism that makes this binding trustworthy is called the <a href="http://en.wikipedia.org/wiki/Public_key_infrastructure">Public Key Infrastructure</a> and public-key cryptography is the glue that makes this possible.</p><p>A certificate is associated with a private key that corresponds to the certificate's public key, which is stored separately. The certificate comes with a digital signature from a trusted third-party called a certificate authority or CA. Let's examine the <a href="https://www.cloudflare.com/">cloudflare.com</a> certificate.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1u6Z00nvpHwI1E8dSWPeey/7e2c6d3406cda89d35c8a487122c5399/image00_2.jpg" />
            
            </figure><p>The length of intermediate certificates in a chain can vary, but chains will always have one leaf and one root.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/NRD5jcwOz6WLiDesX2QS6/4a2ade24a1ed76028ceabfc3d7e9940a/image01_4.png" />
            
            </figure><p>Unfortunately, there is a catch for the owner of the leaf certificate: presenting only the leaf certificate to the browser is usually not enough. The intermediate certificates are not always known to the browser, requiring the website to include them with the leaf certificate. The list of certificates that the browser needs to validate a certificate is called a certificate bundle. It should contain all the certificates in the chain up to the first certificate known to the browser. In the case of the CloudFlare website, this bundle contains both the cloudflare.com certificate and the GlobalSign G2 intermediate.</p><p>CFSSL was written to make certificate bundling easier.</p>
    <div>
      <h3>How CFSSL Makes Certificate Bundling Easier</h3>
      <a href="#how-cfssl-makes-certificate-bundling-easier">
        
      </a>
    </div>
    <p>If you are running a website (or perhaps some other TLS-based service) and need to install a certificate, CFSSL can create the certificate bundle for you. Start with the following command:</p><p>$ cfssl bundle -cert mycert.crt</p><p>This will output a JSON blob containing the chain of certificates along with relevant information extracted from that chain. Alternatively, you can run the CFSSL service that responds to requests with a JSON API:</p><p>$ cfssl serve</p><p>This command opens up an HTTP service on localhost that accepts requests. To bundle using this API, send a POST request to this service, <code>[http://localhost:8888/api/v1/cfssl/bundle](http://localhost:8888/api/v1/cfssl/bundle)</code>, using a JSON request such as:</p><p>{
"certificate": 
}</p><p>CloudFlare’s SSL service will return a JSON response of the form:</p><p>{
"result": {},
"success": true,
"errors": [],
"messages": [],
}</p><p><i>(Developers take note: this response format is a preview of our upcoming CloudFlare API rewrite; with this API, we can use CFSSL as a service for certificate bundling and more—stay tuned.)</i></p><p>If you upload your certificate to CloudFlare, this is what is used to create a certificate bundle for your website.</p><p>To create a certificate bundle with CFSSL, you need to know which certificates are trusted by the browsers you hope to display content to. In a controlled corporate environment, this is usually easy since every browser is set up with the same configuration; however, it becomes more difficult when creating a bundle for the web.</p>
    <div>
      <h3>Different Certs for Different Folks</h3>
      <a href="#different-certs-for-different-folks">
        
      </a>
    </div>
    <p>Each browser has unique capabilities and configurations, and a certificate bundle that’s trusted in one browser might not be trusted in another; this can happen for several reasons:</p><ol><li><p><i>Different browsers trust different root certificates.</i>Some browsers trust more root certificates than others. For example, the NSS root store used in Firefox trusts 143 certificates; however, Windows 8.1 trusts 391 certificates. So a bundle with a chain that expects the browser to trust a certificate exclusive to the Windows root store will appear as untrusted in Firefox.</p></li><li><p><i>Older systems might have old root stores.</i>Some browsers run on older systems that have not been updated to trust recently-created certificate authorities. For example, Android 2.2 and earlier don't trust the “GoDaddy Root Certificate Authority G2” because that root certificate was created after they were released.</p></li><li><p><i>Older systems don't support modern cryptography.</i>Users on Windows XP SP2 and earlier can't validate certificates signed by certain intermediates. This includes the “DigiCert SHA2 High Assurance Server CA” because the hash function SHA-2 used in this certificate was standardised after Windows XP was released.</p></li></ol><p>In order to provide maximum compatibility between SSL chains and browsers, you often have to pick a different certificate chain than the one originally provided to you by your CA. This alternate chain might contain a different set of intermediates that are signed by a different root certificate. Alternate chains can be troublesome. They tend to contain a longer list of certificates than the default chain from the CA, and longer chains cause site connections to be slower. This lag is because the web server needs to send more certificates (i.e. more data) to the browser, and the browser has to spend time verifying more certificates on its end. Picking the right chain can be tricky.</p><p>CFSSL helps pick the right certificate chain, selecting for performance, security, and compatibility.</p>
    <div>
      <h3>How to Pick the Best Chain</h3>
      <a href="#how-to-pick-the-best-chain">
        
      </a>
    </div>
    <p>The chain of trust works by following the keys used to sign certificates, and there can be multiple chains of trust for the same keys.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4Sn8stqKCF4WIYBx0FQYXX/3f8fa1869553c4430e1506b3fbef5bda/image03_4.png" />
            
            </figure><p>In this diagram, all of the intermediates have the same public key and represent the same identity (GlobalSign's intermediate signing certificate), and they are signed by the GlobalSign root key; however, the issuance date for each chain and signature type are different.</p><p>For some outdated browsers, the current GlobalSign root certificate is not trusted, so GlobalSign used an older CA (GlobalSign nv-sa) to sign their root certificate. This allows older browsers to trust certificates issued by GlobalSign.</p><p>Each of these are valid chains for some browsers, but each has drawbacks:</p><ul><li><p><i>CloudFlare leaf → GlobalSign SHA2 Intermediate.</i>This chain is trusted by any browser that trusts the GS root G2 and supports SHA2 (i.e., this chain would not be trusted by a browser on Windows XP SP2).</p></li><li><p><i>CloudFlare leaf → 2012 GlobalSign Intermediate → GS Root G2.</i>This chain is trusted by any browser that trusts GS Root G2, but does not benefit from the stronger cryptographic properties of the SHA-2 hashing algorithm.</p></li><li><p><i>CloudFlare leaf → 2012 GlobalSign Intermediate → GS cross-signed root.</i>This chain is trusted by any browser that trusts the GlobalSign nv-sa root, but uses the older (and weaker) GlobalSign nv-sa root certificate.</p></li></ul><p>This last chain is the most common because it’s trusted by more browsers; however, it’s also the longest, and has weaker cryptography.</p><p>CFSSL can create either the most common or the optimal bundle, and if you need help deciding, the documentation that ships with CFSSL has tips on choosing.</p><p>If you decide to create the optimal bundle, there’s a chance it might not work in some browsers; however, CFSSL is configured to let you know specifically which browsers it will not work with. For example, it will warn the user about bundles that contains certificates signed with advanced hash functions such as SHA2; they can be problematic for certain operating systems like Windows XP SP2.</p>
    <div>
      <h3>CFSSL at CloudFlare</h3>
      <a href="#cfssl-at-cloudflare">
        
      </a>
    </div>
    <p>All paid CloudFlare accounts receive HTTPS service automatically; to make this happen, our engineers do a lot of work behind scenes.</p><p>CloudFlare must obtain a certificate for each site on the service, and we want these certificates to be valid on as many browsers as possible; getting a certificate that works in multiple browsers is a challenge, but CFSSL makes things easier.</p><p>To start, a key-pair is created for the customer through a call to CFSSL's <code>genkey</code> API with the required certificate information:</p><p>{
"CN": "customer.com",
"hosts": [
"customer.com",
"<a href="http://www.customer.com">www.customer.com</a>"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "San Francisco",
"O": "Customer",
"OU": "Website",
"ST": "California"
}
]
}</p><p>Next, the CFSSL service responds with a key and a Certificate Signature Request (CSR). The CSR is sent to the CA to verify a site’s identity. Once the CA has validated the CSR, and the identity of the site, they then return a certificate signed by one of their issuing intermediates.</p><p>Once we have a certificate for a site (whether created by our CA partner or uploaded by the customer), we send the certificate to CFSSL's bundler to create a certificate bundle for the customer.</p><p>By default, we pick the most common chain. For customers who prefer performance to compatibility, we’ll soon introduce an option to rebundle certificates for optimum chains.</p>
    <div>
      <h3>CFSSL as a Certificate Authority</h3>
      <a href="#cfssl-as-a-certificate-authority">
        
      </a>
    </div>
    <p>CFSSL is not only a tool for bundling a certificate, it can also be used as a CA. This is possible because it covers the basic features of certificate creation including creating a private key, building a certificate signature request, and signing certificates.</p><p>You can create a brand new CA with CFSSL using the <code>-initca</code> option. As we saw above, this takes a JSON blob with the certificate request, and creates a new CA key and certificate:</p><p>$ cfssl gencert -initca ca_csr.json</p><p>This will return a CA certificate and CA key that is valid for signing. The CA is meant to function as an internal tool for creating certificates. CFSSL should be used behind a middle layer that processes incoming requests, and ensures they conform to policy; we use it behind the CloudFlare site as an internal service.</p><p>Here’s an example of signing a certificate with CFSSL on the command line:</p><p>$ cfssl sign -ca-key=test-key.pem -ca=test-cert.pem <a href="http://www.example.com">www.example.com</a> example.csr</p><p>Alternatively, a POST request containing the CSR and hostname can be sent to the CFSSL service via the <code>/api/v1/cfssl/sign</code> endpoint. To run the service call the <code>serve</code> command as follows:</p><p>$ cfssl serve -address=localhost -port=8888 -ca-key=test-key.pem -ca=test-cert.pem</p><p>If you already have a CFSSL instance running (in this case on localhost, but it can be anywhere), you can <a href="https://www.cloudflare.com/application-services/solutions/certificate-lifecycle-management/">automate certificate creation</a> with the gencert command’s <code>-remote</code> option. For example, if CFSSL is running on localhost, running the following gives you a private key and a certificate signed by the CA:</p><p>$ cfssl gencert -remote="localhost:8888" <a href="http://www.example.com">www.example.com</a> csr.json</p><p>At CloudFlare we use CFSSL heavily for <a href="https://www.cloudflare.com/railgun">Railgun</a> and other internal services. Special thanks go to <a href="https://twitter.com/kyleisom">Kyle Isom</a>, <a href="https://twitter.com/lziest">Zi Lin</a>, <a href="https://twitter.com/sebp">Sebastien Pahl</a>, and <a href="https://twitter.com/dok2001">Dane Knecht</a>, and the rest of the CloudFlare team for making this release possible.</p>
    <div>
      <h3>Looking Ahead</h3>
      <a href="#looking-ahead">
        
      </a>
    </div>
    <p>CloudFlare’s mission is to help build a better web, and we believe that improved certificate bundling and certificate authority tools are a step in the right direction. Encrypted sites create a safer, more private internet for everyone; by open-sourcing CFSSL, we’re making this process easier.</p><p>We have big plans for the CA part of this tool. Currently, we run CFSSL on secure locked-down machines, but plan to add stronger hardware security. Adding stronger hardware security involves integrating CFSSL with low-cost Trusted Platform Modules (TPMs). This ensures that private keys stay private, even in the event of a breach.</p><p>For additional information on CFSSL and our other open source projects, check out our <a href="https://cloudflare.github.io">Github page</a>. We encourage users to file issues on Github as they find bugs.</p> ]]></content:encoded>
            <category><![CDATA[TLS]]></category>
            <category><![CDATA[CFSSL]]></category>
            <category><![CDATA[Encryption]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[SSL]]></category>
            <category><![CDATA[Cryptography]]></category>
            <guid isPermaLink="false">1TlGPSx9AHRDBq9NWfTISE</guid>
            <dc:creator>Nick Sullivan</dc:creator>
        </item>
    </channel>
</rss>