HTTP 连接器
目录
简介
HTTP 连接器元素代表一个支持 HTTP/1.1 协议的连接器组件。除了能够执行 Servlet 和 JSP 页面外,它还使 Catalina 能够作为独立的 Web 服务器运行。此组件的特定实例在服务器上的特定 TCP 端口号上侦听连接。一个或多个此类连接器可以配置为单个服务的一部分,每个都转发到相关的引擎以执行请求处理并创建响应。
如果您希望配置用于通过 AJP 协议连接到 Web 服务器的连接器(例如 Apache 1.3 的mod_jk 1.2.x
连接器),请参阅AJP 连接器文档。
每个传入的非异步请求都需要一个线程来处理该请求。如果同时收到的请求多于当前可用请求处理线程所能处理的,则会创建额外的线程,直到达到配置的最大值(maxThreads
属性的值)。如果仍收到更多同时请求,Tomcat 将接受新连接,直到当前连接数达到maxConnections
。连接在连接器创建的服务器套接字内排队,直到有线程可用处理连接。一旦达到maxConnections
,操作系统将对更多连接进行排队。操作系统提供的连接队列的大小可以通过acceptCount
属性控制。如果操作系统队列已满,则后续连接请求可能会被拒绝或超时。
属性
通用属性
所有连接器实现都支持以下属性
属性 | 描述 |
---|---|
allowBackslash |
如果为 如果未指定,将使用默认值 |
allowTrace |
一个布尔值,用于启用或禁用 TRACE HTTP 方法。如果未指定,此属性设置为 false。根据 RFC 7231 第 4.3.8 节,Cookie 和授权标头将从 TRACE 请求的响应中排除。如果您希望包含这些,可以为目标 Servlet 实现 |
asyncTimeout |
异步请求的默认超时时间(毫秒)。如果未指定,此属性设置为 Servlet 规范默认值 30000(30 秒)。 |
discardFacades |
一个布尔值,用于启用或禁用隔离容器内部请求处理对象的 facade 对象的回收。如果设置为 |
enableLookups |
如果希望 |
encodedReverseSolidusHandling |
当设置为 当设置为 如果使用 如果未指定,默认值为 |
encodedSolidusHandling |
当设置为 如果使用 如果未指定,默认值为 |
enforceEncodingInGetWriter |
如果此值为 如果未指定,将使用符合规范的默认值 |
maxCookieCount |
请求允许的最大 Cookie 数量。小于零的值表示无限制。如果未指定,将使用默认值 200。 |
maxParameterCount |
从查询字符串以及(对于 POST 请求)内容类型为 |
maxPartCount |
内容类型为 |
maxPartHeaderSize |
内容类型为 |
maxPostSize |
容器 FORM URL 参数解析将处理的 POST 请求体的最大字节数。通过将此属性设置为小于零的值可以禁用此限制。超过此限制的请求将被拒绝。如果未指定,此属性设置为 2097152 (2 MiB)。 |
maxSavePostSize |
在 FORM 或 CLIENT-CERT 认证期间或 HTTP/1.1 升级期间,容器将保存/缓冲的请求体的最大字节数。对于两种认证类型,请求体将在用户认证之前保存/缓冲。对于 CLIENT-CERT 认证,请求体在 SSL 握手期间进行缓冲,并在处理请求时清空缓冲区。对于 FORM 认证,POST 在用户重定向到登录表单时保存,并保留直到用户成功认证或与认证请求关联的会话过期。对于 HTTP/1.1 升级,请求体在升级过程期间进行缓冲。通过将此属性设置为 -1 可以禁用此限制。将此属性设置为零将禁用在认证和 HTTP/1.1 升级期间保存请求体数据。如果未指定,此属性设置为 4096 (4 千字节)。 |
parseBodyMethods |
一个逗号分隔的 HTTP 方法列表,对于这些方法,使用 |
port |
此连接器将创建服务器套接字并等待传入连接的 TCP 端口号。您的操作系统只允许一个服务器应用程序在特定 IP 地址上侦听特定端口号。如果使用特殊值 0(零),则 Tomcat 将随机选择一个空闲端口用于此连接器。这通常只在嵌入式和测试应用程序中有用。 |
protocol |
设置处理传入流量的协议。默认值为 |
proxyName |
如果此连接器在代理配置中使用,请配置此属性以指定 |
proxyPort |
如果此连接器在代理配置中使用,请配置此属性以指定 |
redirectPort |
如果此连接器支持非 SSL 请求,并且收到的请求的匹配 |
rejectSuspiciousURIs |
如果 URI 与 Servlet 6.0 规范中标识的可疑 URI 模式之一匹配,此连接器是否应拒绝请求?默认值为 |
scheme |
将此属性设置为您希望 |
secure |
如果希望此连接器收到的请求的 |
URIEncoding |
这指定了用于解码 URI 字节的字符编码,在对 URL 进行 %xx 解码之后。默认值为 |
useBodyEncodingForURI |
这指定了是否应将 contentType 中指定的编码用于 URI 查询参数,而不是使用 URIEncoding。此设置是为了与 Tomcat 4.1.x 兼容而存在的,在 Tomcat 4.1.x 中,contentType 中指定的编码或使用 Request.setCharacterEncoding 方法明确设置的编码也用于 URL 中的参数。默认值为 注意: 1) 此设置仅应用于请求的查询字符串。与 |
useIPVHosts |
将此属性设置为 |
xpoweredBy |
将此属性设置为 |
标准实现
除了上面列出的通用连接器属性外,标准 HTTP 连接器(NIO 和 NIO2)都支持以下属性。
属性 | 描述 |
---|---|
acceptCount |
当达到 |
acceptorThreadPriority |
接受者线程的优先级。用于接受新连接的线程。默认值为 |
address |
对于具有多个 IP 地址的服务器,此属性指定将用于在指定端口上侦听的地址。默认情况下,连接器将侦听所有本地地址。除非使用系统属性另行配置 JVM,否则基于 Java 的连接器(NIO、NIO2)在配置为 |
allowedTrailerHeaders |
默认情况下,Tomcat 在处理分块输入时将忽略所有尾部标头。要处理某个标头,必须将其添加到此逗号分隔的标头名称列表中。 |
bindOnInit |
控制连接器使用的套接字何时绑定。如果设置为 |
clientCertProvider |
当客户端证书信息以 |
compressibleMimeType |
该值是一个逗号分隔的 MIME 类型列表,可以对其使用 HTTP 压缩。默认值为 |
compression |
连接器可以使用 HTTP/1.1 GZIP 压缩以节省服务器带宽。参数的可接受值为“off”(禁用压缩)、“on”(允许压缩,这将导致文本数据被压缩)、“force”(在所有情况下强制压缩)或一个数值整数(等效于“on”,但指定在输出被压缩之前的最小数据量)。如果内容长度未知且压缩设置为“on”或更积极,输出也将被压缩。如果未指定,此属性设置为“off”。 注意:使用压缩(节省带宽)和使用 sendfile 功能(节省 CPU 周期)之间存在权衡。如果连接器支持 sendfile 功能(例如 NIO 连接器),则使用 sendfile 将优先于压缩。症状将是大于 48 KiB 的静态文件将未压缩发送。您可以通过设置连接器的 |
compressionMinSize |
如果compression设置为“on”,则此属性可用于指定在输出被压缩之前的最小数据量。如果未指定,此属性默认为“2048”。单位为字节。 |
connectionLinger |
此连接器使用的套接字在关闭时将逗留的秒数。默认值为 |
connectionTimeout |
此连接器在接受连接后,等待请求 URI 行呈现的毫秒数。使用 -1 表示没有(即无限)超时。默认值为 60000(即 60 秒),但请注意 Tomcat 附带的标准 server.xml 将其设置为 20000(即 20 秒)。除非disableUploadTimeout设置为 |
connectionUploadTimeout |
指定数据上传过程中使用的超时时间(毫秒)。如果未指定,默认值为 300000(即 300 秒)。此设置仅在disableUploadTimeout设置为 |
continueResponseTiming |
何时对包含
|
defaultSSLHostConfigName |
如果客户端连接未提供 SNI,或者提供了 SNI 但与任何已配置的SSLHostConfig不匹配,则将用于安全连接的默认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 将为每个请求分配您指定的全部内存。例如,如果您指定 maxHttpRequestHeaderSize 为 1 MB,并且您的应用程序处理 100 个并发请求,您将看到 100 MB 的堆内存被请求头部消耗。 |
maxHttpResponseHeaderSize |
HTTP 响应的响应行和关联头部的最大允许大小,以字节为单位。此值与写入的字节数进行比较,因此包括行终止符和空白符以及状态行、头部名称和头部值。如果未指定,此属性设置为 |
maxKeepAliveRequests |
在服务器关闭连接之前,可以进行管线化的 HTTP 请求的最大数量。将此属性设置为 1 将禁用 HTTP/1.0 keep-alive,以及 HTTP/1.1 keep-alive 和管线化。将其设置为 -1 将允许无限量的管线化或 keep-alive HTTP 请求。如果未指定,此属性设置为 100。 |
maxQueueSize |
(int) 在被拒绝之前,可以排队等待执行的可运行任务的最大数量。默认值为 |
maxSwallowSize |
Tomcat 对于中止上传将吞噬的请求体字节的最大数量(不包括传输编码开销)。中止上传是指 Tomcat 知道请求体将被忽略但客户端仍然发送它的情况。如果 Tomcat 不吞噬请求体,客户端可能无法看到响应。如果未指定,将使用默认值 2097152 (2 MiB)。小于零的值表示不强制执行任何限制。 |
maxThreads |
此连接器将创建的最大请求处理线程数,因此决定了可以处理的最大并发请求数。如果未指定,此属性设置为 200。如果此连接器关联了执行器,则此属性将被忽略,因为连接器将使用执行器而不是内部线程池来执行任务。请注意,如果配置了执行器,此属性的任何设置值都将正确记录,但(例如通过 JMX)将报告为 |
maxTrailerSize |
限制分块 HTTP 请求的最后一个分块中尾随头部的总长度。这必须是一个正整数值。如果未指定,将使用默认值 |
minSpareThreads |
始终保持运行的最小线程数。这包括活动线程和空闲线程。如果未指定,默认使用 |
noCompressionUserAgents |
该值是一个正则表达式(使用 |
processorCache |
协议处理器缓存 Processor 对象以加快性能。此设置决定了这些对象缓存的数量。 |
relaxedPathChars |
HTTP/1.1 规范要求 URI 路径中使用某些字符时进行 %nn 编码。不幸的是,许多用户代理(包括所有主要浏览器)不符合此规范,并以未编码的形式使用这些字符。为防止 Tomcat 拒绝此类请求,此属性可用于指定允许的额外字符。如果未指定,则不允许任何额外字符。该值可以是以下字符的任意组合: |
relaxedQueryChars |
HTTP/1.1 规范要求 URI 查询字符串中使用某些字符时进行 %nn 编码。不幸的是,许多用户代理(包括所有主要浏览器)不符合此规范,并以未编码的形式使用这些字符。为防止 Tomcat 拒绝此类请求,此属性可用于指定允许的额外字符。如果未指定,则不允许任何额外字符。该值可以是以下字符的任意组合: |
restrictedUserAgents |
该值是一个正则表达式(使用 |
server |
覆盖 HTTP 响应的 Server 头部。如果设置,此属性的值将覆盖 Web 应用程序设置的任何 Server 头部。如果未设置,则使用应用程序指定的任何值。如果应用程序未指定值,则不设置 Server 头部。 |
serverRemoveAppProvidedValues |
如果为 |
SSLEnabled |
使用此属性可在连接器上启用 SSL 流量。要开启连接器上的 SSL 握手/加密/解密,请将此值设置为 |
tcpNoDelay |
如果设置为 |
threadPriority |
JVM 中请求处理线程的优先级。默认值为 |
threadsMaxIdleTime |
如果执行器中的线程数多于 |
throwOnFailure |
如果连接器在生命周期转换期间遇到异常,该异常是应重新抛出还是记录?如果未指定,将使用默认值 |
useAsyncIO |
(bool) 使用此属性启用或禁用异步 IO API 的使用。默认值为 |
useKeepAliveResponseHeader |
(bool) 使用此属性启用或禁用添加此互联网草案中描述的 |
useVirtualThreads |
(bool) 使用此属性启用或禁用内部执行器使用虚拟线程。如果此连接器关联了执行器,则此属性将被忽略。默认值为 |
Java TCP 套接字属性
NIO 和 NIO2 实现除了支持上述通用连接器和 HTTP 属性外,还支持以下 Java TCP 套接字属性。
属性 | 描述 |
---|---|
socket.rxBufSize |
(int) 套接字接收缓冲区 (SO_RCVBUF) 大小,以字节为单位。如果未设置,则使用 JVM 默认值。 |
socket.txBufSize |
(int) 套接字发送缓冲区 (SO_SNDBUF) 大小,以字节为单位。如果未设置,则使用 JVM 默认值。如果显式设置此值,应谨慎。在某些 JVM 上,当值小于约 8k 时,观察到非常差的性能。 |
socket.tcpNoDelay |
(bool) 这等同于标准属性tcpNoDelay。 |
socket.soKeepAlive |
(bool) 套接字保持活动设置 (SO_KEEPALIVE) 的布尔值。如果未设置,则使用 JVM 默认值。 |
socket.ooBInline |
(bool) 套接字 OOBINLINE 设置的布尔值。如果未设置,则使用 JVM 默认值。 |
socket.soReuseAddress |
(bool) 套接字重用地址选项 (SO_REUSEADDR) 的布尔值。如果未设置,则使用 JVM 默认值。 |
socket.soLingerOn |
(bool) 套接字 SO_LINGER 选项的布尔值。标准属性connectionLinger的值 >=0 等效于将其设置为 |
socket.soLingerTime |
(int) 套接字 SO_LINGER 选项的值,以秒为单位。这等效于标准属性connectionLinger。此属性和 |
socket.soTimeout |
这等效于标准属性connectionTimeout。 |
socket.performanceConnectionTime |
(int) 性能设置的第一个值。参见套接字性能选项。所有三个性能属性都必须设置,否则 JVM 默认值将用于所有三个属性。 |
socket.performanceLatency |
(int) 性能设置的第二个值。参见套接字性能选项。所有三个性能属性都必须设置,否则 JVM 默认值将用于所有三个属性。 |
socket.performanceBandwidth |
(int) 性能设置的第三个值。参见套接字性能选项。所有三个性能属性都必须设置,否则 JVM 默认值将用于所有三个属性。 |
socket.unlockTimeout |
(int) 套接字解锁的超时时间。当连接器停止时,它将尝试通过打开一个到自身的连接器来释放接受者线程。默认值为 |
NIO 特有配置
以下属性是 NIO 连接器特有的。
属性 | 描述 |
---|---|
pollerThreadPriority |
(int) 轮询器线程的优先级。默认值为 |
selectorTimeout |
(int) 轮询器在 select() 上超时的时间(毫秒)。此值很重要,因为连接清理是在同一线程上完成的,所以不要将此值设置得过高。默认值为 |
useSendfile |
(bool) 使用此属性启用或禁用 sendfile 功能。默认值为 |
socket.directBuffer |
(bool) 布尔值,是否使用直接 ByteBuffer 或 Java 映射 ByteBuffer。如果为 |
socket.directSslBuffer |
(bool) 布尔值,SSL 缓冲区是否使用直接 ByteBuffer 或 Java 映射 ByteBuffer。如果为 |
socket.appReadBufSize |
(int) 在 Tomcat 中打开的每个连接都关联一个读取 ByteBuffer。此属性控制此缓冲区的大小。默认情况下,此读取缓冲区大小为 |
socket.appWriteBufSize |
(int) 在 Tomcat 中打开的每个连接都关联一个写入 ByteBuffer。此属性控制此缓冲区的大小。默认情况下,此写入缓冲区大小为 |
socket.bufferPool |
(int) NIOx 连接器使用一个名为 NioXChannel 的类,它包含与套接字链接的元素。为了减少垃圾回收,NIOx 连接器缓存这些通道对象。此值指定此缓存的大小。默认值为 |
socket.bufferPoolSize |
(int) NioXChannel 池也可以基于大小,而不是基于使用的对象。如果 bufferPool 不为 -2,则此值将不使用。 |
socket.processorCache |
(int) Tomcat 将缓存 SocketProcessor 对象以减少垃圾回收。整数值指定缓存中最多保留的对象数量。默认值为 |
socket.eventCache |
(int) Tomcat 将缓存 PollerEvent 对象以减少垃圾回收。整数值指定缓存中最多保留的对象数量。默认值为 |
unixDomainSocketPath |
在支持的情况下,此连接器将创建并等待传入连接的 Unix 域套接字的路径。指定此属性时,可以省略原本强制的 |
unixDomainSocketPathPermissions |
在支持的情况下,将应用于上述 |
useInheritedChannel |
(bool) 定义此连接器是否应继承 inetd/systemd 网络套接字。只有一个连接器可以继承网络套接字。此选项可用于在向 systemd 超级守护进程的端口发出连接请求后自动启动 Tomcat。默认值为 |
NIO2 特有配置
以下属性是 NIO2 连接器特有的。
属性 | 描述 |
---|---|
useSendfile |
(bool) 使用此属性启用或禁用 sendfile 功能。默认值为 |
socket.directBuffer |
(bool) 布尔值,是否使用直接 ByteBuffer 或 Java 映射 ByteBuffer。如果为 |
socket.directSslBuffer |
(bool) 布尔值,SSL 缓冲区是否使用直接 ByteBuffer 或 Java 映射 ByteBuffer。如果为 |
socket.appReadBufSize |
(int) 在 Tomcat 中打开的每个连接都关联一个读取 ByteBuffer。此属性控制此缓冲区的大小。默认情况下,此读取缓冲区大小为 |
socket.appWriteBufSize |
(int) 在 Tomcat 中打开的每个连接都关联一个写入 ByteBuffer。此属性控制此缓冲区的大小。默认情况下,此写入缓冲区大小为 |
socket.bufferPool |
(int) NIO2 连接器使用一个名为 Nio2Channel 的类,它包含与套接字链接的元素。为了减少垃圾回收,NIO2 连接器缓存这些通道对象。此值指定此缓存的大小。默认值为 |
socket.processorCache |
(int) Tomcat 将缓存 SocketProcessor 对象以减少垃圾回收。整数值指定缓存中最多保留的对象数量。默认值为 |
嵌套组件
Tomcat 支持服务器名称指示 (SNI)。这允许将多个 SSL 配置与单个安全连接器关联起来,其中任何给定连接使用的配置由客户端请求的主机名决定。为便于此操作,添加了SSLHostConfig元素,可用于定义其中一种配置。任意数量的SSLHostConfig都可以嵌套在连接器中。同时,还增加了对将多个证书与单个SSLHostConfig关联的支持。因此,每个 SSL 证书都在SSLHostConfig中的Certificate元素中配置。有关更多信息,请参阅下面的 SSL 支持部分。
当 OpenSSL 提供 TLS 实现时,一个或多个OpenSSLConfCmd元素可以嵌套在OpenSSLConf元素中,以通过 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 keep-alive。
RFC 7230 要求 HTTP 服务器始终以其声称支持的最高 HTTP 版本开始其响应。因此,此连接器将始终在其响应开头返回HTTP/1.1
。
HTTP/2 支持
HTTP/2 支持包括 TLS (h2)、通过 HTTP 升级的非 TLS (h2c) 和直接 HTTP/2 (h2c) 连接。要为 HTTP 连接器启用 HTTP/2 支持,必须在连接器内嵌套以下UpgradeProtocol元素,其className属性为org.apache.coyote.http2.Http2Protocol
。
<Connector ... >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
还有其他配置属性可用。有关详细信息,请参阅HTTP/2 升级协议文档。
代理支持
当 Tomcat 在代理服务器后面运行时,可以使用proxyName
和proxyPort
属性。这些属性修改返回给调用request.getServerName()
和request.getServerPort()
方法的 Web 应用程序的值,这些方法通常用于构建重定向的绝对 URL。如果不配置这些属性,返回的值将反映从代理服务器接收连接的服务器名称和端口,而不是客户端将原始请求指向的服务器名称和端口。
有关更多信息,请参阅代理支持指南。
Unix 域套接字支持
当使用unixDomainSocketPath
属性时,支持 Unix 域套接字的连接器将绑定到给定路径上的套接字。
对于 Java 16 及更高版本的用户,NIO 连接器中提供了支持。
套接字路径以所有用户的读写权限创建。为了保护此套接字,请将其放置在具有适当配置权限的目录中,以根据需要限制访问。或者,在支持 posix 权限的平台上,可以直接使用unixDomainSocketPathPermissions
选项设置套接字上的权限。
Tomcat 将在服务器关闭时自动删除套接字。如果套接字已存在,启动将失败。管理员必须小心,在确认套接字未被现有 Tomcat 进程使用后,再删除该套接字。
Unix 域套接字可以使用curl
命令行客户端的--unix-socket
选项以及 Apache HTTP 服务器的mod_proxy
模块中的 Unix 域套接字支持来访问。
SSL 支持
通过将SSLEnabled
属性设置为true
,您可以为此连接器的特定实例启用 SSL 支持。
您还需要将scheme
和secure
属性分别设置为https
和true
,以便向 Servlet 传递正确的信息。
NIO 和 NIO2 连接器使用 JSSE Java SSL 实现或 OpenSSL 实现。在可能的情况下,JSSE 和 OpenSSL 都使用通用的配置属性。
每个安全连接器必须至少定义一个SSLHostConfig。SSLHostConfig元素的名称必须是唯一的,并且其中一个必须与连接器的defaultSSLHostConfigName
属性匹配。
每个SSLHostConfig又必须至少定义一个Certificate。Certificate的类型必须是唯一的。
除了 Servlet 规范第 3.10 节中定义的标准 TLS 相关请求属性外,Tomcat 还支持许多额外的 TLS 相关属性。完整列表可在SSLSupport Javadoc中找到。
有关更多信息,请参阅SSL 配置指南。
SSL 支持 - SSLHostConfig
属性 | 描述 |
---|---|
certificateRevocationListFile |
包含证书颁发机构的合并证书吊销列表的文件名。格式为 PEM 编码。如果未定义,客户端证书将不会对照证书吊销列表进行检查(除非使用基于 OpenSSL 的连接器且定义了certificateRevocationListPath)。相对路径将相对于 |
certificateRevocationListPath |
仅限 OpenSSL。 包含证书颁发机构的证书吊销列表的目录名称。格式为 PEM 编码。相对路径将相对于 |
certificateVerification |
如果希望 SSL 堆栈在接受连接之前要求客户端提供有效的证书链,请设置为 |
certificateVerificationDepth |
验证客户端证书时允许的最大中间证书数量。如果未指定,将使用默认值 10。 |
caCertificateFile |
仅限 OpenSSL。 包含受信任证书颁发机构的合并证书的文件名。格式为 PEM 编码。 |
caCertificatePath |
仅限 OpenSSL。 包含受信任证书颁发机构的证书的目录名称。格式为 PEM 编码。 |
ciphers |
使用 OpenSSL 语法启用密码。 (有关支持的密码列表和语法,请参阅 OpenSSL 文档)。或者,可以使用标准 OpenSSL 密码名称或标准 JSSE 密码名称的逗号分隔列表。 不同版本的 OpenSSL 可能会以不同方式解释相同的密码字符串。例如,在 OpenSSL 3.2 中, 将只使用 SSL 实现支持的密码。从非默认密码字符串派生出的列表中,任何 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 实现更优化(取决于所使用的处理器),并且可以与许多商业加速组件互补。
启用 OpenSSL FFM 支持后,连接器将默认通过 JSSE 使用 OpenSSL,这与前者等效,但使用 Java 22 中的 Java FFM API 访问 OpenSSL。
以下 NIO 和 NIO2 SSL 配置属性并非特定于虚拟主机,因此必须在连接器上进行配置。
属性 | 描述 |
---|---|
sniParseLimit |
为了实现 SNI 支持,Tomcat 必须解析在新 TLS 连接上接收到的第一个 TLS 消息(客户端 hello)以提取请求的服务器名称。该消息需要被缓冲,以便随后可以将其传递给 JSSE 实现进行正常的 TLS 处理。理论上,此第一个消息可能非常大,但实际上通常只有几百字节。此属性设置 Tomcat 将缓冲的最大消息大小。如果消息超出此大小,则连接将配置为客户端未指示服务器名称。如果未指定,将使用默认值 |
sslImplementationName |
要使用的 SSL 实现的类名。如果未指定且未安装 tomcat-native 库,将使用默认值 |
SSL 支持 - OpenSSL 的 SSL_CONF API
当 OpenSSL 提供 TLS 实现时,可以在 OpenSSLConf 元素内部嵌套一个或多个 OpenSSLConfCmd 元素,通过 OpenSSL 的 SSL_CONF
API 配置 OpenSSL。单个 OpenSSLConf 元素可以嵌套在 SSLHostConfig 元素中。
可用的配置文件命令集取决于所使用的 OpenSSL 版本。有关支持的命令名称和值的列表,请参阅 OpenSSL 的 SSL_CONF_cmd(3) 手册页中的“支持的配置文件命令”部分。其中一些配置文件命令可以用作 SSLHostConfig 属性的替代方案。建议仅在无法使用 SSLHostConfig 属性配置功能时才使用配置文件命令。
OpenSSLConf 元素不支持任何属性。
OpenSSLConfCmd 元素支持以下属性。
属性 | 描述 |
---|---|
name |
配置文件命令的名称。 |
value |
配置文件命令要使用的值。 |
密钥库类型
除了标准密钥库类型(JKS 和 PKCS12)之外,大多数 Java 运行时还支持额外的密钥库类型,例如 Windows-ROOT、Windows-My、DKS 以及硬件安全模块。通常,要在 Tomcat 中将这些额外的密钥库类型与 TLS 连接器一起使用:
- 将 certificateKeystoreType 和/或 truststoreType 连接器属性(酌情)设置为必要的类型
- 如果需要配置文件,将 certificateKeystoreFile 和/或 truststoreFile 连接器属性(酌情)设置为指向该文件
- 如果不需要配置文件,那么您几乎肯定需要将 certificateKeystoreFile 和/或 truststoreFile 连接器属性(酌情)显式设置为空字符串("")
- 如果需要密码,将 certificateKeystorePassword 和/或 truststorePassword 连接器属性(酌情)设置为所需的密码
- 如果不需要密码,那么您几乎肯定需要将 certificateKeystorePassword 和/或 truststorePassword 连接器属性(酌情)显式设置为空字符串("")
密钥库实现的差异,加上 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 |