Einfügen / aktualisieren von SSL-Zertifikaten unter ispCP

SSL-Zertifikate unter ispCP einzurichten oder zu Verlängern ist etwas aufwändiger als im Apache aus der Dose.

Grundlagen

Das Vorgehen sieht im Detail wie folgt aus:
Auf dem fraglichen Server prüft man zuerst, ob die notwendigen Voraussetzungen erfüllt sind. Am einfachsten fällt dies, indem man sich über

crontab -l

die aktuellen Cronjobs anzeigen lässt. Hier muss folgende Zeile vorhanden sein:

 M  H  D   Mo   DoW    test -x /var/www/ispcp-bin/upd-ssl.pl && /var/www/ispcp-bin/upd-ssl.pl > /etc/apache2/sites-enabled/ispcp-ssl.conf 2>/dev/null

Hier erkennt man auch schon, welches Script relevant ist, in diesem Fall

/var/www/ispcp-bin/upd-ssl.pl

Sieht man sich dieses Script genauer an, wird man im Konfigurationsbereich u. a. die folgenden beiden Zeilen vorfinden:

my $sslenabledconfig='{Pfad zur}ssl.list';
my $sslcertfificatepath = "{Pfad}/ssl";

Zertifikate erstellen (die .pem-Dateien)

In den .pem-Dateien werden Schlüssel und Zertifikat gemeinsam gehalten. Sie sollten am Ende immer folgendermaßen aussehen:

-----BEGIN RSA PRIVATE KEY-----
MIIEp/IB//bC/QE/0f00rZqqrzbJZ0BtXCMzY3yVrQ4rHVLJVHBsX0IEbjq4RYnB
[...]
5j6je638LnVrVryj1iz3JmCN+ChyCpileIh4oe7FeP/m7CfY3bOmX/==
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFoTCCBImg/XIB/gIR/P+iVOuoGOHV6V5tX1YXFr4XVQYJboZIhvcN/QEFBQ/X
[...]
Y8eGOYE=
-----ENV CERTIFICATE-----

Wie man unschwer erkennen kann bestehen diese Dateien also aus einer Konkatenation von Schlüssel und Zertifikat als flache Textdatei. Nachdem man sichergestellt hat, dass die Datei mit einer Leerzeile endet, war es das an diesem Punkt auch schon. Die Datei wird unter dem Namen „sub.domainmitssl.org.pem“ im Verzeichnis, das in „$sslcertfificatepath“ definiert ist, abgespeichert.
Dieser Vorgang ist selbstverständlich für alle einzufügenden oder zu aktualisierenden Zertifikate entsprechend zu wiederholen.

Intermediate-Zertifikate

Für die meisten Zertifikate ist ein Intermediate-Zertifikat erforderlich um die Vertrauenskette zu einem Rootzertifikat lückenlos sicherstellen zu können. Diese werden analog zu den Zertifikatsdateien selbst als „sub.domainmitssl.org.pem.CA“ benannt und ebenfalls im Verzeichnis „$sslcertfificatepath“ abgelegt.

Zertifikate hinzufügen

„$sslenabledconfig“ zeigt auf die Liste von SSL-Zertifikaten, die berücksichtigt werden sollen. Der Inhalt dieser Datei folgt stets dem Schema

sub.domainmitssl.org sub.domainmitssl.org.pem

Im Detail bedeutet das, für die Domain „sub.domainmitssl.org“ ist die „Zertifikatdatei“ „sub.domainmitssl.org.pem“ zu benutzen.
Hier fügt man nun die Domain(s) mit den zugehörigen .pem-Dateien ein.

Hat man alle Domains in die Liste eingetragen und sichergestellt, dass die notwendigen Zertifikatdateien existieren, kann man entweder warten, bis der Cron, den wir am Anfang betrachtet haben, wieder läuft oder man startet das Script

/var/www/ispcp-bin/upd-ssl.pl

einfach manuell. Das Script erzeugt dann automatisch alle notwendigen Konfigurationen.

#!/usr/bin/perl 
#
use strict;

#####CONFIG
#
my $ispcpconfig='/etc/apache2/sites-enabled/ispcp.conf';
my $sslenabledconfig='/etc/ispcp/apache/ssl.list';
my $sslcertfificatepath = "/etc/apache2/ssl";

##


# ssl sites list
open (SSL,"<$sslenabledconfig");
my @tmpssl=grep /\w+/, <SSL>;
my %sslsites;
foreach(@tmpssl)
    {
    @_=split(/\s+/,$_);
    $sslsites{$_[0]}=$_[1];
    }

open(APACHE,"<$ispcpconfig");

my %virtualhosts;
while(<APACHE>)
    {
    my @tmpvirthost;
    chomp($_);
    if ($_ =~ /^\s*<VirtualHost/i)
        {
        push @tmpvirthost,$_;
        while(<APACHE>)
            {
            chomp($_);
            push @tmpvirthost,$_;
            last if ($_ =~ /^\s*<\/VirtualHost/i);
            }

        my @servname=map { $_ =~ /^\s+Servername\s+([\w.-]+)/i; $1 } grep(/ServerName/i, @tmpvirthost);
        my $serv=$servname[0];

#        print Dumper(@tmpvirthost);
    $virtualhosts{$serv}=\@tmpvirthost;
        }
            
        
        
    }

