====== Apache mit offiziellen SSL-Zertifikat betreiben ======
=====Offiziellen Key erzeugen/kaufen =====
==== Name und Dateien (wer spielt mit?): ====
  * Keyfile
    * domain.key
    * private Datei mit Schlüssel
  * Certification Signing Request
    * verisign.csr
    * für upload zum Zertifizieren
  * Zertifikat
    * domain.crt
    * bekommt man vom Zertifizierer zurückgeschickt
  * Intermediate 
    * "bundle"
==== Erstellen: ====
Siehe auch: http://support.psw.net/questions/26/Wie-wird-eine-Zertifizierungsanforderung-%28CSR%29-erstellt-%28Apache%29%3F
  * cd /etc/apache2/ssl
  * openssl req -new -nodes -keyout dateiname.key -out dateiname.csr -newkey rsa:2048 
Generating RSA private key, 2048 bit long modulus
....++++++
...............................++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
  * 
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Fuerth
Organization Name (eg, company) [My Company Ltd]:Domain GmbH
Organizational Unit Name (eg, section) []:  
Common Name (eg, your name or your server's hostname) []:domain.de
Email Address []:webmaster@domain.de
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
    * :!: keine Passphrase vergeben
    * der "Common Name" ist der Domain.name, z.B. ''domain.de'' (das ist ungleich ''www.domain.de'' :!:)
    * Die E-Mail-Adresse muss es geben
==== Passwort aus Key-Datei löschen ====
  * openssl rsa -in server.key.pass -out server.key
==== selbst signiertes Zertifikat erstellen ====
  * openssl req -new -x509 -nodes -out server.crt -keyout server.key
Siehe: http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#selfcert
===== Apache-Konfig =====
NameVirtualHost domain.de:443
        DocumentRoot /home/domain/www
        ServerName domain.de:443
        ServerAlias www.domain.de
        ######################################################################
        ServerAdmin webmaster@domain.de
        ErrorLog /var/log/httpd/domain-error_log
        CustomLog /var/log/httpd/domain-access_log common
        
          # beachte .htaccess :
          AllowOverride All
        
        # zusaetzlich fuer SSL:
        SSLEngine on
        SSLProtocol all -SSLv2
        SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
        SSLCertificateKeyFile /etc/pki/tls/domain/domain.key
        SSLCertificateFile /etc/pki/tls/domain/domain.crt
        
            SSLOptions +StdEnvVars
        
        
            SSLOptions +StdEnvVars
        
        SetEnvIf User-Agent ".*MSIE.*" \
                 nokeepalive ssl-unclean-shutdown \
                 downgrade-1.0 force-response-1.0
Debian:
  * cd /etc/apache2/mods-enabled
  * ln -s ../mods-available/ssl.conf 
  * ln -s ../mods-available/ssl.load 
===== CSR-Datei prüfen =====
  * openssl req -in server.csr -noout -text -verify
===== Wie prüfen, ob Key- und Zertifikatsdatei zusammenpassen? =====
  * openssl rsa -noout -text -in domain.key
  * openssl x509 -noout -text -in domain.crt
  * "modulus" und "Exponent" müssen exakt übereinstimmen
===== Prüfe ein Zertifikat / einen Server mit/ohne CAFile =====
  * openssl s_client -quiet -connect servername:443
    * liefert Fehler weil nur mit Zertifikat (CAFile) gültig
    * Lösung: openssl s_client -quiet -CAfile cafile.pem -connect servername:443
  * lokal vorhandes Zertifikat prüfen:
    * openssl verify -verbose -CAfile cafile.pem cert.pem
===== Welche Ciphers kann ein Server? =====
Von https://github.com/wki/MyHomeBinaries/blob/master/bin/check_ssl.sh:
#!/bin/bash
# This script is taken from:
# http://superuser.com/questions/109213/is-there-a-tool-that-can-test-what-ssl-tls-cipher-suites-a-particular-website-of
#
if [[ "x$1" == "x" ]]; then
  echo "must give ip or host name as parameter"
  exit 1
fi
server=$1
echo "Testing Server $server..."
# OpenSSL requires the port number.
DELAY=1
openssl ciphers -v 'ALL:eNULL' | while read cipher ssl kx au enc mac export
do
      echo -n -e "Testing $cipher, $ssl, $enc... \t"
      result=`echo -n | openssl s_client -cipher "$cipher" -connect $server:443 2>&1`
      if [[ "$result" =~ "Cipher is " ]] ; then
        echo YES
      else
        if [[ "$result" =~ ":error:" ]] ; then
          error=`echo -n $result | cut -d':' -f6`
          echo NO \($error\)
        else
          echo UNKNOWN RESPONSE
          echo $result
        fi
      fi
      sleep $DELAY
done
===== SSL certificate chain resolver =====
  * lädt intermediate certs automatisch
  * https://github.com/zakjan/cert-chain-resolver
===== Links =====
  * http://kb.psw.net/
  * http://www.enterprisessl.com/ssl-certificate-support/server_faq/ssl-server-certificate-apache.html
  * https://search.thawte.com/support/ssl-digital-certificates/index?page=content&id=SO7302&actp=search&viewlocale=en_US&searchid=1254230700908
  * http://www.verisign.de/support/ssl-certificates-support/page_de_de_dev019431.html
  * https://www.ssllabs.com/ssltest/analyze.html
    * Prüfe Server/Config/Zertifikat