Techblog

Herzlich Willkommen im Communardo Techblog, dem Entwickler-Weblog von Communardo. An dieser Stelle werden Ideen, Problemlösungen, Tipps und Problemstellungen rund um die Entwicklung webbasierter Software vorgestellt.

techblog-teaser

About Jan Dittberner

Ich arbeite bei Communardo als Softwarearchitekt im Java-Enterprise-Umfeld. In meiner Freizeit beteilige ich mich an Free Software/Open Source Projekten und wirke als Debian Developer an Debian GNU/Linux mit.

Here are my most recent posts

Rückblick auf die PyCon DE 2011 – 1. Deutsche Python Konferenz

, von

Vom 4.10. – 9.10.2011 fand in Leipzig die erste Deutsche Python-Konferenz – PyCon DE – statt. Am 4.10. begann die Veranstaltung mit Tutorials und einem Barcamp. Im Konferenzteil vom 5.10. bis 7.10. wurde mit 3 Keynotes und 55 Vorträgen sowie Lightning-Talks an allen drei Tagen viele interessante Themen rund um die Programmiersprache Python und ihre Anwendung in unterschiedlichsten Bereichen vorgestellt. Am anschließenden Wochenende, also dem 8.10. und 9.10. gab es noch Gelegenheit für Entwicklungssprints.

Ich war vom 5.10. bis 7.10. in Leipzig und bin begeistert davon, was die Organisatoren auf die Beine gestellt haben. Neben dem sehr guten Veranstaltungsort, dem Leipziger Kubus des Helmholtz Zentrum für Umweltforschung und dem interessanten Themenmix wurde auch ein hervorragendes Rahmenprogramm organisiert. Die Vorträge wurden von einem internationalen Videoteam aufgenommen und stehen bereits zur Verfügung. Dafür auch hier nochmal vielen Dank!

Vorträge

Am 5.10. habe ich auf der Konferenz zwei Vorträge gehalten. Im ersten Vortrag habe ich das Debian-Projekt vorgestellt und bin anschließend auf die Paketierung von Software, insbesondere Python-Software, für Debian eingegangen. Die Präsentation habe ich bei Scribd zur Verfügung gestellt.

Videoaufzeichnung zum Vortrag:
Please enable Javascript and Flash to view this Blip.tv video.

In meinem zweiten Vortrag an diesem Tag ging es um Kryptografie mit Python und die Unterstützung von PKCS#11-Chipkarten mit PyKCS11. Dabei habe ich Signaturerzeugung und Überprüfung mit einer Feitian PKI-Card (freundlicherweise von Gooze.eu zur Verfügung gestellt) mit einem SCM-Smartcard-Leser, PyKCS11 und PyCrypto demonstriert. Die Präsentation steht bei Scribd und der Beispielcode bei Gitorious zur Verfügung.

Videoaufzeichnung vom Vortrag:
Please enable Javascript and Flash to view this Blip.tv video.

Am Freitag, dem 7.10.2011 habe ich dann noch die Chance genutzt in einem Lightning Talk das Open-Source-Projekt sqlalchemy-migrate vorzustellen, an dem ich als Maintainer mitarbeite. Die Präsentation gibt es ebenfalls bei Scribd.

Zusammenfassend kann ich die erste PyCon DE als sehr gelungene Veranstaltung bezeichnen und hoffe, dass sich diese deutschsprachige Python-Konferenz in den kommenden Jahren als regelmäßige Veranstaltung etablieren wird.

Rückblick zum Git-Vortrag bei der JUG Saxony

, von

Am vergangenen Donnerstag, dem 15.09.2011, habe ich im Rahmen der Java User Group Saxony den schon seit Längerem geplanten Vortrag zum verteilten Versionskontrollsystem Git gehalten.

Die Veranstaltung war mit mehr als 100 Zuhörern sehr gut besucht. Laut Zählung der Organisatoren war es sogar die bisher bestbesuchte JUG Saxony-Veranstaltung überhaupt.

Der Vortrag war sehr umfangreich, so dass ich die vollen drei Stunden der geplanten Zeit ausgenutzt und mich im Anschluss noch mit einigen interessierten Besuchern weiter zum Thema unterhalten habe. Da der Raum auch nach einer Pause noch gut gefüllt war, gehe ich davon aus mein Publikum nicht gelangweilt zu haben.

