HTTP 連接器
目錄
簡介
HTTP 連接器元素表示支援 HTTP/1.1 協定的連接器元件。除了執行 servlet 和 JSP 頁面外,它還能讓 Catalina 作為獨立的網路伺服器運作。此元件的特定執行個體會在伺服器上特定 TCP 埠號上偵聽連線。一個或多個此類連接器可以組態為單一 服務 的一部分,每個連接器都轉發到關聯的 引擎 來執行要求處理並建立回應。
如果您想組態用於透過 AJP 協定連線到網路伺服器的連接器(例如 Apache 1.3 的 mod_jk 1.2.x
連接器),請參閱 AJP 連接器 文件。
每個傳入的非同步請求都需要一個執行緒來執行該請求。如果收到的同時請求多於目前可用的請求處理執行緒所能處理的數量,系統將建立額外的執行緒,直到達到組態的最大值(maxThreads
屬性的值)。如果仍收到更多同時請求,Tomcat 會接受新的連線,直到目前的連線數達到 maxConnections
。連線會排隊在連接器建立的伺服器 socket 內部,直到有執行緒可處理連線。達到 maxConnections
後,作業系統會排隊後續的連線。作業系統提供的連線排隊大小可以透過 acceptCount
屬性控制。如果作業系統排隊已滿,後續的連線要求可能會被拒絕或逾時。
屬性
一般屬性
連接器的所有實作都支援下列屬性
屬性 | 說明 |
---|---|
allowBackslash |
如果此為 如果未指定,則會使用預設值 |
allowTrace |
布林值,可用於啟用或停用 TRACE HTTP 方法。如果未指定,此屬性會設為 false。根據 RFC 7231 第 4.3.8 節,cookie 和授權標頭將會從 TRACE 要求的回應中排除。如果您想要包含這些標頭,您可以實作目標 Servlet 的 |
asyncTimeout |
非同步要求的預設逾時時間(毫秒)。如果未指定,此屬性會設為 Servlet 規格預設值 30000(30 秒)。 |
discardFacades |
布林值,可用於啟用或停用隔離容器內部要求處理物件的門面物件的回收。如果設為 |
enableLookups |
如果要讓對 |
encodedSolidusHandling |
設為 |
enforceEncodingInGetWriter |
如果此為 如果未指定,將使用符合預設規格的 |
maxCookieCount |
要求允許的最大 Cookie 數目。小於 0 的值表示沒有限制。如果未指定,將使用預設值 200。 |
maxParameterCount |
從查詢字串取得的要求參數總數上限(包括上傳的檔案),以及對於 POST 要求,如果內容類型為 |
maxPostSize |
容器 FORM URL 參數剖析將處理的 POST 的最大位元組大小。可以透過將此屬性設定為小於 0 的值來停用限制。如果未指定,此屬性將設定為 2097152 (2 MiB)。請注意, |
maxSavePostSize |
容器在 FORM 或 CLIENT-CERT 驗證期間或 HTTP/1.1 升級期間將儲存/緩衝的要求主體的最大位元組大小。對於這兩種驗證類型,要求主體將在使用者驗證之前儲存/緩衝。對於 CLIENT-CERT 驗證,要求主體會在 SSL 交握期間緩衝,並在處理要求時清空緩衝區。對於 FORM 驗證,POST 會在使用者重新導向到登入表單時儲存,並保留到使用者成功驗證或與驗證要求相關聯的階段逾期為止。對於 HTTP/1.1 升級,要求主體會在升級程序期間緩衝。可以透過將此屬性設定為 -1 來停用限制。將屬性設定為 0 將停用在驗證和 HTTP/1.1 升級期間儲存要求主體資料。如果未指定,此屬性將設定為 4096 (4 千位元組)。 |
parseBodyMethods |
使用 |
埠 |
此連接器將建立伺服器套接字並等待傳入連線的 TCP 埠號。您的作業系統只允許一個伺服器應用程式偵聽特定 IP 位址上的特定埠號。如果使用特殊值 0(零),則 Tomcat 會隨機選取一個可用埠供此連接器使用。這通常只適用於嵌入式和測試應用程式。 |
通訊協定 |
設定處理傳入流量的通訊協定。預設值為 |
proxyName |
如果此連接器用於代理組態,請設定此屬性以指定要為對 |
proxyPort |
如果此連接器用於代理組態,請設定此屬性以指定要為對 |
redirectPort |
如果此連接器支援非 SSL 要求,且收到一個要求,而對應的 |
rejectSuspiciousURIs |
如果 URI 與 Servlet 6.0 規格識別的可疑 URI 模式之一相符,此連接器是否應拒絕要求?預設值為 |
scheme |
將此屬性設定為您希望對 |
secure |
如果您希望對 |
URIEncoding |
這指定在對 URL 進行 %xx 解碼後,用於解碼 URI 位元組的字元編碼。預設值為 |
useBodyEncodingForURI |
這指定是否應將 contentType 中指定的編碼用於 URI 查詢參數,而不是使用 URIEncoding。此設定存在於與 Tomcat 4.1.x 的相容性中,其中 contentType 中指定的編碼或使用 Request.setCharacterEncoding 方法明確設定的編碼也用於 URL 中的參數。預設值為 備註: 1) 此設定僅套用於要求的查詢字串。與 |
useIPVHosts |
將此屬性設定為 |
xpoweredBy |
將此屬性設定為 |
標準實作
標準 HTTP 連接器(NIO 和 NIO2)除了上面列出的常見連接器屬性之外,還支援以下屬性。
屬性 | 說明 |
---|---|
acceptCount |
當 |
acceptorThreadPriority |
接收器執行緒的優先順序。用於接受新連線的執行緒。預設值為 |
address |
對於有多個 IP 位址的伺服器,此屬性會指定哪個位址將用於監聽指定的埠。預設情況下,連接器會監聽所有本機位址。除非使用系統屬性以其他方式設定 JVM,否則當使用 |
allowHostHeaderMismatch |
預設情況下,Tomcat 會拒絕在要求列中指定主機,但在主機標頭中指定不同主機的要求。可以透過將此屬性設定為 |
allowedTrailerHeaders |
預設情況下,Tomcat 在處理分塊輸入時會忽略所有尾端標頭。若要處理標頭,必須將其新增到此以逗號分隔的標頭名稱清單中。 |
bindOnInit |
控制連接器使用的 socket 何時繫結。如果設為 |
clientCertProvider |
當客戶端憑證資訊以 |
compressibleMimeType |
值是 MIME 類型的逗號分隔清單,可對其使用 HTTP 壓縮。預設值為 |
compression |
連接器可能會使用 HTTP/1.1 GZIP 壓縮來嘗試節省伺服器頻寬。參數的可接受值為「off」(停用壓縮)、「on」(允許壓縮,這會導致文字資料被壓縮)、「force」(在所有情況下強制壓縮)或數字整數值(等於「on」,但指定輸出在壓縮前的資料最小量)。如果內容長度未知,且壓縮設為「on」或更激進,則輸出也會被壓縮。如果未指定,此屬性會設為「off」。 注意:使用壓縮(節省您的頻寬)和使用 sendfile 功能(節省您的 CPU 週期)之間存在權衡。如果連接器支援 sendfile 功能,例如 NIO 連接器,則使用 sendfile 將優先於壓縮。症狀是,大於 48 KiB 的靜態檔案將會以未壓縮的方式傳送。您可以透過設定連接器的 |
compressionMinSize |
如果將壓縮設為「開啟」,則此屬性可用於指定在輸出壓縮之前資料的最小量。如果未指定,此屬性預設為「2048」。單位為位元組。 |
connectionLinger |
此連接器使用的 Socket 在關閉時會延遲的秒數。預設值為 |
connectionTimeout |
此連接器在接受連線後會等待請求 URI 行顯示的毫秒數。使用 -1 表示沒有 (即無限) 超時。預設值為 60000 (即 60 秒),但請注意,隨 Tomcat 附帶的標準 server.xml 將其設為 20000 (即 20 秒)。除非將 disableUploadTimeout 設為 |
connectionUploadTimeout |
指定在資料上傳進行中的超時時間 (毫秒)。這只會在將 disableUploadTimeout 設為 |
continueResponseTiming |
何時對包含
|
defaultSSLHostConfigName |
預設SSLHostConfig 的名稱,如果客戶端連線未提供 SNI,或提供了 SNI 但與任何已設定的SSLHostConfig 不符,則會用於安全連線 (如果此連接器已設定為安全連線)。如果未指定,將使用預設值 |
disableUploadTimeout |
此旗標允許 Servlet 容器在資料上傳期間使用不同的、通常較長的連線超時。如果未指定,此屬性會設為 |
executor |
一個連結器元素中名稱的參考。執行器如果設定這個屬性,且存在已命名的執行器,連結器將會使用執行器,並且會忽略所有其他執行緒屬性。請注意,如果未為連結器指定共用執行器,則連結器將會使用私有內部執行器來提供執行緒池。 |
executorTerminationTimeoutMillis |
在繼續停止連結器的程序之前,私有內部執行器將等待請求處理執行緒終止的時間。如果未設定,預設值為 |
keepAliveTimeout |
此連結器在關閉連線之前等待另一個 HTTP 請求的毫秒數。預設值是使用已設定為connectionTimeout屬性的值。使用 -1 的值表示沒有(即無限)逾時。 |
maxConnections |
伺服器在任何特定時間接受和處理的最大連線數。當達到這個數目時,伺服器會接受,但不會處理另一個連線。這個額外的連線會被封鎖,直到正在處理的連線數低於maxConnections,此時伺服器將開始再次接受和處理新的連線。請注意,一旦達到限制,作業系統仍可能會根據 僅限於 NIO/NIO2,將值設定為 -1,將會停用 maxConnections 功能,且不會計算連線。 |
maxExtensionSize |
限制分塊 HTTP 請求中分塊延伸的總長度。如果值為 |
maxHeaderCount |
容器允許請求中的最大標頭數。包含比指定限制更多標頭的請求將會被拒絕。小於 0 的值表示沒有限制。如果未指定,則使用預設值 100。 |
maxHttpHeaderSize |
提供 maxHttpRequestHeaderSize 和 maxHttpResponseHeaderSize 的預設值。如果未指定,則此屬性設定為 8192(8 KiB)。 |
maxHttpRequestHeaderSize |
以位元組為單位,指定與 HTTP 請求相關的請求行和標頭的最大允許大小。這會與接收到的位元組數進行比較,因此包括換行符號和空白,以及請求行、標頭名稱和標頭值。如果未指定,則此屬性設定為 如果您看到「要求標頭過大」的錯誤,您可以增加此值,但請注意 Tomcat 會為每個要求分配您指定的完整數量。例如,如果您指定 1 MB 的 maxHttpRequestHeaderSize,而您的應用程式處理 100 個同時進行的要求,您將看到 100 MB 的堆積消耗在要求標頭中。 |
maxHttpResponseHeaderSize |
以位元組為單位指定的 HTTP 回應關聯回應列和標頭的最大允許大小。這會與寫入的位元組數進行比較,因此包括換行符號和空白,以及狀態列、標頭名稱和標頭值。如果未指定,這個屬性會設為 |
maxKeepAliveRequests |
在伺服器關閉連線之前,可以串接的最大 HTTP 要求數。將此屬性設為 1 會停用 HTTP/1.0 保持連線,以及 HTTP/1.1 保持連線和串接。將此設為 -1 會允許串接或保持連線的 HTTP 要求數量不受限制。如果未指定,這個屬性會設為 100。 |
maxSwallowSize |
對於中止上傳,Tomcat 會吞入的最大要求主體位元組數(不含傳輸編碼開銷)。中止上傳是指 Tomcat 知道要求主體會被忽略,但用戶端仍傳送它。如果 Tomcat 沒有吞入主體,用戶端不太可能看到回應。如果未指定,會使用預設值 2097152(2 MiB)。小於零的值表示不應強制執行限制。 |
maxThreads |
由這個 Connector 建立的最大請求處理執行緒數目,因此決定可以同時處理的最大請求數目。如果未指定,此屬性會設定為 200。如果執行器與這個 connector 關聯,這個屬性會被忽略,因為 connector 會使用執行器而不是內部執行緒池來執行工作。請注意,如果執行器已設定,任何為這個屬性設定的值都會正確記錄,但會報告為 |
maxTrailerSize |
限制分塊 HTTP 請求最後一個區塊中尾端標頭的總長度。如果值為 |
minSpareThreads |
持續執行執行緒的最小數目。這包括活動和閒置執行緒。如果未指定,將使用預設值 |
noCompressionUserAgents |
這個值是一個正規表示式(使用 |
processorCache |
通訊協定處理常式會快取 Processor 物件以加速效能。這個設定決定要快取多少個這些物件。 |
rejectIllegalHeader |
如果收到包含非法標頭名稱或值的 HTTP 請求(例如標頭名稱不是一個代號),這個設定會決定請求是否會被拒絕並傳回 400 回應( |
relaxedPathChars |
HTTP/1.1 規範 要求在 URI 路徑中使用時,某些字元必須編碼為 %nn。很遺憾,許多使用者代理程式(包括所有主流瀏覽器)都不符合此規範,並以未編碼的形式使用這些字元。為避免 Tomcat 拒絕此類要求,此屬性可用於指定要允許的其他字元。如果未指定,則不允許任何其他字元。值可以是下列字元的任意組合: |
relaxedQueryChars |
HTTP/1.1 規範 要求在 URI 查詢字串中使用時,某些字元必須編碼為 %nn。很遺憾,許多使用者代理程式(包括所有主流瀏覽器)都不符合此規範,並以未編碼的形式使用這些字元。為避免 Tomcat 拒絕此類要求,此屬性可用於指定要允許的其他字元。如果未指定,則不允許任何其他字元。值可以是下列字元的任意組合: |
restrictedUserAgents |
值是一個正規表示式(使用 |
server |
覆寫 HTTP 回應的 Server 標頭。如果設定,此屬性的值會覆寫網頁應用程式設定的任何 Server 標頭。如果未設定,則會使用應用程式指定的任何值。如果應用程式未指定值,則不設定 Server 標頭。 |
serverRemoveAppProvidedValues |
如果為 |
SSLEnabled |
使用此屬性在連接器上啟用 SSL 流量。若要在連接器上開啟 SSL 握手/加密/解密,請將此值設定為 |
tcpNoDelay |
如果設為 |
threadPriority |
JVM 中要求處理執行緒的優先順序。預設值為 |
threadsMaxIdleTime |
如果執行緒池中的執行緒多於 |
throwOnFailure |
如果連接器在生命週期轉換期間遇到例外,是否應重新擲回或記錄例外?如果未指定,將使用預設的 |
useAsyncIO |
(布林值)使用此屬性來啟用或停用非同步 IO API 的使用。預設值為 |
useKeepAliveResponseHeader |
(布林值)使用此屬性來啟用或停用 |
useVirtualThreads |
(布林值)使用此屬性來啟用或停用內部執行緒的虛擬執行緒使用。如果執行緒與此連接器關聯,此屬性將被忽略。預設值為 |
Java TCP socket 屬性
NIO 和 NIO2 實作支援下列 Java TCP socket 屬性,以及上面所列的通用 Connector 和 HTTP 屬性。
屬性 | 說明 |
---|---|
socket.rxBufSize |
(int)socket 接收緩衝區 (SO_RCVBUF) 大小(以位元組為單位)。如果未設定,則使用 JVM 預設值。 |
socket.txBufSize |
(int)socket 傳送緩衝區 (SO_SNDBUF) 大小(以位元組為單位)。如果未設定,則使用 JVM 預設值。如果明確設定此值,請小心。在某些 JVM 上,如果值小於 ~8k,效能會非常差。 |
socket.tcpNoDelay |
(bool)這等於標準屬性 tcpNoDelay。 |
socket.soKeepAlive |
(bool)socket 保持連線設定 (SO_KEEPALIVE) 的布林值。如果未設定,則使用 JVM 預設值。 |
socket.ooBInline |
(bool)socket OOBINLINE 設定的布林值。如果未設定,則使用 JVM 預設值。 |
socket.soReuseAddress |
(bool)socket 重複使用位址選項 (SO_REUSEADDR) 的布林值。如果未設定,則使用 JVM 預設值。 |
socket.soLingerOn |
(bool)socket 延遲選項 (SO_LINGER) 的布林值。標準屬性 connectionLinger 的值如果 >=0,則等於將此設定為 |
socket.soLingerTime |
(int)socket 延遲選項 (SO_LINGER) 的值(以秒為單位)。這等於標準屬性 connectionLinger。此屬性和 |
socket.soTimeout |
這等於標準屬性 connectionTimeout。 |
socket.performanceConnectionTime |
(int)效能設定的第一個值。請參閱 Socket 效能選項。所有三個效能屬性都必須設定,否則將同時使用 JVM 預設值。 |
socket.performanceLatency |
(int)效能設定的第二個值。請參閱Socket 效能選項。所有三個效能屬性都必須設定,否則 JVM 預設值將用於所有三個屬性。 |
socket.performanceBandwidth |
(int)效能設定的第三個值。請參閱Socket 效能選項。所有三個效能屬性都必須設定,否則 JVM 預設值將用於所有三個屬性。 |
socket.unlockTimeout |
(int) Socket 解鎖的逾時時間。當連接器停止時,它會嘗試透過開啟連接器本身來釋放接收器執行緒。預設值為 |
NIO 特定組態
下列屬性是 NIO 連接器專用的。
屬性 | 說明 |
---|---|
pollerThreadPriority |
(int)輪詢器執行緒的優先順序。預設值為 |
selectorTimeout |
(int)輪詢器在 select() 上逾時的毫秒數。此值很重要,因為連線清除是在同一個執行緒上執行,因此請勿將此值設定得過高。預設值為 |
useSendfile |
(bool)使用此屬性來啟用或停用 sendfile 功能。預設值為 |
socket.directBuffer |
(bool)布林值,表示是否使用直接 ByteBuffers 或 Java 對應的 ByteBuffers。如果為 |
socket.directSslBuffer |
(bool)布林值,表示是否為 SSL 緩衝區使用直接 ByteBuffers 或 Java 對應的 ByteBuffers。如果為 |
socket.appReadBufSize |
(int)在 Tomcat 中開啟的每個連線都與一個讀取 ByteBuffer 關聯。此屬性控制此緩衝區的大小。預設情況下,此讀取緩衝區大小為 |
socket.appWriteBufSize |
(int)在 Tomcat 中開啟的每個連線都與一個寫入 ByteBuffer 關聯。此屬性控制此緩衝區的大小。預設情況下,此寫入緩衝區大小為 |
socket.bufferPool |
(int)NIOx 連接器使用一個名為 NioXChannel 的類別,該類別包含連結到 socket 的元素。為了減少垃圾收集,NIOx 連接器會快取這些通道物件。此值指定此快取的大小。預設值為 |
socket.bufferPoolSize |
NioXChannel 池也可以基於大小,而不是基於使用的物件。如果 bufferPool 不為 -2,則不會使用此值。 |
socket.processorCache |
(int)Tomcat 將快取 SocketProcessor 物件以減少垃圾收集。整數值指定最多在快取中保留多少個物件。預設值為 |
socket.eventCache |
(int)Tomcat 將快取 PollerEvent 物件以減少垃圾收集。整數值指定最多在快取中保留多少個物件。預設值為 |
unixDomainSocketPath |
在受支援的情況下,這是此 連接器將建立並等待連線進來的 Unix Domain Socket 的路徑。當指定此路徑時,否則強制性的 |
unixDomainSocketPathPermissions |
如果支援,將套用在上面以 |
useInheritedChannel |
(布林值)定義此連接器是否應繼承 inetd/systemd 網路 Socket。只有一個連接器可以繼承網路 Socket。此選項可用於在連線要求傳送到 systemd 超級守護程序的連接埠後自動啟動 Tomcat。預設值為 |
NIO2 特定組態
下列屬性特定於 NIO2 連接器。
屬性 | 說明 |
---|---|
useSendfile |
(bool)使用此屬性來啟用或停用 sendfile 功能。預設值為 |
socket.directBuffer |
(bool)布林值,表示是否使用直接 ByteBuffers 或 Java 對應的 ByteBuffers。如果為 |
socket.directSslBuffer |
(bool)布林值,表示是否為 SSL 緩衝區使用直接 ByteBuffers 或 Java 對應的 ByteBuffers。如果為 |
socket.appReadBufSize |
(int)在 Tomcat 中開啟的每個連線都與一個讀取 ByteBuffer 關聯。此屬性控制此緩衝區的大小。預設情況下,此讀取緩衝區大小為 |
socket.appWriteBufSize |
(int)在 Tomcat 中開啟的每個連線都與一個寫入 ByteBuffer 關聯。此屬性控制此緩衝區的大小。預設情況下,此寫入緩衝區大小為 |
socket.bufferPool |
(整數)NIO2 連接器使用稱為 Nio2Channel 的類別,其中包含連結到 Socket 的元素。為減少垃圾收集,NIO2 連接器會快取這些頻道物件。此值指定此快取的大小。預設值為 |
socket.processorCache |
(整數)Tomcat 會快取 SocketProcessor 物件以減少垃圾收集。整數值指定最多在快取中保留多少個物件。預設值為 |
巢狀元件
Tomcat 支援伺服器名稱指示 (SNI)。這允許將多個 SSL 組態與單一安全連接器關聯,其中用於任何特定連線的組態是由客戶端要求的主機名稱所決定。為簡化此程序,已新增 SSLHostConfig 元素,可用於定義其中一個組態。任何數量的 SSLHostConfig 都可以嵌套在 Connector 中。同時,已新增支援,讓多個憑證可以與單一 SSLHostConfig 關聯。因此,每個 SSL 憑證都會在 SSLHostConfig 中的 Certificate 元素中進行組態。有關更多詳細資料,請參閱下列的 SSL 支援區段。
當 OpenSSL 提供 TLS 實作時,可以在 OpenSSLConf 元素內嵌套一個或多個 OpenSSLConfCmd 元素,以透過 OpenSSL 的 SSL_CONF
API 來組態 OpenSSL。單一 OpenSSLConf 元素可以嵌套在 SSLHostConfig 元素中。有關更多詳細資料,請參閱下列的 SSL 支援區段
特殊功能
HTTP/1.1 和 HTTP/1.0 支援
此連接器支援 HTTP/1.1 協定的所有必要功能,如 RFC 7230-7235 所述,包括持續連線、管線、預期和分塊編碼。如果客戶端僅支援 HTTP/1.0 或 HTTP/0.9,連接器也會優雅地回退以支援此協定。不需要任何特殊設定即可啟用此支援。連接器也支援 HTTP/1.0 保持連線。
RFC 7230 要求 HTTP 伺服器總是從他們聲稱支援的最高 HTTP 版本開始回應。因此,此連接器將在回應的開頭總是傳回 HTTP/1.1
。
HTTP/2 支援
HTTP/2 支援提供給 TLS (h2)、非 TLS 經由 HTTP 升級 (h2c) 和直接 HTTP/2 (h2c) 連線。若要為 HTTP 連接器啟用 HTTP/2 支援,以下升級協定元素必須嵌套在連接器中,且類別名稱屬性為 org.apache.coyote.http2.Http2Protocol
。
<Connector ... >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
有其他設定屬性可用。有關詳細資訊,請參閱HTTP/2 升級協定文件。
代理支援
當 Tomcat 在代理伺服器後方執行時,可以使用 proxyName
和 proxyPort
屬性。這些屬性會修改傳回給呼叫 request.getServerName()
和 request.getServerPort()
方法的網路應用程式的值,這些方法通常用於建構重新導向的絕對 URL。如果不設定這些屬性,傳回的值會反映接收代理伺服器連線的伺服器名稱和埠,而不是客戶端將原始要求導向的伺服器名稱和埠。
有關更多資訊,請參閱代理支援操作指南。
Unix 域 Socket 支援
當使用 unixDomainSocketPath
屬性時,支援 Unix Domain Socket 的連接器會繫結到給定路徑的 socket。
對於 Java 16 和更高版本使用者,支援在 NIO 連接器中提供。
socket 路徑會建立具有所有使用者讀取和寫入權限。若要保護此 socket,請將其放置在具有適當權限的目錄中,並適當地設定以限制存取。或者,在支援 posix 權限的平台上,可以使用 unixDomainSocketPathPermissions
選項直接設定 socket 的權限。
Tomcat 會在伺服器關閉時自動移除 socket。如果 socket 已存在,啟動會失敗。管理員必須在驗證 socket 尚未被現有的 Tomcat 程序使用後,小心地移除 socket。
可以使用 curl
命令列客戶端的 --unix-socket
選項和 Apache HTTP 伺服器的 mod_proxy
模組中的 Unix Domain Socket 支援來存取 Unix Domain Socket。
SSL 支援
您可以透過將 SSLEnabled
屬性設定為 true
,為此 Connector 的特定執行個體啟用 SSL 支援。
您還需要將 scheme
和 secure
屬性分別設定為 https
和 true
,以傳遞正確資訊給 servlets。
NIO 和 NIO2 connectors 使用 JSSE Java SSL 實作或 OpenSSL 實作。在可行的情況下,JSSE 和 OpenSSL 都使用常見的組態屬性。
每個安全 connector 都必須定義至少一個 SSLHostConfig。SSLHostConfig 元素的名稱必須是唯一的,其中一個必須與 Connector 的 defaultSSLHostConfigName
屬性相符。
每個 SSLHostConfig 都必須反過來定義至少一個 Certificate。Certificate 的類型必須是唯一的。
除了 Servlet 規範第 3.10 節中定義的標準 TLS 相關要求屬性之外,Tomcat 還支援許多其他 TLS 相關屬性。完整清單可以在 SSLSupport Javadoc 中找到。
如需更多資訊,請參閱 SSL 組態操作指南。
SSL 支援 - SSLHostConfig
屬性 | 說明 |
---|---|
certificateRevocationListFile |
包含憑證授權機構的串接憑證撤銷清單之檔案名稱。格式為 PEM 編碼。如果未定義,則不會根據憑證撤銷清單檢查用戶端憑證(除非使用基於 OpenSSL 的 connector 且定義了 certificateRevocationListPath)。相對路徑會根據 |
certificateRevocationListPath |
僅限 OpenSSL。 包含憑證授權機構的憑證撤銷清單之目錄名稱。格式為 PEM 編碼。相對路徑會根據 |
certificateVerification |
如果您希望 SSL 堆疊在接受連線之前要求用戶端提供有效的憑證鏈,請設定為 |
certificateVerificationDepth |
驗證用戶端憑證時允許的最大中間憑證數目。如果未指定,則會使用預設值 10。 |
caCertificateFile |
僅限 OpenSSL。 包含受信任憑證授權機構的串接憑證之檔案名稱。格式為 PEM 編碼。 |
caCertificatePath |
僅限 OpenSSL。 包含受信任憑證授權機構的憑證之目錄名稱。格式為 PEM 編碼。 |
ciphers |
使用 OpenSSL 語法啟用的密碼。 (請參閱 OpenSSL 文件以取得支援的密碼清單和語法)。或者,可以使用標準 OpenSSL 密碼名稱或標準 JSSE 密碼名稱的逗號分隔密碼清單。 不同版本的 OpenSSL 可能對相同的密碼字串有不同的詮釋。例如, 僅會使用 SSL 實作支援的密碼。當 Connector 啟動時,任何從非預設密碼字串衍生的密碼,且不受 SSL 實作支援,都會記錄在 如果未指定,將使用預設值 (使用 OpenSSL 表示法) 請注意,預設情況下,定義密碼的順序會視為偏好順序。請參閱 |
disableCompression |
僅限 OpenSSL。 設定是否停用壓縮。預設值為 |
disableSessionTickets |
僅限 OpenSSL。 如果設定為 |
honorCipherOrder |
設定為 |
hostName |
SSL 主機的名稱。這應該是完全合格的網域名稱 (例如 |
insecureRenegotiation |
僅限 OpenSSL。 設定是否允許不安全的重新協商。預設值為 |
keyManagerAlgorithm |
僅限 JSSE。 要使用的 |
protocols |
與用戶端通訊時要支援的通訊協定名稱。這應該是下列任何組合的清單
清單中的每個令牌都可以加上正號(「+」)或負號(「-」)為前綴。正號會新增通訊協定,負號會從目前的清單中移除通訊協定。清單會從一個空清單開始建立。 令牌 請注意, 請注意,基於 OpenSSL 的安全連線器會忽略 請注意, 如果未指定,將使用 |
revocationEnabled |
僅限 JSSE。 JSSE 提供者是否應啟用憑證撤銷檢查?如果設定了certificateRevocationListFile,則會忽略這個屬性,並永遠啟用撤銷檢查。此屬性用於啟用已透過其他方式為目前的 JSSE 提供者設定的撤銷檢查。如果未指定,將使用預設值 |
sessionCacheSize |
要保留在快取中的 SSL 會話數。指定 |
sessionTimeout |
SSL 會話在建立後經過多少秒會逾時。指定 |
sslProtocol |
僅限 JSSE。 要使用的 SSL 通訊協定(單一值可以啟用多個通訊協定 - 詳細資訊請參閱 JVM 文件)。如果未指定,預設值為 |
trustManagerClassName |
僅限 JSSE。 用於驗證用戶端憑證的自訂信任管理員類別的名稱。此類別必須有一個零參數建構函式,並且還必須實作 |
truststoreAlgorithm |
僅限 JSSE。 要使用的信任儲存庫演算法。如果未指定,則使用 |
truststoreFile |
僅限 JSSE。 用於驗證用戶端憑證的信任儲存庫檔案。預設值為 |
truststorePassword |
僅限 JSSE。 存取信任儲存庫的密碼。預設值為 |
truststoreProvider |
僅限 JSSE。 要使用於伺服器憑證的信任儲存庫提供者的名稱。預設值為 |
truststoreType |
僅限 JSSE。 用於信任儲存庫的儲存庫類型。預設值為 |
SSL 支援 - 憑證
屬性 | 說明 |
---|---|
certificateFile |
包含伺服器憑證的檔案名稱。格式為 PEM 編碼。相對路徑會針對 除了憑證外,檔案還可以包含作為選用元素的 DH 參數和/或臨時金鑰的 EC 曲線名稱,分別由 此屬性為必要,除非指定了 certificateKeystoreFile。 |
certificateChainFile |
包含與所使用的伺服器憑證相關聯的憑證鏈的檔案名稱。格式為 PEM 編碼。相對路徑將根據 用於 Tomcat 的憑證鏈不應將伺服器憑證包含為其第一個元素。 請注意,當對不同類型使用多個憑證時,它們都必須使用相同的憑證鏈。 |
certificateKeyAlias |
僅限 JSSE。 用於金鑰庫中伺服器金鑰和憑證的別名。如果未指定,將使用從金鑰庫讀取的第一個金鑰。從金鑰庫讀取金鑰的順序取決於實作。金鑰可能不會按照加入金鑰庫的順序從金鑰庫讀取。如果金鑰庫中存在多個金鑰,強烈建議設定 keyAlias 以確保使用正確的金鑰。 |
certificateKeyFile |
包含伺服器私密金鑰的檔案名稱。格式為 PEM 編碼。預設值為 certificateFile 的值,且在此情況下,憑證和私密金鑰都必須在此檔案中(不建議)。相對路徑將根據 |
certificateKeyPassword |
用於從指定檔案存取與伺服器憑證相關聯的私密金鑰的密碼。 如果未指定,JSSE 的預設行為是使用 certificateKeystorePassword。對於 OpenSSL,預設行為是不使用密碼,但 OpenSSL 會在需要時提示輸入密碼。 |
certificateKeyPasswordFile |
用於從指定檔案存取與伺服器憑證相關聯的私密金鑰的密碼檔案。此屬性優先於 certificateKeyPassword。 如果未指定,JSSE 的預設行為是使用 certificateKeystorePasswordFile。對於 OpenSSL,預設行為是不使用密碼 (檔案),但 OpenSSL 會在需要時提示輸入密碼。 |
certificateKeystoreFile |
僅限 JSSE。 儲存要載入的伺服器憑證和金鑰的金鑰庫檔案路徑名稱。預設路徑名稱是執行 Tomcat 使用者的作業系統主目錄中的檔案 除非指定了 certificateFile,否則需要此屬性。 |
certificateKeystorePassword |
僅限 JSSE。 用於存取包含伺服器私人金鑰和憑證的金鑰庫的密碼。如果未指定,將使用預設值 |
certificateKeystorePasswordFile |
僅限 JSSE。 用於存取包含伺服器私人金鑰和憑證的金鑰庫的密碼檔案。此屬性優先於 certificateKeystorePassword。 |
certificateKeystoreProvider |
僅限 JSSE。 用於伺服器憑證的金鑰庫提供者的名稱。如果未指定,將使用系統屬性 |
certificateKeystoreType |
僅限 JSSE。 用於伺服器憑證的金鑰庫檔案類型。如果未指定,將使用系統屬性 |
type |
憑證類型。這用於識別與憑證相容的密碼。它必須是 |
SSL 支援 - 連接器 - NIO 和 NIO2
啟用 APR/native 時,連接器將預設透過 JSSE 使用 OpenSSL,這可能比 JSSE Java 實作更最佳化,具體取決於使用的處理器,且可以搭配許多商業加速器元件。
以下 NIO 和 NIO2 SSL 組態屬性不特定於虛擬主機,因此必須在連接器上進行組態。
屬性 | 說明 |
---|---|
sniParseLimit |
為了實作 SNI 支援,Tomcat 必須剖析在新的 TLS 連線 (客戶端 hello) 上接收到的第一個 TLS 訊息,以擷取要求的伺服器名稱。訊息需要緩衝,然後才能傳遞給 JSSE 實作進行正常的 TLS 處理。理論上,第一個訊息可能非常大,但實際上通常只有幾百個位元組。此屬性設定 Tomcat 將緩衝的最大訊息大小。如果訊息超過此大小,連線將被組態為彷彿客戶端未指出伺服器名稱。如果未指定,將使用預設值 |
sslImplementationName |
要使用的 SSL 實作類別名稱。如果未指定且未安裝 tomcat-native 函式庫,將使用預設值 |
SSL 支援 - OpenSSL 的 SSL_CONF API
當 OpenSSL 提供 TLS 實作時,一個或多個 OpenSSLConfCmd 元素可能會嵌套在 OpenSSLConf 元素內部,以透過 OpenSSL 的 SSL_CONF
API 來設定 OpenSSL。一個 OpenSSLConf 元素可能會嵌套在 SSLHostConfig 元素內部。
可用的設定檔命令組會依據所使用的 OpenSSL 版本而定。如需支援的命令名稱和值的清單,請參閱 SSL_CONF_cmd(3) 手冊頁面中支援的設定檔命令部分,以取得 OpenSSL 的資訊。某些設定檔命令可用作 SSLHostConfig 屬性的替代方案。建議僅在無法使用 SSLHostConfig 屬性設定功能時,才使用設定檔命令。
OpenSSLConf 元素不支援任何屬性。
OpenSSLConfCmd 元素支援下列屬性。
屬性 | 說明 |
---|---|
name |
設定檔命令的名稱。 |
value |
要使用的設定檔命令值。 |
金鑰儲存類型
除了標準金鑰儲存庫類型(JKS 和 PKCS12)之外,大多數 Java 執行時間都支援其他金鑰儲存庫類型,例如 Windows-ROOT、Windows-My、DKS 以及硬體安全性模組。通常,若要將這些其他金鑰儲存庫類型與 Tomcat 中的 TLS Connector 一起使用
- 將 certificateKeystoreType 和/或 truststoreType Connector 屬性(視情況而定)設定為必要的類型
- 如果需要設定檔,請將 certificateKeystoreFile 和/或 truststoreFile Connector 屬性(視情況而定)設定為指向該檔案
- 如果不需要設定檔,那麼你幾乎一定需要將 certificateKeystoreFile 和/或 truststoreFile Connector 屬性(視情況而定)明確設定為空字串("")
- 如果需要密碼,請將 certificateKeystorePassword 和/或 truststorePassword Connector 屬性 (視情況而定) 設為所需的密碼
- 如果不需要密碼,則幾乎可以確定需要將 certificateKeystorePassword 和/或 truststorePassword Connector 屬性 (視情況而定) 明確設為空字串 ("")
金鑰儲存實作的變化,加上 Tomcat 在背景中執行的金鑰儲存處理,以允許 JSSE 和 OpenSSL 組態樣式之間的互通性,表示有些金鑰儲存可能需要略微不同的組態。隨時可以從 Apache Tomcat 使用者郵件清單 獲得協助。我們的目標是將任何與上述建議不同的金鑰儲存記錄在此處。目前我們沒有發現任何金鑰儲存。
連接器比較
以下是顯示連接器如何不同的簡表。
Java Nio 連接器 NIO |
Java Nio2 連接器 NIO2 |
|
---|---|---|
類別名稱 | Http11NioProtocol |
Http11Nio2Protocol |
Tomcat 版本 | 自 6.0.x 起 | 自 8.0.x 起 |
支援輪詢 | 是 | 是 |
輪詢大小 | maxConnections |
maxConnections |
讀取要求標頭 | 非封鎖 | 非封鎖 |
讀取要求主體 | 封鎖 | 封鎖 |
寫入回應標頭和主體 | 封鎖 | 封鎖 |
等待下一個要求 | 非封鎖 | 非封鎖 |
SSL 支援 | Java SSL 或 OpenSSL | Java SSL 或 OpenSSL |
SSL 交握 | 非封鎖 | 非封鎖 |
最大連線數 | maxConnections |
maxConnections |