Selbstsignierte Zertifikate akzeptieren

Das Einloggen auf einem Mailserver und Verschicken einer E-Mail sollte über eine gesicherte Verbindung erfolgen. Abgesichert werden die Verbindungen mittels Zertifikat. Die müssen aber zertifiziert werden. Das kann man selbst machen – dann wird ihnen aber nicht vertraut (man kennt die Meldungen z.B. im Browser) – oder dafür jedes Jahr Geld ausgeben (es gibt auch die Möglichkeit für lau [SSL für lau] so was zu bekommen, aber halt mit Einschränkungen, die in dem hier geschilderten Zusammenhang nicht wirklich praktikabel sind). Also die Verbindung mit einem selbstsignierten Zertifikat absichern. Immer noch hundertmal besser als unverschlüsselt.
Wenn man nun mit Java eine E-Mail über eine verschlüsselte Verbindung hinter der nur ein selbstsigniertes Zertifikat steckt verschicken will, wird eine Exception geworfen. Es gibt nun zumindest drei Möglichkeiten, das zu umgehen:

  1. Das Zertifikat in dem Truststore zu importieren. Wie das geht -> java java certificate import
  2. Die Standard-Implementierung zu ersetzen, so dass alle (oder bestimmte?) Zertifikate akzeptiert werden: Wie das geht -> java certificate class accept
  3. Oder via Property dafür sorgen, dass einem bestimmten oder allen (*) Servern vertraut wird.

Letzteres geht wie folgt (hier Scala, Apache Commons Email):

import org.apache.commons.mail.{HtmlEmail, DefaultAuthenticator, EmailException, EmailAttachment}
...
val email = new HtmlEmail()

val attachment = new EmailAttachment()

attachment.setPath("attachment.pdf")
attachment.setDisposition(EmailAttachment.ATTACHMENT)

email.attach(attachment)
email.setTLS(true)
email.setSSL(false)
email.setSmtpPort(25)

email.setHostName("smtp.meinedomain.de")

email.setAuthenticator(new DefaultAuthenticator("user","passwort"))

email.getMailSession().getProperties().put("mail.smtp.ssl.trust","smtp.meinedomain.de") // oder eben "*" für alle

email
.setTextMsg("Email Text")
.addTo("marianne.musterfrau@musterstadt.de")
.setFrom("emil.mustermann@musterstadt.de")
.setSubject("Test")
.send()
Dieser Beitrag wurde unter Java, Scala veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Die Kommentarfunktion ist geschlossen.