Hier ist ein Skript (Update) das letsencrypt Zertifikat zu erhalten: in regelmäßigen Abständen als letsencrypt Zertifikate zur Zeit verfallen nach 90 Tagen
#!/bin/bash
/path/to/your/app/stop # stop the play application; especially if it is running on port 80 otherwise the certificate generation will fail
rm -rf /etc/letsencrypt.bak
mv /etc/letsencrypt /etc/letsencrypt.bak
./letsencrypt-auto certonly --standalone -n -m [email protected] --agree-tos -d example.com -d www.example.com
cd /etc/letsencrypt/live/example.com
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out cert_and_key.p12 -CAfile chain.pem -caname root -passout pass:your_password
keytool -importkeystore -srcstorepass your_password -destkeystore keyStore.jks -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -storepass your_password
/path/to/your/app/start # start the application
Sie können einen cron-Job planen dieses Skript auszuführen.
Sobald Sie das Zertifikat zu erhalten müssen Sie die Anwendung Startskript wie folgt ändern:
/path/to/your/app/app_name_script -Dhttps.port=443 -Dplay.server.https.keyStore.path=/etc/letsencrypt/live/example.com/keyStore.jks -Dplay.server.https.keyStore.password=your_password -Djdk.tls.ephemeralDHKeySize=2048 -Djdk.tls.rejectClientInitiatedRenegotiation=true # ... more parameters if required
Fast dort. Wenn Sie die Anwendung ausführen, erhalten Sie A- Bewertung von SSL Labs. Die Rating-Herabstufung bezieht sich auf die Forward Secrecy. Um die Forward Secrecy Frage zu klären (und eine vollständige A Bewertung erhalten) können Sie die Reihenfolge des Chiffriersätze angeben müssen durch einen benutzerdefinierten SSLEngineProvider Implementierung:
package controllers
import java.nio.file._
import java.security.KeyStore
import javax.net.ssl._
import play.core.ApplicationProvider
import play.server.api._
class CustomSslEngineProvider(appProvider: ApplicationProvider) extends SSLEngineProvider {
val priorityCipherSuites = List(
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA")
def readPassword(): Array[Char] = System.getProperty("play.server.https.keyStore.password").toCharArray
def readKeyInputStream(): java.io.InputStream = {
val keyPath = FileSystems.getDefault.getPath(System.getProperty("play.server.https.keyStore.path"))
Files.newInputStream(keyPath)
}
def readKeyManagers(): Array[KeyManager] = {
val password = readPassword()
val keyInputStream = readKeyInputStream()
try {
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType)
keyStore.load(keyInputStream, password)
val kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm)
kmf.init(keyStore, password)
kmf.getKeyManagers
} finally {
keyInputStream.close()
}
}
def createSSLContext(): SSLContext = {
val keyManagers = readKeyManagers()
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(keyManagers, Array.empty, null)
sslContext
}
override def createSSLEngine(): SSLEngine = {
val ctx = createSSLContext()
val sslEngine = ctx.createSSLEngine
val cipherSuites = sslEngine.getEnabledCipherSuites.toList
val orderedCipherSuites =
priorityCipherSuites.filter(cipherSuites.contains) ::: cipherSuites.filterNot(priorityCipherSuites.contains)
sslEngine.setEnabledCipherSuites(orderedCipherSuites.toArray)
val params = sslEngine.getSSLParameters
params.setUseCipherSuitesOrder(true)
sslEngine.setSSLParameters(params)
sslEngine
}
}
nicht vergessen zu setzen
play.server.https.engineProvider = controllers.CustomSslEngineProvider
in Ihrem application.conf.
mit Play 2.5.x getestet
Es ist keine gute Idee, "mv/etc/letsencrypt". Es kann andere Zertifikate und Archive zerstören. Wenn Sie ein sauberes Verzeichnis verwenden möchten, können Sie die Option --config-dir verwenden: http://letsencrypt.readthedocs.io/en/latest/using.html – Tom
Sicher. Ich habe nur ein Zertifikat, also ist es mir egal. Diese Antwort bezieht sich eher auf die Konfiguration von Play und nicht auf die Verwaltung von Zertifikaten. Sie können das Beispielskript beliebig ändern. – Jan