Gemischtes Encoding einer Datei reparieren

Gestern habe ich eine Stunde lang verzweifelt versucht eine SQL Datei in die Datenbank einzufahren, die verschiedene Zeichensätze in der Datei hatte.

Mit file lässt sich die Kodierung einer Datei überprüfen, allerdings liefert sie in meinem Fall nur:

hdl.sql: Non-ISO extended-ASCII English text, with very long lines

Non-ISO ist nicht das, was man lesen möchte, wenn man Datenbanken importiert. Zum Glück habe ich hier ein schönes Shell-Skript gefunden, was die Datei 1a nach UTF-8 kodiert. Dazu wird eine Mischung aus recode und sed verwendet.

Im Anschluss liefert file nun den korrekten Wert:

hdl-utf8.sql: UTF-8 Unicode English text, with very long lines

Vielen Dank dafür.

Selbstsigniertes SSL Zertifikat für Tomcat und APR erstellen

Im letzten Blog-Eintrag zeigte ich, wie man die Tomcat-Native-Libraries mit APR installieren kann. Soll dazu SSL verwendet werden, benötigt der APR-Connector dazu ein PEM-kodiertes SSL-Zertifkat.

Ein selbstsigniertes Zertifikat lässt sich relativ leicht selbst erstellen.

Zunächst wird ein privater Schlüssel erzeugt:
openssl req -new -out tomcat.csr -keyout tomcat.pem
Generating a 1024 bit RSA private key
.......................................++++++
.++++++
writing new private key to 'tomcat.pem'
Enter PEM pass phrase:
Verifying - Enter PEM 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) [AU]:DE
State or Province Name (full name) [Some-State]:Hamburg
Locality Name (eg, city) []:Hamburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Timo Meinen
Organizational Unit Name (eg, section) []:localhost
Common Name (eg, YOUR name) []:localhost
Email Address []:timomeinen@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Anschließend liegen zwei Dateien im Verzeichnis: Der private Schlüssel tomcat.pem und der Certifikation-Request tomcat.csr.

Mit dem folgenden Befehl kann man ein unverschlüsseltes Zertifikat erzeugen:
openssl rsa -in tomcat.pem -out tomcat.key
Enter pass phrase for tomcat.pem:
writing RSA key

Der letzte Schritt ist die Selbstsignierung des Zertifikates. Dieses kann dann gemeinsam mit dem privaten Schlüssel in Tomcat konfiguriert werden:
openssl x509 -in tomcat.csr -out tomcat.crt -req -signkey tomcat.key
Signature ok
subject=/C=DE/ST=Hamburg/L=Hamburg/O=Timo Meinen/OU=localhost/CN=localhost/emailAddress=timomeinen@gmail.com
Getting Private key

Die .csr und die .pem Datei kopiert man nun an einen geeigneten Platz z.B.
cp tomcat.* /Applications/apache-tomcat-6.0.26/conf/

Die Konfiguration in Tomcats server.xml ist schnell gemacht:

<connector port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
SSLCertificateFile="/Applications/apache-tomcat-6.0.26/conf/tomcat.crt"
SSLCertificateKeyFile="/Applications/apache-tomcat-6.0.26/conf/tomcat.pem"
SSLPassword="changeit"
clientAuth="optional" SSLProtocol="TLSv1"/>

Der Unterschied zur Konfiguration mit einem Keystore sind die drei Anweisungen SSLCertificateFile, SSLCertificateKeyFile und SSLPassword. Sie werden hier erklärt.

Nun kann Tomcat von APR und OpenSSL profitieren.

Eine schöne Übersicht über das Thema SSL-Zertifakte erstellen gibt es u.a. in Jian Fang's Wiki.

Apache Tomcat Native Libraries unter Mac OS X installieren

Vor knapp zwei Wochen wurde die neue Tomcat Version 6.0.26 veröffentlicht. Zeitgleich wurden die Tomcat-Native-Libraries auf die Version 1.1.20 aktualisiert. Tomcat-Native verbindet die Apache Portable Runtime mit dem Web-Container. Dies bringt höhere Stabilität, höhere Performanz und die Möglichkeit OpenSSL im Tomcat bentuzen zu können.

Hier ist eine Anleitung, um die Native-Libraries unter Mac OS X zu installieren:

Zunächst muss APR installiert werden, was am leichtesten über MacPorts:
sudo port install apr

Auch die tomcat-native gibt es als Port, allerdings nur in der alten Version 1.1.14, die mit der aktuellen Tomcat Version nicht mehr kompatibel ist. Daher gibt es nun zwei Möglichkeiten:

  1. Einen Port-Patch einspielen: Tomcat-Native-1.1.20 Patch
  2. Die Libraries selbst kompilieren

Da das selber kompilieren unter Mac OS X nicht schwierig ist, zeige ich diesen Weg:

Paket herunterladen und entpacken:
http://tomcat.apache.org/download-native.cgi
tar xf tomcat-native-1.1.20-src.tar.gz
cd tomcat-native-1.1.20-src/jni/native/

Mit configure alles konfigurieren:
./configure --with-apr=/usr/local/apr --with-java-home=$JAVA_HOME --with-ssl=/usr
Wer kein SSL benötigt kann einfach --without-ssl angeben.

Kompilieren und installieren:
make
sudo cp .libs/libtcnative* /usr/lib/java/

Wenn man nun den Tomcat startet, kann man in den Log-Meldungen prüfen, ob die Native-Library geladen wird:
/Applications/apache-tomcat-6.0.26/bin/catalina.sh run
19.03.2010 09:20:21 org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.20.
19.03.2010 09:20:21 org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].

Sollte es zu einer Fehlermeldung kommen, dass der Poller nicht erstellt werden konnte, muss die pollerSize im Connector angepasst werden:
19.03.2010 09:20:41 org.apache.tomcat.util.net.AprEndpoint allocatePoller
INFO: Failed to create poller with specified size of 8192

<connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
pollerSize="1024" >>

Wird kein SSL benutzt ist man nun fertig. Ansonsten ist die SSL Konfiguration in den Connector-Eintragen in der server.xml bei APR-Nutzung anders:

APR Connector configuration
Tomcat SSL howto

Möchte man auf den APR-SSL support verzichten, kann auch einfach das protocol überschrieben werden:

< -- Define a blocking Java
SSL Coyote HTTP/1.1 Connector on port 8443 -->
protocol = "org.apache.coyote.http11.Http11Protocol"
port="8443"

< -- Define a non-blocking Java
SSL Coyote HTTP/1.1 Connector on port 8443 -->
protocol = "org.apache.coyote.http11.Http11NioProtocol"
port="8443"

Hier noch ein kleiner Grund, warum sich der Aufwand lohnt: Unsere aktuelle Web-Anwendung it.projektwerk.com startet ohne APR in ca. 25 Sekunden. Mit APR in 15 Sekunden.