2016-07-12 22 views

Antwort

9

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

+1

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

+0

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