Sonntag, 11. August 2013

Bereitstellung von Webserverdiensten (http, https) auf einer virtuellen Maschine mit nginx als Reverse Proxy (Teil 2)

Im 1.Teil hatten wir uns bereits mit der Einrichtung von nginx als http Reverse Proxy beschäftigt. In diesem Teil wollen wir nginx als SSL http Reverse Proxy einrichten. Als Zertifikat verwenden wir ein sogenanntes "self-signed certificate" für die Domain "ssl.mindfab.net".

Zertifikat erstellen

Zuerst erstellen wir das Verzeichnis wo unser Zertifikat für die Domain mail.mindfab.net liegen soll.
root@xx: cd /etc/nginx
root@xx: mkdir -p ssl/ssl.mindfab.net

root@xx: cd ssl/ssl.mindfab.net
Nun erstellen wir uns als erstes einen private Key.
root@xx:/etc/nginx/ssl/ssl.mindfab.net# openssl genrsa -des3 -out ssl.mindfab.net.key 2048
Generating RSA private key, 2048 bit long modulus
.................................+++
..........+++
e is 65537 (0x10001)
Enter pass phrase for ssl.mindfab.net.key:
Verifying - Enter pass phrase for ssl.mindfab.net.key:

Als nächstes erzeugen wir ein CSR (Certificate Signing Request). Hierbei ist es wichtig das der später zu verwendende Domain Name (https://ssl.mindfab.net) unter Common Name eingetragen wird.
root@xx# openssl req -new -key ssl.mindfab.net.key -out ssl.mindfab.net.csr

Enter pass phrase for ssl.mindfab.net.key:
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) [AU]:DE
State or Province Name (full name) [Some-State]:Saxony
Locality Name (eg, city) []:Dresden
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MINDFAB.NET
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:ssl.mindfab.net
Email Address []:admin@mindfab.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Als nächstes soll das Passwort von dem Private Key entfernt werden damit nginx ohne Passwort Eingabe automatisiert starten kann.
root@xx# cp ssl.mindfab.net.key ssl.mindfab.net.key.bak
root@xx# openssl rsa -in ssl.mindfab.net.key.bak -out ssl.mindfab.net.key

Enter pass phrase for ssl.mindfab.net.key.bak:
writing RSA key
Nun sollten wir folgende Dateien in unserem Verzeichnis haben.

root@xx# ls -l
-rw-r--r-- 1 root root 1062 Aug 10 17:05 ssl.mindfab.net.csr
-rw-r--r-- 1 root root 1679 Aug 10 17:11 ssl.mindfab.net.key
-rw-r--r-- 1 root root 1751 Aug 10 17:10 ssl.mindfab.net.key.bak
Schliesslich müssen wir das Zertifikat noch selbst signieren...
openssl x509 -req -days 365 -in ssl.mindfab.net.csr -signkey ssl.mindfab.net.key -out ssl.mindfab.net.crt
Signature ok
subject=/C=DE/ST=Saxony/L=Dresden/O=MINDFAB.NET/OU=IT/CN=ssl.mindfab.net/emailAddress=admin@mindfab.net
Getting Private key
Jetzt müssen wir noch nginx so konfigurieren das er unser Zertifikat verwendet. Wir passen daher unsere nginx Konfiguration entsprechend an.
vim /etc/nginx/conf.d/default.conf

## 192.168.100.12 -> ssl.mindfab.net ##
upstream sslmindfabnet  {
      server 192.168.100.12:80;
}

## Start https://ssl.mindfab.net ##
server {
    listen       443;
    ssl on;
    server_name  ssl.mindfab.net;

    # SSL cert files #
    ssl_certificate    /etc/nginx/ssl/ssl.mindfab.net/ssl.mindfab.net.crt;
    ssl_certificate_key    /etc/nginx/ssl/ssl.mindfab.net/ssl.mindfab.net.key;

    ssl_protocols    SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers        RC4:HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers    on;
    keepalive_timeout    60;
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout    10m;   

    access_log  /var/log/nginx/ssl-ssl.mindfab.net.access.log;
    error_log  /var/log/nginx/ssl-ssl.mindfab.net.error.log;

    ## send request back to ssl.mindfab.net ##
    location / {
     proxy_pass  http://sslmindfabnet;    
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header         Accept-Encoding    "";   
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header         X-Forwarded-Proto $scheme;
     add_header             Front-End-Https on;   
   }
}
## End ssl.mindfab.net ##
Nun starten wir den nginx Daemon neu und testen unsere Konfiguration.

service nginx reload

openssl s_client -connect ssl.mindfab.net:443

Referenzen

  • http://www.cyberciti.biz/faq/howto-linux-unix-setup-nginx-ssl-proxy/

Keine Kommentare:

Kommentar veröffentlichen