本主题说明如何配置通过 HTTP(包括 HTTPS)发送和接收消息的消息代理。
版本兼容性
在 Virtualize 或 SOAtest 9.10.x 及更高版本录制的 HTTP 通讯报文文件不能用于 9.9.x 及更早版本。
章节目录:
设置基本的 HTTP 连接选项要求有目标服务的主机、端口和路径。使用通常用于直接向服务发送消息的设置。
连接设置
要指定基本的 HTTP 反向代理连接选项,请在代理设置连接选项卡中设置以下服务和监听详细信息。
代理设置(传入)
这些设置指定来自客户端的消息应连接到的位置,以便与被测应用程序进行通信。
反向代理 | 您可以从菜单中选择创建代理时定义的反向代理 HTTP 监听器(请参阅创建代理),也可以使用默认监听器。 您还可以在此对话框中添加反向代理 HTTP 监听器:
|
---|---|
代理监听路径 | 启用代理应该监听传入连接的路径。如需监听所有路径,请从下拉菜单中选择[全部]。 任何两个消息代理的 HTTP 代理连接都不能具有相同的代理路径或与现有虚拟资产 HTTP 路径相匹配的路径。 |
代理 URL | 显示应提供给 AUT 的 URL。更多信息,请参阅将 AUT 指向代理。 |
主要连接(传出)和次要连接(传出)
服务 URL | 包含目标应用程序的完整 URL(包括服务主机,服务端口和转发路径)。您可以在此处输入完整的 URL 并/或在以下字段中编辑特定组件。一个区域的更新将传播到另一个区域(例如,如果您修改了 URL 中的端口,服务端口字段中的值将自动更新)。 |
---|---|
服务主机 | 输入服务所在机器的主机名。这是代理将发送消息的机器。 如果希望代理转发到本地服务器上的虚拟资产而不使用 HTTP 连接,请输入 host.virt.internal、localhost 或 127.0.0.1,而不是实际主机名。使用 localhost 或 127.0.0.1 时,服务端口必须与 Virtualize 部署的端口一致;使用 host.virt.internal 时,则不使用该服务端口。例如,部署在 |
服务端口 | 输入服务正在监听的端口。这是代理将发送消息的端口。 |
服务转发路径 | (可选项)输入代理应该其接收到的消息转发到的路径。如果为空,则默认为代理监听路径字段中的值。 如果 HTTP 代理向 localhost 发送消息,则必须输入服务转发路径,因为代理不允许转发到代理本身。 如果服务转发路径发送重定向,代理将跟随重定向并进行响应。它不会将重定向传递回客户端。 |
选项
模式:当存在主要连接和次要连接时,您可以设置活动转发连接。例如,在录制会话期间,消息代理可能转发到实时服务作为主要连接,并回退到虚拟服务作为次要连接。在这种情况下,可以将 HTTP 模式设置为主要并启用所选模式故障时使用其他连接。
完成录制并生成新的虚拟资产后,您可能想要重新配置代理,使其优先转发到虚拟服务,并在发生故障时回退到实时服务。右键点击代理并将 HTTP 模式切换为“次要”,即可快速应用这一更改。运行时将对故障转移进行相应调整。
所选模式故障时使用其他连接:如果想在活动连接(由上面选择的模式决定)故障时将通讯报文重定向到备用代理端点,请启用此选项。如果响应码为 400 或更高级别,则该连接被视为“失败”。
绕过代理故障转移
通过启用跳过消息代理故障转移选项,可将消息响应器配置为绕过内部路由消息的代理故障转移。
如果未启用此选项,将使用活动连接进行录制。
如果启用了该选项,请从录制菜单选择录制选项:
- 两种连接:录制主要和次要连接的通讯报文。活动连接的错误消息不会被录制;相反,这些消息将被发送到备用连接并录制响应。次要连接报告的错误将被录制。
- 仅限主要连接:录制活动连接的通讯报文。不录制错误。
- 仅限次要连接:录制备用连接的通讯报文,包括错误。
安全选项卡设置
只有当您使用的服务使用 SSL 时才需要完成服务 SSL 部分。
如果正在虚拟化的服务和/或被测应用程序使用 SSL 和/或其他身份验证(basic/digest、Kerberos、NTLM),则可能需要其他配置。有关在这些字段正下方填写服务 SSL 字段的详情,请参阅Security Configuration。
代理服务器选项卡设置
您可以在此选项卡中为消息代理服务器指定服务器,可以配置其他代理服务器来收发来自不同消息代理的通讯报文。此配置可控制代理服务器处理被测应用程序和特定消息代理之间的通讯报文。
要在此级别指定代理设置,请在代理的代理服务器选项卡中提供适当的详细信息。
不支持 SSL。
服务转发路径和代理监听路径
在最简单的情况下,您可以将代理监听路径设置为服务的路径并将服务转发路径保留为空。使用此配置,代理将把它在该路径上所接收的所有消息自动转发到服务主机和服务端口上的相同路径。
如果需要代理监听与服务不同的路径,则将服务转发路径设置为已接收消息的实际发送路径。代理将把路径和任何查询部分转发到目标服务中。
如果代理监听路径和服务转发路径不同,则请求中代理监听路径之后的任何段都将附加到转发的请求中。代理监听路径本质上被服务转发路径替换,以便将整个路径(由代理接收)发送到服务。
在路径中使用通配符
您可以使用通配符指定动态路径段。例如,将路径配置为 /path/*/service
将使以下路径可以转到同一代理:
/path/1/service
/path/2/service
通配符可用于替换整个路径段。例如:
/path/*/service
— 有效/path/1*2/service
— 无效
通配符只能用于路径的一部分。配置为 /path/*/service
的路径不会匹配 /path/1/2/service
。如果希望路径既匹配 /path/1/2/service
又匹配 /path/3/4/service
,请使用模式 /path/*/*/service
。
您可以将监听路径中的动态段用作转发路径的一部分。有两种方法可以做到这一点:
- 如果要将通讯报文转发到接收请求的路径,请将转发路径留空。
如果转发路径不同,并且需要使用动态值,请使用环境变量语法对其进行配置。例如:
listen path: /path/*/service
forward path: /asset/path/${1}/service
可以使用环境变量语法访问由通配符表示的动态监听路径段。通配符的出现用作变量名;换句话说,第一个出现的通配符是 ${1},第二个是 ${2},第三个是 ${3},依此类推。在下面的示例中,${2} 表示第二个出现的通配符(在请求路径中为“bank”):
监听路径:/path/*/service/*/account
forward path: /asset/path/${2}/service/${1}/account
请求路径:/path/1/service/bank/account
forward path: /asset/path/bank/service/1/account
头部变更
在大多数情况下,代理会将所有头部直接传递到目标服务或从目标服务传递。某些内容长度相关的头部可能会更改,以适应代理服务器的工作方式。例如,代理服务器不支持使用“分块”传输编码进行响应,并且将替换发送的“主机”头部以匹配其自己的主机名(但是,它确实支持从目标服务接收分块的请求和分块的响应)。
设置目标服务
代理可以使用服务器上的虚拟或测试资产作为其目标服务。
- 将服务主机和端口设置为部署虚拟资产的 Virtualize 服务器的主机和端口。如果希望代理转发到本地服务器上的虚拟资产而不使用 HTTP 连接,请输入 host.virt.internal、localhost 或 127.0.0.1,而不是实际主机名。使用 localhost 或 127.0.0.1 时,服务端口必须与 Virtualize 部署的端口一致;使用 host.virt.internal 时,则不使用该服务端口。
- 将代理连接的服务转发路径设置为虚拟资产的路径(可在 HTTP 端点下的传输> HTTP 选项卡中找到)。
分块/分组行为
代理支持从目标服务接收分块的请求和分块的响应。如果服务响应使用 HTTP 分块,则代理将对响应进行分组,然后将其返回给原始 caller/AUT。
其他 HTTP 消息代理配置
可以创建一个属性文件来配置其他反向代理 HTTP 监听器设置。通过属性文件,可以调整反向代理 HTTP 监听器的性能,并指定其他 SSL 设置。
- 创建纯文本文件,并指定要设置的属性(请参阅Reverse Proxy HTTP Listener Message Proxy Performance Properties和Reverse Proxy HTTP Listener Message Proxy SSL Properties)。
将文件保存到工作空间的 VirtualAssets 或 TestAssets 目录中,并命名为“embeddedServer.properties”。
每次启用带有反向代理 HTTP 监听器的代理时,都会读取该文件。
反向代理 HTTP 监听器属性
embedded.connector.maxHttpHeaderSize | 指定最大的请求和响应 HTTP 头大小(字节)。如果没有指定,请将该属性设置为 8192 (8 KB)。 |
---|---|
embedded.connector.parseBodyMethods | 指定 HTTP 方法,以便在解析 |
embedded.connector.relaxedPathChars | 以未编码形式指定 URI 路径中应允许的字符。该值可以是以下字符的任意组合:
值中存在的任何其他字符将被忽略。如果不包括此属性,则 Tomcat 将在 URI 路径中拒绝上述未编码形式的字符。 更多信息,请参阅 Tomcat 文档:https://tomcat.apache.org/tomcat-8.5-doc/config/http.html。 |
embedded.connector.relaxedQueryChars | 以未编码形式指定 URI 查询中应允许的字符。该值可以是以下字符的任意组合:
值中存在的任何其他字符将被忽略。如果不包括此属性,则 Tomcat 将在 URI 查询中拒绝上述未编码形式的字符。 更多信息,请参阅 Tomcat 文档:https://tomcat.apache.org/tomcat-8.5-doc/config/http.html。 |
反向代理 HTTP 监听器消息代理性能属性
所有属性都是可选的,非整数值将被忽略。
embedded.connector.maxThreads | 指定连接器应创建的请求处理线程的最大数量。此属性确定可以处理的同步请求的最大数。默认为 200。 |
---|---|
embedded.connector.minThreads | 指定应始终运行的最小线程数。默认为 |
embedded.connector.acceptors | 指定应用于接受连接的线程数。在具有多个 CPU 的计算机上或使用多个非活动的连接时,请增加此值。大多数情况下,1 或 2 便足够了。默认为 1。 |
embedded.connector.idleTimeout | 指定连接器在关闭连接之前应等待另一个 HTTP 请求的毫秒数。指定为 -1 表示允许连接器无限期地等待。默认为 use connectTimeout。 |
embedded.connector.soLingerTime | 指定关闭套接字时,连接器使用的套接字应延迟的毫秒数。默认情况下,禁用延迟。 |
embedded.connector.acceptorPriorityDelta | 指定用于接受新连接的接受线程的优先级。更多详情,请参阅 java.lang.Thread JavaDoc。默认为 5。 |
embedded.connector.acceptQueueSize | 当所有可能的请求处理线程都在使用时,为传入的连接请求指定最大队列长度。队列已满时收到的任何请求都将被拒绝。默认为 100。 |
embedded.connector.connectTimeout | 指定连接器在接受连接后应等待多少毫秒以等待请求 URI 行出现。输入 -1 表示允许连接器无限期地等待。默认为 60000。 |
反向代理 HTTP 监听器消息代理 SSL 属性
embedded.ssl.includeProtocols | 支持 HTTPS 连接的以逗号分隔的 SSL 协议列表。如果指定,JVM 中的 SSL 实现将仅支持列表中的协议。如果没有设置该属性,则使用 JVM 支持的 协议(默认情况下,如果 JVM 启用它们中的一个或两个,则排除 SSLv2 和 SSLv3)。 |
---|---|
embedded.ssl.includeCipherSuites | 支持 HTTPS 连接的以逗号分隔的加密密码列表。使用 JSSE 密码命名规范来指定密码。如果设置了该属性,则 SSL 实现将仅支持列表中的密码。如果未设置该属性,则 JVM 默认的密码套件(除了不被认为安全的套件之外)都将受到支持。因此,默认情况下,老版本的 JVM 只能使用非常有限的一组密码。 |
embedded.ssl.useCipherSuitesOrder | 设置为 |
embedded.ssl.maxCertPathLength | 验证客户端证书时允许的中间证书的最大数量。默认为 5。 |
embedded.ssl.crlPath | 设置包含用于验证客户端证书的证书吊销列表的文件的路径。如果未定义,则不会根据证书吊销列表检查客户端证书。 |
embedded.ssl.keyManagerAlgorithm | 设置要使用的证书编码算法。默认情况下,使用 KeyManagerFactory.getDefaultAlgorithm() ,它将返回 Sun JVM 的 SunX509 。IBM JVMs 返回 IbmX509 。 |
embedded.ssl.truststoreAlgorithm | 设置用于信任库的算法。如果未定义,则使用 javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm() 返回的默认值。 |
embedded.ssl.useKeyManagerAlgorithmForTruststore | 如果设置为 true ,则密钥管理器算法用于信任库算法。这优先于 embedded.ssl.truststoreAlgorithm 属性。默认为 False。 |
示例:向服务发送通讯报文
假设我们要为通常在 http://example.parasoft.com:9080/BookStore
访问的服务创建一条消息。我们可以使用以下设置创建 HTTP 反向代理:
- 代理监听路径:/BookStore
- 服务主机:example.parasoft.com
- 服务端口:9080
- 服务转发路径:[empty]
此配置将监听 /BookStore
,并将所有通讯报文转发到实际的书店服务。
如果我们想在服务路径之外的路径上进行监听,则需要更改代理的配置,如下所示:
- 服务转发路径:/BookStore
- 代理监听路径:/SomeOtherPath
这会将通讯报文从代理上的 /SomeOtherPath
路由到实际的书店服务。
在这两种情况下,发送到这些路径(包括子路径)的所有通讯报文都发送到服务。在第二个示例中,发送到 /SomeOtherPath/SubPath
的通讯报文将发送到 /BookStore/SubPath
。由于查询被保留,所有 /SomeOtherPath?param=value
将发送到 /BookStore?param=value
。
将请求转发到标头名称(区分大小写)的服务
如果使用桌面服务器,则消息代理头部为小写,并且在请求转发到区分大小写的 HTTP 头名称的服务时可能无法正常运行。
您可以在 /VirtualAssets/
目录下创建一个 _global.headers 文件,并添加使用要传递的特定大写的头部。右键点击 UI 中的服务器,然后重新部署所有虚拟资产,以开始在环境中使用此文件。
您还可以解决特定消息代理的 HTTP 头大写问题。您可以在 /VirtualAssets/
目录下创建一个 <PROXY-NAME>.headers 文件,并添加使用要为特定代理传递的特定大写的头部。此文件将应用于特定代理并覆盖全局文件。右键点击 UI 中的服务器,然后重新部署所有虚拟资产,以开始在环境中使用此文件。
示例头文件
X-AUTHORIZATION ANOTHER-HEADER HEADER3
示例:向虚拟资产发送通讯报文
代理还可以向虚拟资产发送通讯报文。在这种情况下,请输入 Virtualize 服务器的主机和端口信息,就像它只是另一个服务一样。
例如,向远程服务器上的虚拟资产发送通讯报文,您可以使用:
- 代理监听路径:/proxyPath
- 服务主机: server.parasoft.com
- 服务端口:9080
- 服务转发路径:/assetPath
要使用 HTTP Listener 向本地服务器上的虚拟资产发送通讯报文,可以使用:
- 反向代理:7070
- 服务主机:[Virtualize]
要向本地服务器上没有 HTTP Listener 的虚拟资产发送通讯报文,可以使用:
- 代理监听路径:/proxyPath
- 服务主机:[Virtualize]
- 服务转发路径:/assetPath
HTTP 反向代理不区分虚拟资产和实际服务。两者都以相同的方式配置。但是,如果默认 HTTP 反向代理(没有 HTTP Listener)发送到 [Virtualize]
或 localhost
,则必须指定服务转发路径,因为该代理不允许转发到代理本身。
将请求转发到标头名称(区分大小写)的服务
如果使用 Virtualize 桌面服务器,则消息代理标头将小写,并且在请求转发到区分大小写的 HTTP 标头名称的服务时可能无法正常运行。详情请参阅Forwarding Requests to Services that Require Case-sensitive Header Names。
安全配置
安全配置有两个方面:
- 如果要转发通讯报文的服务使用 SSL 和/或访问身份验证,则您需要执行代理级配置(来自代理的 UI 控件)。
- 如果 AUT 使用 SSL 和/或访问身份验证,则您需要执行服务级配置(针对基于 Tomcat 的服务器)。
根据您的配置,您可以配置安全设置或两个都配置。
代理级配置
如果转发通讯报文的服务使用 SSL 和/或访问身份验证,则代理级安全配置包括:
SSL
对于 SSL,需要其他设置。在配置面板的下半部分,您需要指定是否:
- 启用自签名证书的信任。
- 启用所有证书的信任。
- 设置信任库以验证服务器证书。
此外,您需要提供使用特定密钥库和证书所需的信息,以便 Parasoft 可以确定要向服务器出示哪个证书(例如,对于双向 SSL)。
SSL 配置面板字段
选项 | 说明 |
---|---|
连接服务时使用 SSL | 启用 SSL。 |
信任所有服务器证书 | 如果启用,将接受任何证书,不执行任何验证。 当消息代理与服务建立连接时,此选项将禁用信任验证;它使其接受与服务提供的任何证书的连接。 |
接受自签名证书 | 如果启用,只要验证方法 java.security.cert.X509Certificate.checkValidity() 返回 true,就会接受证书,从而有效地检查当前日期和时间是否在证书中给出的有效期内。不会计算证书信任路径,并且不会应用提供的信任库配置。 此选项确定服务提供且未由受信任的证书颁发机构签名的证书是否受信任。一般来说,如果证书信任不是部署 SOAtest 或 Virtualize环境的重点,则应启用此选项。 |
请注意,只有在信任所有服务器证书和接受自签名证书均禁用时,信任库配置(如下所述)才适用。
密钥库配置面板字段
选项 | 说明 |
---|---|
密钥库文件 | 指定密钥库文件的路径。密钥库确定消息代理在 SSL 握手期间向服务显示的证书和密钥。 |
密钥库密码 | 指定用于访问密钥库的密码。 |
密钥库类型 | 指定密钥库的类型。 |
证书 | 指定要用于对服务器进行身份验证时使用的证书的别名。 |
填写完密钥库详细信息后,请点击加载,从证书菜单中选择展示给服务器的证书别名。如果证书菜单在您点击加载后没有被填充,则您可能输入了错误的密码或密钥库类型。
信任库配置面板字段
这些字段仅在信任所有和接受自签名证书(如上所述)均禁用时才适用。
选项 | 说明 |
---|---|
密钥库文件 | 指定信任库文件的路径。信任库确定消息代理在与服务握手时应信任的证书。如果服务提供此库中未包含的证书,则连接将被拒绝。如果未提供信任库,将使用默认的 JRE 信任库。 此选项仅在信任所有服务器证书禁用时才适用。 |
密钥库密码 | 指定用于访问信任库的密码。 |
密钥库类型 | 指定信任库的类型。 |
MTLM 设置面板字段
选项 | 说明 |
---|---|
使用 NTLM | 指定服务是否需要 NTLM 身份验证。 |
用户名 | 指定用于 NTLM 身份验证的用户名。 |
密码 | 指定用于 NTLM 身份验证的密码。 |
Kerberos 面板字段
选项 | 说明 |
---|---|
Kerberos 服务主体 | 指定服务主体以对请求进行身份验证。 |
Basic/Digest 身份验证
如果被测应用程序提供 Basic 和 Digest 身份验证凭据作为请求的一部分,并将它们作为 HTTP 头的一部分传输,则代理会将它们传递给未修改的服务(就像它处理其他 HTTP 头一样)。
NTLM 身份验证
如果您的服务需要 NTLM 身份验证,请提供 NTLM 部分中的用户名/密码。
Kerberos 身份验证
如果您的服务需要 Kerberos 身份验证,请在身份验证部分设置 Kerberos 服务主体。
服务级配置
如果 AUT 使用 SSL 和/或访问身份验证,则服务器级安全配置可能涉及:
- Configuring the Virtualize Server
- Using NTLM with WAFFLE
- Using Unsupported Configurations (Kerberos with WAFFLE, JAAS)
配置 SOAtest 和 Virtualize 服务器
您可以更改默认端口号(9080)、启用 SSL 并配置其他服务器设置。详情请参阅服务器配置。
使用具有 WAFFLE 的 NTLM
要将第三方库 WAFFLE 用于 NTLM:
- 请将以下 jar 文件拷贝到 tomcat 的
lib
目录下:jna.jar、platform.jar、wafflejna.jar。 在
tomcat/conf/
目录中的 server.xml 文件中添加以下内容。<Context> <Valve className="waffle.apache.NegotiateAuthenticator" principalFormat="fqn" roleFormat="both"/> <Realm className="waffle.apache.WindowsRealm" /> </Context>
文件 server.xml 在哪里?
如果安装了 SOAtest,但没有安装 Virtualize,请执行以下操作:启动 SOAtest,确保至少创建了一个响应器,然后修改
<INSTALL-DIR>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/tomcat/conf/
中的 server.xml 文件。如果安装了 Virtualize,但没有安装 SOAtest,请执行以下操作:启动 Virtualize,确保至少创建了一个响应器,然后修改
<INSTALL-DIR>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/tomcat/conf/
中的 server.xml 文件。如果既安装了 Virtualize,也安装了 SOAtest,请执行以下操作:启动 Virtualize,确保至少创建了一个响应器,然后修改
<INSTALL-DIR>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/tomcat/conf/
中的 server.xml 文件。在
tomcat/conf/
目录中的 web.xml 文件中添加以下内容。<security-role> <role-name>Everyone</role-name> </security-role> <security-constraint> <display-name>Waffle Security Constraint</display-name> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>Everyone</role-name> </auth-constraint> </security-constraint>
- 重启服务器。
更多详情,请参阅单点登录:Tomcat Negotiate Authenticator (Kerberos + NTLM) w/ Waffle 教程和 WAFFLE 主页。
使用不支持的配置(具有 WAFFLE、JAAS 的 Kerberos)
WAFFLE 包括对 Kerberos 身份验证的支持,请参阅 WAFFLE 主页以获得指导和支持。
JAAS 是配置基于 Tomcat 的 Virtualize 服务器以执行 Kerberos 身份验证的另一个选项。有关如何使用 JAAS 的参考说明,请参阅 Tomcat。