This is a text-only version of the following page on https://raymii.org:
---
Title       : 	OCSP Stapling on Apache
Author      : 	Remy van Elst
Date        : 	03-02-2014
URL         : 	https://raymii.org/s/tutorials/OCSP_Stapling_on_Apache2.html
Format      : 	Markdown/HTML
---



When connecting to a server, clients should verify the validity of the server
certificate using either a Certificate Revocation List (CRL), or an Online
Certificate Status Protocol (OCSP) record. The problem with CRL is that the
lists have grown huge and takes forever to download.

OCSP is much more lightweight, as only one record is retrieved at a time. But
the side effect is that OCSP requests must be made to a 3rd party OCSP responder
when connecting to a server, which adds latency and potential failures. In fact,
the OCSP responders operated by CAs are often so unreliable that browser will
fail silently if no response is received in a timely manner. This reduces
security, by allowing an attacker to DoS an OCSP responder to disable the
validation.

<p class="ad"> <b>Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below:</b><br><br> <a href="https://leafnode.nl">I'm developing an open source monitoring app called  Leaf Node Monitoring, for windows, linux & android. Go check it out!</a><br><br> <a href="https://github.com/sponsors/RaymiiOrg/">Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.</a><br><br> <a href="https://www.digitalocean.com/?refcode=7435ae6b8212">You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $100 credit for 60 days. </a><br><br> </p>


The solution is to allow the server to send its cached OCSP record during the
TLS handshake, therefore bypassing the OCSP responder. This mechanism saves a
roundtrip between the client and the OCSP responder, and is called OCSP
Stapling.

The server will send a cached OCSP response only if the client requests it, by
announcing support for the status_request TLS extension in its CLIENT HELLO.

Most servers will cache OCSP response for up to 48 hours. At regular intervals,
the server will connect to the OCSP responder of the CA to retrieve a fresh OCSP
record. The location of the OCSP responder is taken from the Authority
Information Access field of the signed certificate.

[This tutorial is also available for nginx][2]

### What is OCSP Stapling

OCSP stapling is defined in the [IETF RFC 6066][3]. The term "stapling" is a
popular term used to describe how the OCSP response is obtained by the web
server. The web server caches the response from the CA that issued the
certificate. When an SSL/TLS handshake is initiated, the response is returned by
the web server to the client by attaching the cached OCSP response to the
CertificateStatus message. To make use of OCSP stapling, a client must include
the "status_request" extension with its SSL/TSL Client "Hello" message.

OCSP stapling presents several advantages including the following:

  * The relying party receives the status of the web servers certificate when it is needed (during the SSL/TLS handshake).
  * No additional HTTP connection needs to be set up with the issuing CA.
  * OCSP stapling provides added security by reducing the number of attack vectors.

[Read][4] [one][5] [of][6] [the][7] [following][8] [links][9] for more
information on OCSP and OCSP stapling.

### Requirements

You need at least Apache 2.3.3 and later plus OpenSSL 0.9.8h or later for this
to work. This is not available in the current Ubuntu LTS releases (12.04), [it
has 2.2.22][10] and [CentOS 6 has 2.2.15][11]. Either search for
PPA's/unofficial repositories or compile them yourself.

