Simon Szustkowski

Ein Blog über alles, was mir gerade so durch den Kopf geht

Mar 17, 2015 - IT

OpenCA PKI auf CentOS installieren

UPDATE: Da OpenCA mittlerweile hoffnungslos veraltet und unmaintained ist, gibt es mit easyRSA 3 eine Alternative.

Zur Vorbereitung der Abschaltung eines unserer uralten Server, und zur Migration der dort laufenden Dienste, fiel es in meinen Aufgabenbereich, die vorhandene Installation von OpenCA PKI auf einer neuen Maschine zu migrieren, sprich: Neu installieren, und sämtliche Keys und schon generierte Zertifikate dort zu importieren.

Das Problem was sich dabei allerdings auftat: Ich war mir die gesamte Zeit nicht sicher, ob die Software überhaupt noch maintained wird. Deren eigene Webseite ist seit mehreren Wochen wegen einer kaputten SSL-Konfiguration (how ironic) nicht erreichbar. Ergooglete Deeplinks auf ein Wiki führten zu einem prächtigen HTTP Error 500. Trotzdem: Auf der Sourceforge-Mailingliste war noch eine gewisse Aktivität zu beobachten, und als ich die Software endlich zum Laufen gebracht habe, stand dort auch irgendwas von Copyright 2015.

Alternativen gibt es momentan kaum. Offenbar gab es mal einen Fork, der sich OpenXPKI genannt hat, dessen Aktivitäts-Maintaining-Dokumentations-Level war allerdings ebenfalls jenseits von gut und böse. Momentan entwickelt die Let’s Encrypt-Initiative eine eigene CA namens Boulder, die aber noch nicht bereit für den Produktiveinsatz ist. Also musste ich in den sauren Apfel beißen, und ich tat es. Meine Follower auf Twitter haben mitbekommen, wie sehr ich geflucht habe. ;)

Der folgende Ansatz wird vermutlich einigen Sicherheitsexperten die Haare zu Kopf stehen lassen, weil ich sowohl das öffentlich erreichbare RA-Interface als auch den CA-Signing-Mechanismus samt Root-Key auf der gleichen Maschine installiere, die auch noch an ein Netzwerk angeschlossen ist. Es sei allerdings erwähnt, dass dieses Netzwerk alles andere als das Internet ist, und dass die aufgebaute CA nur für den internen Gebrauch ist. Trotzdem: Remember, kids, don’t try this at home.

Also, zur Installation. Die von OpenCA angebotenen Pakete für CentOS kann man schon mal schön links liegen lassen. Zum einen ist das Repository ebenfalls nur sehr sporadisch zu erreichen, zum anderen sind die Pakete gegenüber der sowieso schon sehr outdated wirkenden Codebase noch mehr outdated. Eine Installation from source ist deswegen besser geeignet. Ich gehe für das folgende Setup mal davon aus, dass bereits eine installierte CentOS-Instanz vorliegt, die Mails verschicken kann, und mit einem Apache-Webserver versehen ist. Ferner sollten im Apachen und im System alle Hostnamen, insbesondere auch der FQDN des Hosts eingetragen sein.

Abhängigkeiten

Als ersten Schritt installieren wir alle Abhängigkeiten, die von OpenCA benötigt werden.

yum install gpg ftp links make unzip openssl-devel expat-devel mod_ssl mysql-server perl-CPAN

sowie einige Perl-Module. Hierbei muss man für sich selbst entscheiden, ob man die eventuell aktuellere Version über das CPAN installieren möchte, oder die RPM-Versionen, die dann automatisch von yum aktuell gehalten werden. Eine Installation via CPAN sähe folgendermaßen aus:

perl -MCPAN -e shell              
install CGI::Session
install Convert::ASN1
install Digest::MD5
install Digest::SHA1
install Digest::SHA256
install Encode::Unicode
install IO::Socket::SSL
install IO::Stringy
install MIME::Base64
install MIME::Lite
install MIME::Tools
install MailTool
install Net::Server
install URI
install XML::Twig
install XML::SAX::Base
install Digest::HMAC
install Authen::SASL 
install Net::SSLeay
install GUIDO/libintl-perl-1.23.tar.gz
install M/MA/MARSCHAP/perl-ldap-0.64.tar.gz     
quit

Bei den letzten beiden Modulen empfiehlt es sich, zu prüfen, ob nicht eventuell schon neuere Versionen vorhanden sind. Dies geht mit i /libintl-perl/ und i /perl-ldap/.

User

OpenCA läuft als eigener User, daher ganz simpel: useradd openca

MySQL

Nun muss die MySQL-Datenbank initialisiert werden: mysql_install_db und mysql_secure_installation. Mit einem service mysqld start wird der SQL-Server gestartet. Als nächstes richten wir einen MySQL-Benutzer für OpenCA ein.

mysql -u root -p
create database openca;
GRANT create,drop,select,delete,insert,update ON openca.* TO 'openca'@'localhost' IDENTIFIED by 'password';
FLUSH privileges;
exit;

Als letzten Schritt sorgen wir nun dafür, dass der MySQL-Server bei Systemstart automatisch gestartet wird: chkconfig mysqld on.

OpenCA Tools

Die PKI-Software von OpenCA bringt selbst noch eine Abhängigkeit mit, nämlich die OpenCA Tools, die vorher eben noch installiert werden müssen.