Den Vortrag begann ich mit einer Auswertung der früher in diesem Jahr durchgeführten Vorbefragung und ging nach einem Vergleich von zentraler und verteilter Versionskontrolle direkt zum eigentlichen Thema – dem verteilten Versionskontrollsystem Git – über.

Neben der Vorstellung einiger essentieller Git-Kommandos ging es vor allem um die Verbindung von Git mit gängigen Werkzeugen wie Eclipse, Atlassian JIRA, Jenkins CI und weiteren.

Im Laufe des Vortrages bin ich auf einige mögliche Repositorystrukturen und Workflows, die sich mit Git realisieren lassen, eingegangen und habe insbesondere Vincent Driessens “Successful Git Branching Model” mit Unterstützung von git-flow vorgestellt. Der Workflow-Teil war dem bisher erhaltenen Feedback zufolge der für die Zuhörer interessanteste Teil. Ansatzweise habe ich auch einen Workflow mit Gerrit-Code-Review angesprochen, bin dort aber aufgrund der fortgeschrittenen Zeit nicht mehr zu einer Demonstration gekommen.

Für alle die nicht dabei sein konnten, gibt es die Slides zum Vortrag bei Scribd sowie ein paar Fotos auf der Facebook-Seite der Java User Group Saxony.

Für mich war das der erste Vortrag vor so großem Publikum. Ich bin begeistert vom großen Interesse der Zuhörer und bedanke mich für das positive und konstruktive Feedback.

OCSP-Endpoint mit OpenSSL

, von

In einem aktuellen Projekt nutzen wir eine eigene kleine CA auf Basis von OpenSSL, um Zertifikate für Entwicklungs- und Testumgebungen auszustellen.

Zertifikate sollen jetzt per CRL und OCSP validiert werden. CRLs lassen sich mit dem Kommando
openssl ca -gencrl ...
generieren und dann an die Clients verteilen.

OCSP ist ein aktives Protokoll und benötigt dafür einen Server und einen passenden Client. In der Regel nutzen OCSP-Server das HTTP-Protokoll für den Transport der OCSP-Anfragen und -Antworten.

In einer Java-Anwendung kann man für den Client z.B. die dafür gedachten Klassen aus BouncyCastle verwenden.

Einen Server und Client auf Kommandozeilenebene bringt OpenSSL in Form des ocsp-Unterkommandos mit. Der Server nutzt die index.txt der OpenSSL CA und kann folgendermaßen gestartet werden:

openssl ocsp -index index.txt -CA ca.cert.pem -rsigner ca.cert.pem -rkey private/ca.key.pem -port 8080 -nmin 10

In diesem Fall wird für den OCSP-Responder und die CA das gleiche Zertifikat verwendet, bei einer echten CA würde man ein dediziertes Zertifikat/Schlüssel-Paar für den OCSP-Responder erzeugen. Der obige Aufruf startet einen OCSP/HTTP-Responder auf Port 8080 und schaut aller 10 Minuten in der index.txt, ob sich etwas am Widerrufsstatus der von der CA unterschriebenen Zertifikate geändert hat.

Testen kann man den Responder z.B. mit folgendem Aufruf:

openssl ocsp -issuer ca.cert.pem -cert cert_to_test.crt -url http://cahost:8080/ -resp_text

Umfrage zur Vorbereitung meines Git-Vortrages bei der Java User Group Saxony

, von

Ich möchte in diesem Jahr im Rahmen eines Java User Group Saxony Treffens einen Vortrag zum verteilten Versionskontrollsystem Git halten. Da das Thema recht vielschichtig und umfangreich ist, möchte ich gern im Vorfeld wissen, welche Vorkenntnisse bei Interessenten vorhanden sind und welche Themen besonders interessant wären.

Ich habe einen Fragebogen bereitgestellt und hoffe, dass er von möglichst vielen Interessenten beantwortet wird.

Den Vortrag werde ich voraussichtlich im 3. Quartal 2011 halten, den Fragebogen lasse ich bis zum 15.04.2011 zur Beantwortung offen.

