Nachdem mich neulich ein Kollege auf eine mir bis dahin unbekannte Möglichkeit aufmerksam gemacht hat, EMail-Funktionalitäten ohne EMail-Server und -Konto zu testen holte ich ein altes Projekt aus der Versenkung hervor...

Die eingesetzte Komponente ist Greenmail - und sie hat nichts mit klimaneutralem Versand von realen Versandstücken zu tun.

Damit ließen sich zunächst erst einmal alle möglichen Konfigurationen und Anwendungsfälle meiner selbstgeschriebenen - und ja: ich weiß, dass es da draußen Milliarden von Implementierungen gibt, die dasselbe tun - Komponente zum Versand von EMails testen; einschließlich des Versands von Attachments und des Setzens selbstdefinierter Header.

Als ich damit fertig war überlegte ich mir, auch die S/MIME-Funktionalität ähnlichen Tests zu unterziehen. Auch das gelang mir - allerdings habe ich immer ein ungutes Gefühl, wenn derjenige, der die Implementierung schreibt auch für die Tests verantwortlich ist. Ich löse das privat wann immer es geht so, dass ich - besonders bei der Implementierung von Schnittstellen und Protokollen - die Tests durch eine Implementierung erledigen lasse, an der ich nicht beteiligt war.

Im Falle von Crypto ist mein erster Anlaufpunkt dafür oft OpenSSL - so auch dieses Mal: Ich erweiterte die Unit-Tests um einen Schalter der - wenn aktiviert - dafür sorgt, dass die erzeugten S/MIME-Botschaften für jeden Test als Dateien mit Endung .eml in ein eigenes Verzeichnis rausgeschrieben werden - zusammen mit dem Crypto-Material (Schlüssel, Zertifikate,...), das zum Verifizieren der elektronischen Signaturen und zum Entschlüssel gebraucht wird. Dazu kommen noch Schlüssel von Empfängern, für die die jeweilige Nachricht nicht verschlüsselt wurde (man soll auch den Negativtest durchführen können) und ein Bash-Script, das die jeweiligen Operationen des Entschlüsselns und Verifizierens mittels OpenSSL ausführt.

Jemand, der diese Implementierung verifizieren möchte, kann dann die einzelnen Skripte ausführen. Unten habe ich ein Beispiel für ein so erzeugtes Archiv angehängt - bevor jetzt jemand anfängt über meinen Geisteszustand zu räsonieren: Die Zertifikate sind selbsverständlich selbst-signiert und haben eine Gültigkeitsdauer von exakt einer Woche, die privaten Schlüssel sind als PEM-Dateien gespeichert und nicht durch ein Passwort geichert, da beides - Zertifikate und Schlüssel - bei jeder Testausführung erzeugt und danach weggeworfen werden. Durch die Veröffentlichung und Weitergabe wird also niemand gefährdet oder kompromittiert.

Da die API noch nicht ganz in einem Zustand ist, wie ich ihn mir vorstellen würde habe ich diese Komponente noch nicht als OpenSource freigegeben - wer trotzdem Interesse hat und damit leben kann, dass BouncyCastle als Abhängigkeit mitkommt, wende sich an mich: Das würde mir den Anstoß geben, die letzten Reste der Politur abzuwischen und ein OpenSource-Projekt daraus zu machen.

Hier noch ein Snapshot wie die API derzeit für einen schnellen test angewendet werden kann:

java.lang.String fromaddress="<sender_email>";
java.lang.String smtpPasswd="<change_me>";

java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); KeyStore ks = KeyStore.getInstance(java.security.KeyStore.getDefaultType()); ks.load(null);//insert the keystore holding certificates of your receivers

java.security.KeyStore signerKeystore = java.security.KeyStore.getInstance(java.security.KeyStore.getDefaultType()); signerKeystore.load(null, null);//insert the keystore here that holds your digital identity!

de.elbosso.util.net.mail.MailConfigurationBean mcb=new de.elbosso.util.net.mail.MailConfigurationBean(); mcb.setContent("content"); mcb.setSubject("subject"); mcb.setToaddress(java.util.Arrays.asList(new java.lang.String[]{fromaddress})); mcb.setSmtp_password(smtpPasswd); mcb.setSmtp_username(fromaddress); mcb.setAdminaddress(fromaddress); mcb.setFromaddress(fromaddress); mcb.setMailserver(null/*SMTP server address goes here*/); mcb.setReplyto(fromaddress); mcb.setSecurityMode(Security.STARTTLS/*or maybe something different - adjust to your needs*/); mcb.setEncryptionKeystore(ks); mcb.setSignerKeystore(signerKeystore); mcb.setSignerPassword("123456".toCharArray()/*you have secured your private key with a much stronger password of course...*/); SmtpMailHelper.send(mcb); SmtpMailHelper.sendEncrypted(mcb);

Lizenz
IntegrationTestSmtpMailHelper.zip

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Fährnisse des Buildprozesses unter Windows

    17.07.2019

    Nachdem ich begonnen hatte, mich mit der Beschleunigung der Berechnung des Mandelbrot-Fraktals unter Zuhilfenahme der Shadereinheiten in Graphikkarten zu beschäftigen und erste Erfolge feiern konnte, wollte ich das mal auf einer richtigen Graphikkarte ausprobieren...

    Weiterlesen...

Neueste Artikel

  • Datenvalidierung UTF8 mit BiDi-Steuerzeichen (TrojanSource 2.0)

    Ich bin heute nochmal inspiriert worden, weiter über die Trojan Source Vulnerability nachzudenken. Meiner Meinung nach bestehen hier noch Probleme - speziell bei Nutzereingaben oder Daten, die über externe Schnittstellen ampfangen werden.

    Weiterlesen...
  • OpenStreetMap Navi als Docker-Container

    Ich habe die auf OpenStreetMap basierende OpenSource Navigationslösung Graphhopper in einen Docker-Container gepackt und als neuestes Mitglied in meinem Docker-Zoo willkommen geheißen.

    Weiterlesen...
  • SQL-Aggregatfunktionen in SQLite als BeanShell-Scripts

    Ich habe neulich über eine Möglichkeit berichtet, SQLite mittels der sQLshell und Beanshell-Skripten um SQL-Funktionen zu erweitern. In diesem Artikel versprach ich auch, über eine solche Möglichkeit für Aggregatfunktionen zu berichten.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.