§設定 HTTPS
Play 可以設定為提供 HTTPS 服務。若要啟用此功能,只要使用 https.port
系統屬性告知 Play 要監聽哪個埠即可。例如
./bin/your-app -Dhttps.port=9443
§提供設定
HTTPS 組態可以使用系統屬性或在 application.conf
中提供。如需更多詳細資料,請參閱 組態 和 製作組態 頁面。
§SSL 憑證
§來自金鑰庫的 SSL 憑證
預設情況下,Play 會自行產生自簽憑證,但通常不適合用於提供網站服務。Play 使用 Java 金鑰庫來組態 SSL 憑證和金鑰。
簽署單位通常會提供如何建立 Java 金鑰庫的說明(通常會參考 Tomcat 組態)。有關如何使用 JDK keytool 實用程式產生金鑰庫的官方 Oracle 文件,請參閱 這裡。在 產生 X.509 憑證 區段中也有範例。
建立金鑰庫後,可以使用下列組態屬性來組態 Play 以使用金鑰庫
- play.server.https.keyStore.path - 包含私密金鑰和憑證的金鑰庫路徑,如果未提供,會為您產生金鑰庫
- play.server.https.keyStore.type - 金鑰庫類型,預設為
JKS
- play.server.https.keyStore.password - 密碼,預設為空白密碼
- play.server.https.keyStore.algorithm - 金鑰庫演算法,預設為平台預設演算法
§來自自訂 SSL 引擎的 SSL 憑證
組態 SSL 憑證的另一種方式是提供自訂 SSLEngine。這在需要自訂 SSLEngine
的情況下也很有用,例如在用戶端驗證的情況下。在 Java 中,必須提供 play.server.SSLEngineProvider
的實作,在 Scala 中,必須提供 play.server.api.SSLEngineProvider
的實作。例如
- Scala
-
import javax.inject.Inject import javax.net.ssl._ import play.core.ApplicationProvider import play.server.api._ class CustomSSLEngineProvider @Inject() (appProvider: ApplicationProvider) extends SSLEngineProvider { override def createSSLEngine(): SSLEngine = { // change it to your custom implementation sslContext().createSSLEngine } override def sslContext(): SSLContext = { // change it to your custom implementation SSLContext.getDefault } }
- Java
-
import java.security.NoSuchAlgorithmException; import javax.inject.Inject; import javax.net.ssl.*; import play.server.ApplicationProvider; import play.server.SSLEngineProvider; public class CustomSSLEngineProvider implements SSLEngineProvider { private final ApplicationProvider applicationProvider; @Inject public CustomSSLEngineProvider(ApplicationProvider applicationProvider) { this.applicationProvider = applicationProvider; } @Override public SSLEngine createSSLEngine() { return sslContext().createSSLEngine(); } @Override public SSLContext sslContext() { try { // Change it to your custom implementation, possibly using ApplicationProvider. return SSLContext.getDefault(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } }
在為 play.server.SSLEngineProvider
或 play.server.api.SSLEngineProvider
建立實作後,下列系統屬性會設定 Play 以使用它
play.server.https.engineProvider
- 實作play.server.SSLEngineProvider
或play.server.api.SSLEngineProvider
的類別路徑
範例
./bin/your-app -Dhttps.port=9443 -Dplay.server.https.engineProvider=mypackage.CustomSSLEngineProvider
§關閉 HTTP
若要停用 HTTP 埠上的繫結,請將 http.port
系統屬性設定為 disabled
,例如
./bin/your-app -Dhttp.port=disabled -Dhttps.port=9443 -Dplay.server.https.keyStore.path=/path/to/keystore -Dplay.server.https.keyStore.password=changeme
§生產環境中使用 HTTPS
如果您打算將 Play 用於 TLS 終止層,請注意下列設定
SSLParameters.setUseCipherSuiteorder()
- 重新排序加密套件順序,以符合伺服器的偏好。- -Djdk.tls.ephemeralDHKeySize=2048 - 增加 DH 金鑰交換中的金鑰大小。
- -Djdk.tls.rejectClientInitiatedRenegotiation=true - 拒絕客戶端重新協商。
下一步:部署到雲端服務
在此文件中發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件指南 後,請隨時貢獻一個 pull request。有問題或建議要分享?請前往 我們的社群論壇 與社群展開對話。