Ich freue mich auf rege Teilnahme an Fragebogen und Vortrag.

S/MIME mit BouncyCastle 1.46

, von
3 Kommentare

Mit dem Ende Februar veröffentlichten BouncyCastle 1.46 wurden die APIs für die Ver- und Entschlüsselung von Nachrichten nach dem S/MIME-Standard teils stark verändert. Dies erhöht auf der einen Seite die Flexibilität, erfordert aber auf der anderen Seite eine Umstellung von bestehendem Code, wenn dieser nicht mehr die nun als “deprecated” gekennzeichneten APIs nutzen soll.

Ein Beispiel für die Verschlüsselung einer S/MIME-Nachricht sieht jetzt folgendermaßen aus:

<code>    public MimeMessage encryptMessage(MimeMessage message) throws Exception {
        SMIMEEnvelopedGenerator smeg = new SMIMEEnvelopedGenerator();
        for (Address recipient : message.getAllRecipients()) {
            Collection certificates = getCertificates((InternetAddress) recipient);
            for (Certificate cert : certificates) {
                RecipientInfoGenerator recipientInfoGen = new JceKeyTransRecipientInfoGenerator(
                        (X509Certificate) cert);
                smeg.addRecipientInfoGenerator(recipientInfoGen);
            }
        }
        OutputEncryptor encryptor = new JceCMSContentEncryptorBuilder(
                CMSAlgorithm.AES256_CBC).build();
        MimeBodyPart encryptedContent = smeg.generate(message, encryptor);
        MimeMessage result = new MimeMessage(message);
        result.setContent(encryptedContent.getContent(), encryptedContent
                .getContentType());
        result.saveChanges();
        return result;
    }</code>

Auf dem Rückweg, also für die Entschlüsselung, kann folgender Code verwendet werden:

<code>    public MimeMessage decryptMessage(MimeMessage encrypted)
            throws MessagingException, Exception {
        SMIMEEnveloped message = new SMIMEEnveloped(encrypted);

        RecipientInformationStore recinfos = message.getRecipientInfos();
        Enumeration aliases = this.keystore.aliases();
        RecipientInformation recid = null;
        String alias = null;
        while ((recid == null) && aliases.hasMoreElements()) {
            alias = aliases.nextElement();
            if (this.keystore.isKeyEntry(alias)) {
                recid = recinfos.get(new JceKeyTransRecipientId(
                        (X509Certificate) this.keystore.getCertificate(alias)));
            }
        }
        if (recid == null) {
            throw new RuntimeException("No decryption key found");
        }

        JceKeyTransEnvelopedRecipient recipient = new JceKeyTransEnvelopedRecipient(
                (PrivateKey) this.keystore.getKey(alias, "changeit"
                        .toCharArray()));

        byte[] content = recid.getContent(recipient);

        MimeMessage decrypted = new MimeMessage(Session
                .getDefaultInstance(System.getProperties()),
                new ByteArrayInputStream(content));
        decrypted.saveChanges();
        return decrypted;
    }</code>

Ein komplettes Codebeispiel für die BouncyCastle 1.46
S/MIME-Funktionalität befindet sich in diesem Zip-Archiv.

Nachtrag: Die kompletten Zertifikate sind in verschlüsselten Nachrichten nicht enthalten. BouncyCastle packt die Empfängerinformationen in RecipientInformation-Instanzen. Mit folgendem Codefragment kann man diese Informationen ausgeben lassen:

public MimeMessage decryptMessage(final MimeMessage encrypted)
        throws MessagingException, Exception {
    SMIMEEnveloped message = new SMIMEEnveloped(encrypted);
    RecipientInformationStore recinfos = message.getRecipientInfos();
    printRecInfos(recinfos);
    ...

private void printRecInfos(final RecipientInformationStore recinfos) {
    for (Object info : recinfos.getRecipients()) {
        if (info instanceof RecipientInformation) {
            System.out.println(((RecipientInformation) info).getRID());
        }
    }
}

Diese Webseite basiert auf Wordpress. © 2014 Communardo Software GmbH / Kleiststraße 10 a / D-01129 Dresden / Fon +49 (0) 351/8 33 82-0 / info@communardo.de