added SNI trick to catch old browsers (nginx)
authorAdi Kriegisch <adi@kriegisch.at>
Mon, 3 Feb 2014 21:30:20 +0000 (22:30 +0100)
committerAdi Kriegisch <adi@kriegisch.at>
Mon, 3 Feb 2014 21:30:20 +0000 (22:30 +0100)
src/practical_settings/webserver.tex

index 5512e06..d0bc680 100644 (file)
@@ -175,6 +175,34 @@ You might want to redirect everything to \emph{https://} if possible. In Nginx y
 return 301 https://$host$request_uri;
 \end{lstlisting}
 
+In case you want to catch those old clients that do not support the recommended
+cipher string (eg. WinXP or Java 6) you might use their inability to understand
+SNI to create a catchall page with a default SSL server:
+
+\begin{lstlisting}
+server {
+    listen 443 default;
+    listen [::]:443 default ipv6only=on;
+    root /var/www/bad-ssl;
+    index index.html
+    ssl on;
+    ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
+    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
+
+    ssl_session_timeout 5m;
+
+    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
+    ssl_ciphers ALL:!ADH:!NULL:!EXPORT:+HIGH:+MEDIUM:+LOW:+SSLv3;
+}
+\end{lstlisting}
+
+The real service then needs to be in its own server definition omitting the
+\texttt{default} keyword in the \texttt{listen} directive. On the default page
+you should provide information about upgrading the browser to the user. You
+should not use snakeoil certificates (as in the snipplet above) but the very
+same certificate as you use for the real service. In case you provide several
+virtual servers via SNI, the certificate for the catchall page needs to include
+all their names.
 
 \subsubsection{References} 
 \begin{itemize*}