foreach my $onessl (keys %sslsites)
    {
    if (!defined($virtualhosts{$onessl}))
        {
        print "$onessl config is missing\n";
        next;
        }


    @{$virtualhosts{$onessl}}[0] =~ s/(<VirtualHost\s.+):80(.+)/$1:443$2/i;
    splice @{$virtualhosts{$onessl}},2,0,"SSLEngine ON";
    splice @{$virtualhosts{$onessl}},3,0,"SSLCertificateFile $sslcertfificatepath/$sslsites{$onessl}";
    if ( -f "$sslcertfificatepath/$sslsites{$onessl}.CA" )
        {
        splice @{$virtualhosts{$onessl}},3,0,"SSLCACertificateFile  $sslcertfificatepath/$sslsites{$onessl}.CA";
        }

    # print out the config, but only if the certificate file exists
    if ( -f "$sslcertfificatepath/$sslsites{$onessl}" )
        {
        print join("\n",@{$virtualhosts{$onessl}})."\n";
        }
    }

Fertig

Zum Abschluss startet man den Apache einmal neu, sodass die neuen Einstellungen greifen.

ispCP Host Konfiguration aus der Datenbank neu aufbauen

Gravierende Aenderungen oder (reparierte) Dateisystemfehler koennen es noetig machen, die Konfigurationen eines Hosts neu aufzubauen.

Bei Hosts die via ispCP verwaltet werden, ist das mit Hilfe der Datenbank sehr einfach.
Generell bietet es sich an, die Datenbank selbst noch vorher auf Fehler zu pruefen (und diese evtl. auch zu reparieren.

mysqlcheck -u root -p --all-databases --auto-repair

Danach muss der ispCP Dienst gestoppt werden, damit Aenderungen die moeglicherweise gerade von Benutzern vorgenommen werden, nicht dazwischen funken.

/etc/init.d/ispcp_daemon stop

In der Datenbank muessen alle Eintraege auf „zu erledigen“ gesetzt werden.

mysql -u root -p

USE ispcp;
UPDATE mail_users SET status="toadd" where status="ok";
UPDATE domain SET domain_status = 'change' WHERE domain_status = 'ok';
UPDATE domain_aliasses SET alias_status = 'change' WHERE alias_status = 'ok';
UPDATE subdomain SET subdomain_status = 'change' WHERE subdomain_status = 'ok';
QUIT;

Den Neuaufbau der Konfigurationen (und auch den Neustart / Reload von Diensten) durchfuehren (Das kann eine Weile dauern…)

/var/www/ispcp/engine/ispcp-rqst-mngr

Abschliessend, den ispCP Dienst wieder starten.

/etc/init.d/ispcp_daemon start

Notiz: Zu aktivierende Apache Module auf ispcp Servern

a2enmod headers
a2enmod include
a2enmod deflate
a2enmod expires
a2enmod rewrite
a2enmod setenvif
a2enmod actions
a2enmod alias

Bei fcgid (was Standard ist) ganz wichtig:
a2dismod php5

„Passwort ändern“ in Webmail integrieren (Sqirrel-Mail)

Hiermit kann man seinen Mail-Benutzern im Webmail-Client (Squirrel) eine „Passwort ändern“ Funktion zur Verfügung stellen.

  1. Folgende Änderung an den MySQL-Rechten (root-login notwendig) vornehmen.
    (###PASSWORD### bitte durch ein sicheres Passwort ersetzen!)

    GRANT USAGE ON ispcp.*
    TO 'ispcp-mail-user'@'localhost' IDENTIFIED BY '###PASSWORD###'
    WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;
    
    GRANT SELECT (`domain_id`, `domain_name`
    ) ON `ispcp`.`domain` TO 'ispcp-mail-user'@'localhost';
    
    GRANT SELECT (`domain_id`, `alias_id`, `alias_name`
    ) ON `ispcp`.`domain_aliasses` TO 'ispcp-mail-user'@'localhost';
    
    GRANT SELECT (`domain_id`, `subdomain_id`, `subdomain_name`
    ) ON `ispcp`.`subdomain` TO 'ispcp-mail-user'@'localhost';
    
    GRANT SELECT ( `mail_id`, `mail_acc`, `domain_id`, `sub_id`, `mail_type`, `status`, `mail_pass`),
    UPDATE (`mail_pass` , `status`) ON `ispcp`.`mail_users` TO 'ispcp-mail-user'@'localhost';
  2. In das Verzeichnis „/var/www/ispcp/gui/tools/webmail/plugins/“ wecheln und dieses Archiv herunterladen und entpacken!
    cd /var/www/ispcp/gui/tools/webmail/plugins/
    wget http://wissen.netzhaut.de/wp-content/uploads/2010/10/my_change_sqlpass-3.3-1.2-ISPCP.tar.gz
    tar xfvz my_change_sqlpass-3.3-1.2-ISPCP.tar.gz
  3. In der Datei change_password/config.php in Zeile 38 ###PASSWORD### durch das oben gesetzte Passwort ersetzen.
    $csp_dsn = 'mysql://ispcp-mail-user:###PASSWORD###@localhost/ispcp';
  4. In der Datei „/var/www/ispcp/gui/tools/webmail/config/config.php“ bitte folgenden Zeile einfügen.
    (den Array-Key (Zahl in den eckigen Klammern) evtl. anpassen.) 

    $plugins[33] = 'change_sqlpass';

Nun sollte im Webmail unter „Optionen“ ein Punkt „Passwort ändern.“ erscheinen.

Hinweis:
Benötigt die PHP:Pear DB-Klasse.

.