Setting up HTTPS on Apache with a basic configuration is now both trivial and cheap. Optimizing it for a (slightly) better security level requires a bit more digging though. And a small trade-off: you’ll have to sacrifice fossil browsers, like MSIE pre-11, and generally most old versions of just any browser. Spoiler: noone really uses those anyway.
First, here is my old configuration. It still gets an A on SSL Labs as I’m writing this, but it’s starting to have issues.
<VirtualHost *:443> ServerName gal.patheticcockroach.com DocumentRoot "/home/gal/" <Directory "/home/gal/"> allow from all Options -Indexes </Directory> SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder On SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:!CAMELLIA:!RC4:!MD5:!aNULL:!EDH SSLCertificateFile /etc/letsencrypt/live/gal.patheticcockroach.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/gal.patheticcockroach.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/gal.patheticcockroach.com/fullchain.pem SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown </VirtualHost>
Now, here is my new one:
<VirtualHost *:443> ServerName gal.patheticcockroach.com DocumentRoot "/home/gal/" <Directory "/home/gal/"> Require all granted Options -Indexes AllowOverride All </Directory> Header always set Strict-Transport-Security "max-age=31536000" SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On SSLCompression Off SSLSessionTickets Off SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256 SSLCertificateFile /etc/letsencrypt/live/gal.patheticcockroach.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/gal.patheticcockroach.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/gal.patheticcockroach.com/fullchain.pem </VirtualHost>
Note that this is using Apache version 2.4.29, while the old one was using something-older-not-sure-which-one. So, “allow from all” became “Require all granted”, and some new algorithms became available. But TLS 1.3 isn’t here yet.
First, I ditched SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
. Doesn’t really impact security, but is just useless now since the cipher suites we’ll pick aren’t supported by the MSIE versions that required this tweak.
Then, I disabled all SSL protocols but TLS 1.2. A more elegant way would be SSLProtocol -all +TLSv1.2
, but I just wanted to keep the list for the moment. I’m actually not even sure if Apache still supports SSL v2, or even v3.
I handpicked some of the most modern cipher suites from here and there, disabled compression and session tickets (because reasons), and I added a Strict-Transport-Security
header. About this last one, I believe a value of “max-age=31536000; includeSubDomains; preload” might be even better, 1) for preloading and 2) I’m not sure about includeSubDomains but I’ve seen it used in a bunch of guides.
And that’s basically it, already. With this I’m getting an A+ on SSL Labs and in other places. Most of which insist heavily on setting a very long HSTS (watch out, once you set it you have to keep maintaining the HTTPS version of your site, or people who already visited it won’t be able to access it anymore for a long while).
Last but not least, here’s a little list of services that you can use to test your HTTPS setup:
– SSL Labs
– HT Bridge
– Cryptcheck
And here’s an even longer list, but sites other than those I already listed seem vastly inferior to me, with the exception of a few services that focus essentially on the “administrative” details of your certificate. Notably, this one will let you download the certificates that are missing from your chain, if any (it shouldn’t be useful, but it’s a fun feature still)
0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.