You also need create a firewall exception to allow your server to make outbound
connections to the upstream OCSP's. You can view all OCSP URI's from a website
using this one liner:

    
    
    OLDIFS=$IFS; IFS=':' certificates=$(openssl s_client -connect google.com:443 -showcerts -tlsextdebug -tls1 2>&1 </dev/null | sed -n '/-----BEGIN/,/-----END/ {/-----BEGIN/ s/^/:/; p}'); for certificate in ${certificates#:}; do echo $certificate | openssl x509 -noout -ocsp_uri; done; IFS=$OLDIFS
    

It results for google.com in:

    
    
    http://clients1.google.com/ocsp
    http://gtglobal-ocsp.geotrust.com
    

Replace google.com with your domain. Also note that you need the GNU version of
sed and bash. It does not work on OS X or BSD.

### Apache Configuration

Add the below configuration to your virtualhost:

    
    
    SSLUseStapling on
    SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
    

Here's the explanation for the two lines:

#### SSLUseStapling

    
    
    OCSP stapling relieves the client of querying the OCSP responder on its own, but it should be noted that with the RFC 6066 specification, the server's CertificateStatus reply may only include an OCSP response for a single cert. For server certificates with intermediate CA certificates in their chain (the typical case nowadays), stapling in its current implementation therefore only partially achieves the stated goal of "saving roundtrips and resources" - see also RFC 6961 (TLS Multiple Certificate Status Extension). 
    

#### SSLStaplingCache

    
    
    Configures the cache used to store OCSP responses which get included in the TLS handshake if SSLUseStapling is enabled. Configuration of a cache is mandatory for OCSP stapling. With the exception of none and nonenotnull, the same storage types are supported as with SSLSessionCache
    

The shmbc part:

    
    
    This makes use of a high-performance cyclic buffer (approx. size bytes in size) inside a shared memory segment in RAM (established via /path/to/datafile) to synchronize the local OpenSSL memory caches of the server processes. This is the recommended session cache. To use this, ensure that mod_socache_shmcb is loaded.
    

You can also give a few more options. For example, a freshness timeout, how old
the OCSP response can be:

    
    
    SSLStaplingResponseMaxAge 900
    

This lets the response only be max 15 minutes old (900 seconds).

If your apache server is behind a HTTP proxy and you need to do your OCSP
queries through a proxy you can use `SSLStaplingForceURL`. This overrides the
URL provided by the certificate:

    
    
    SSLStaplingForceURL http://internal-proxy.example.org
    

Restart your apache to load the new configuration:

    
    
    service apache2 restart
    

And it should work. Let's test it.

### Testing it

Fire up a terminal and use the following OpenSSL command to connect to your
website:

    
    
    openssl s_client -connect example.org:443 -tls1 -tlsextdebug -status
    

In the response, look for the following:

    
    
    OCSP response:
    ======================================
    OCSP Response Data:
        OCSP Response Status: successful (0x0)
        Response Type: Basic OCSP Response
        Version: 1 (0x0)
        Responder Id: 99E4405F6B145E3E05D9DDD36354FC62B8F700AC
        Produced At: Feb  3 04:25:39 2014 GMT
        Responses:
        Certificate ID:
          Hash Algorithm: sha1
          Issuer Name Hash: 0226EE2F5FA2810834DACC3380E680ACE827F604
          Issuer Key Hash: 99E4405F6B145E3E05D9DDD36354FC62B8F700AC
          Serial Number: C1A3D8D00D72FCE483CD84759E9EC0BC
        Cert Status: good
        This Update: Feb  3 04:25:39 2014 GMT
        Next Update: Feb  7 04:25:39 2014 GMT
    

That means it is working. If you get a response like below, it is not working:

    
    
    OCSP response: no response sent
    

You can also use the [SSL Labs][12] test to see if OCSP stapling works.

### Sources

  * [Apache documentation for SSLUseStapling][13]

  * [Apache documentation for SSLStaplingCache][14]

  * [Apache documentation for SSLStaplingForceURL][15]

  * [Apache documentation for SSLStaplingResponderTimeout][16]

   [1]: https://www.digitalocean.com/?refcode=7435ae6b8212
   [2]: https://raymii.org/s/tutorials/OCSP_Stapling_on_nginx.html
   [3]: http://tools.ietf.org/html/rfc6066
   [4]: http://en.wikipedia.org/wiki/OCSP_stapling
   [5]: http://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol
   [6]: http://security.stackexchange.com/questions/29686/how-does-ocsp-stapling-work
   [7]: https://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
   [8]: http://www.thawte.com/assets/documents/whitepaper/ocsp-stapling.pdf
   [9]: http://news.netcraft.com/archives/2013/04/16/certificate-revocation-and-the-performance-of-ocsp.html
   [10]: http://packages.ubuntu.com/precise/apache2
   [11]: http://mirror.centos.org/centos/6/os/x86_64/Packages/
   [12]: https://ssllabs.com
   [13]: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslusestapling
   [14]: http://httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslstaplingcache
   [15]: https://httpd.apache.org/docs/trunk/mod/mod_ssl.html#SSLStaplingForceURL
   [16]: http://httpd.apache.org/docs/trunk/mod/mod_ssl.html#SSLStaplingResponderTimeout

---

License:
All the text on this website is free as in freedom unless stated otherwise. 
This means you can use it in any way you want, you can copy it, change it 
the way you like and republish it, as long as you release the (modified) 
content under the same license to give others the same freedoms you've got 
and place my name and a link to this site with the article as source.

This site uses Google Analytics for statistics and Google Adwords for 
advertisements. You are tracked and Google knows everything about you. 
Use an adblocker like ublock-origin if you don't want it.

All the code on this website is licensed under the GNU GPL v3 license 
unless already licensed under a license which does not allows this form 
of licensing or if another license is stated on that page / in that software:

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Just to be clear, the information on this website is for meant for educational 
purposes and you use it at your own risk. I do not take responsibility if you 
screw something up. Use common sense, do not 'rm -rf /' as root for example. 
If you have any questions then do not hesitate to contact me.

See https://raymii.org/s/static/About.html for details.