wget ftp://www.cnrst.ma/pub/openca/openca-tools-1.3.0.tar.gz
tar xvzf openca-tools-1.3.0.tar.gz
cd openca-tools-1.3.0
./configure --prefix=/opt/openca --exec-prefix=/opt/openca --with-openca-prefix=/opt/openca --with-openca-user=openca --with-openca-group=openca
make
make install

Dies installiert die OpenCA-Tools unter /opt/openca

OpenCA

Nach der Installation der Tools muss nun OpenCA PKI als “eigentliche” OpenCA-Software installiert werden.

wget ftp://www.cnrst.ma/pub/openca/openca-base-1.5.0.tar.gz
tar xvzf openca-base-1.5.0.tar.gz
cd openca-base-1.5.0
./configure --prefix=/opt/openca --exec-prefix=/opt/openca --with-openca-prefix=/opt/openca --with-openca-user=openca --with-openca-group=openca --with-module-prefix=/opt/openca/modules --with-web-host=my.host.tld --with-httpd-user=apache --with-httpd-group=apache --with-openca-tools-prefix=/opt/openca
make

(Nicht vergessen, im Configure-Befehl den FQDN des Hosts anzupassen.)

Nun muss man sich entscheiden, ob man die Offline-Komponente (die CA) oder die Online-Komponente (die RA) installieren möchte. Nicht wundern: Beide Komponenten haben ein Webinterface, und benötigen daher den Apachen, es ist aber vorgesehen, dass man die Zertifikatsanfragen mittels eines Datenträgers über den Airgap zwischen RA und CA transportiert. Wie gesagt, für dieses spezielle Setup ist das unerheblich, von daher:

make install-offline
make install-online

Nun folgt ein Hotfix eines Bugs, der manchmal dafür sorgt, dass einige Helperscripte nicht mit installiert werden.

cd src/scripts
make install

Da auch dieser Hotfix verbuggt ist, empfiehlt es sich, nach dem Ausführen von make install zu prüfen, ob die Scripte wirklich nach /opt/openca/bin installiert wurden, und sie ggf. von Hand nachzukopieren, und die Rechte anzupassen.

Initscript

Damit der OpenCA-Daemon korrekt gestartet werden kann, und auch bei einem Systemneustart automatisch mitgestartet wird, muss ein Initscript erstellt werden. Glücklicherweise liefert OpenCA direkt eins mit (und noch viel glücklicherweise ist der systemd, der auf CentOS läuft abwärtskompatibel zu den alten init.d-Scripten), daher kann das Script einfach nach /etc gelinked werden:

ln -s /opt/openca/etc/init.d/openca /etc/init.d/openca

Konfiguration

Die Konfiguration von OpenCA erfolgt über die Datei /opt/openca/etc/openca/config.xml. Die Keys in dieser Datei sind relativ selbsterklärend, und sollten nach euren Bedürfnissen angepasst werden. Den Defaultwert für das Webfrontend-Passwort könnt ihr so lassen, der wird später interaktiv angepasst. Wichtig ist: Die korrekten Werte für die Verbindung der Datenbank eintragen. Wenn ihr alles richtig eingetragen habt, müsst ihr aus den Werten in der XML-Datei und den Templates noch die “richtigen” Konfigurationsdateien erstellen. (Insert rant about this stupid design decision here)

cd /opt/openca/etc/openca
./configure_etc.sh

Dies muss ebenfalls immer erneut vollzogen werden, wenn sich eine Option in der config.xml geändert haben sollte.

Abschließende Arbeiten

Als (fast) letzte Aktionen zur Installation des Cores müssen noch einige Berechtigungen angepasst werden:

chown -R apache:apache /opt/openca/var/openca/log/

sowie der Daemon gestartet werden. Hierbei solltet ihr gefragt werden, wie das Standardpasswort zum Login lauten soll.

service openca start

Apache-Configuration

Nun gilt es, den Apachen zu konfigurieren, dass er die CGI-Scripte von OpenCA anzeigen kann. Ich habe dazu einfach die Datei /etc/httpd/conf.d/openca.conf mit folgendem Inhalt erstellt:

Alias /pki/ /opt/openca/var/www/html/pki/
ScriptAlias /cgi-bin/pki "/opt/openca/var/www/cgi-bin/pki/"
ScriptAlias /cgi-bin/ "/opt/openca/var/www/cgi-bin/pki/"

<Directory "/opt/openca/var/www/html/pki/pub/">
   Options +Indexes FollowSymLinks
   DirectoryIndex index.html
   Order allow,deny
   Allow from all
</Directory>

<Directory "/opt/openca/var/www/html/pki/">
    Options +Indexes FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>

Diese Konfiguration ist mit Sicherheit noch optimierungswürdig, aber fürs Erste tut sie es.

Nun solltet ihr folgendes tun können:

  • Unter my.host.tld/pki/ das öffentliche Interface der CA aufrufen können
  • Unter my.host.tld/pki/ra/ das Interface der RA aufrufen können
  • Unter my.host.tld/pki/ca/ das Interface der CA aufrufen können.

Im Interface der CA müsst ihr nun den Menüpunkt PKI Init & Config -> Initialisierung -> DB, Key and Cert Init die Datenbank für die Nutzung initialisieren, sowie den Private Key für die CA generieren. Die Keys und sonstige generierte Zertifikate landen dann alle in /opt/openca/var/openca/crypto.

Ihr habt nun eine lauffähige CA vor euch. Zur Benutzung kann ich noch nicht viel sagen, ich bin bis jetzt selbst noch nicht über die Installation hinaus gekommen.