本主题解释了如何配置通过 HTTP (包括 HTTPS)发送和接收消息的消息代理。 

版本兼容性

Virtualize 9.10.x 中记录的 HTTP 通讯报文文件在 Parasoft Virtualize 9.9.x 及更早版本上无法使用。 

在本章节中: 

设置基本 HTTP 连接选项之前,需要知道要为其创建代理的服务器的主机、端口和路径。这些设置,通常直接用来于向服务发送消息。 

连接设置

若要指定基本 HTTP 连接选项,请在代理设置连接选项卡设置以下服务和监听细节:

代理设置(传入) 

这些设置指定来自客户端的哪些消息应该连接到 Virtualize,以便与测试中的应用程序通信。 

Listener

可以从下拉菜单中选择在创建代理时定义的 HTTP 监听器(请查阅 创建代理),或者使用默认的监听器。

可以在下面部分添加 HTTP 监听器

  1. 单击 New 并为监听器指定名称。
  2. 单击 Add Port 并输入端口号。 
  3. 在客户端通过 SSL 发送通讯报文时,启用 Secure 选项并启用验证选项。有关更多详情,请查阅 SSL Settings for Listener Ports 。
  4. 单击 OK ,退出端口编辑器。
  5. 单击 Add ,添加监听器的其他端口,或再次单击 OK ,完成添加监听器。
Proxy listen path

输入代理应该监听传入连接的路径。

任何两个消息代理都不能存在这样的 HTTP 连接,它具有相同代理路径或与现有虚拟资产的 HTTP 路径匹配的路径。

有关更多详情,请查阅 Service Forward Path and Proxy Listen Path

Proxy URL显示应该给 AUT 的 URL;有关更多详情,请查阅 将 AUT 指向代理

监听器端口的 SSL 设置

启用 Use keystore 选项,配置服务端 SSL 设置。

配置以下选项:

Key store file指定到密匙库文件的路径。可以手动输入路径,也可以浏览文件系统或工作区。
Key store password指定访问密匙库的密码。
Key store type

从下拉菜单中选择密匙库类型,然后单击 Load

Certificate Certificate 下拉框菜单中,选择显示给服务器的证书别名。如果存在配置错误(如不正确的密码或密匙库类型),菜单将为空。

启用 Perform client authentication 选项,配置客户端 SSL 设置。

配置以下选项:

Key store file指定到密匙库文件的路径。可以手动输入路径,也可以浏览文件系统或工作区。
Key store password指定访问密匙库的密码。
Key store type

从下拉菜单中选择密匙库类型,然后单击 Load

主连接(输出)

Service URL包含目标应用程序的整个路径(包括服务主机、服务端口和转发路径)。可以在此处输入完整 URL,和/或在下面字段中指定组件:在一个区域进行更新将传播给另一个(如,如果在 URL 中更改端口,则服务端字段的值将自动更新)。 
Service host

输入服务所在机器的主机名。这是代理将向其发送消息的机器。

如果希望代理在不使用 HTTP 连接的情况下,将消息转发到本地 Virtualize 服务器上的虚拟资产,请输入 localhost127.0.0.1 ,代替实际的主机名。 

Service port输入服务器正在监听的端口。这是代理将向其发送消息的端口。
Service forward path

(可选项)输入代理应该向其转发接收到的消息的路径。如果为空,则默认为 Proxy listen path 字段中的值。

如果 HTTP 代理正在向本地服务器发送消息,则必须输入 Service forward 路径,因为代理不允许转发给自己。 

如果 Service forward path 发送重定向,代理将遵循重定向,并做出响应。它不会将重定向传递回客户端。

有关更多详情,请查阅 Service Forward Path and Proxy Listen Path

二次连接(输出)

如果希望在主连接失败或响应程序不可用时,将通讯报文重定向到第二代理端点,请启用 Use secondary connection if primary fails 选项。如果响应状态码为 400 或更高,则连接将视为“失败”。

例如,如果希望在任何活动端点不可用时使用虚拟资产,则可能需要指定辅助端点。或者,如果虚拟资产无法处理给定的用例,则可能使用辅助端点以让通讯报文重定向到活动端点。然后可以选择性地记录实时通讯报文,以创建覆盖该用例的新的虚拟资产。

如果没有启用此选项,则将不会使用主连接进行记录。

如果启用了该选项,则可以从可用的录制选项中(如下所述)进行选择。

录制选项

这些设置确定在指定辅助端点时如何记录通讯报文。

  • Record on both connections记录主从连接的通讯报文。将不会记录来自主连接的错误信息;相反地,消息将被发送到次要服务器,并记录响应。将记录次要服务器报告的错误。
  • Record on primary connection only记录主连接的通讯报文。不会记录错误。
  • Record on secondary connection only记录二次连接的通讯报文,包括错误。

安全选项设置

只有当正在虚拟化的服务使用 SSL 时,才需要完善服务 SSL 部分。

如果被虚拟化的服务和/或正在测试的应用程序使用 SSL 和/或其他身份验证(basic/digest, Kerberos, NTLM),则可能需要其他配置。

有关及时完善这些字段下面的服务 SSL 字段的更多详情,请查阅 Security Configuration

代理服务器选项设置

该选项允许在 Virtualize 消息代理级别指定代理服务器,这样就可以控制要哪个代理服务器来处理正在测试的应用程序和指定的 Virtualize 消息代理之间的通讯报文。它允许配置不同的代理服务器,用于不同 Virtualize 消息代理之间的通信。 

若要在该级别上指定代理设置,请在代理的代理服务器(Proxy Server)选项卡中提供合适的详细信息。 



不支持 SSL。 

服务转发路径和代理监听路径

在最简单的情况下,可以将 Proxy listen path 设置为您的服务路径,并保留 Service forward path 为空。使用该配置,代理将它在该路径接收到的所有消息自动转发到 Service hostService port上相同的路径。 

如果需要代理监听与您的服务路径不同的路径,请将 Service forward path 设置为要将所接收消息发送到的实际路径。代理将会把路径和任何查询部分转发到目标服务。 

如果 Proxy listen pathService forward path 不同,则将会把 Proxy listen path 之后请求中的任何片段附加到转发的请求中。 Proxy listen path 本质上是被 Service forward path 替换的,以便将整个路径(由代理接收)发送到服务。

在 Paths 中使用通配符

可以使用通配符来指定动态的路径段。例如,假定发送了两个请求到 paths /path/1/service/path/2/service上的 Virtualize。若要两个请求跳转至同一个代理,请配置路径为 /path/*/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”):

listen path/path/*/service/*/account
forward path: /asset/path/${2}/service/${1}/account

request path: /Path/1/service/bank/account
forward path: /asset/path/bank/service/1/account

数据头修改

大多数情况下,代理将把所有数据头直接传递给目标服务和从目标服务传递给目标服务。可以更改一些与数据头相关的 content-length,以适应代理服务器的工作方式。例如,代理服务器不支持具有“chunked”转换编码的详情,并且将代替“host”数据头发送,以匹配它自己的主机名(然后,它支持接收 chunked 请求和来自目标服务的 chunked 响应。

指向虚拟资产或实际服务

代理可以使用 Virtualize 服务器上的虚拟资产作为其目标服务。为此:

  1. 将服务主机和端口设置为虚拟资产部署的 Vrtualize 服务器的主机和端口。如果希望代理在不使用 HTTP 连接的情况下,将消息转发到本地 Virtualize 服务器上的虚拟资产,请输入 localhost127.0.0.1 ,代替实际的主机名。
  2. 将代理连接的 Service forward path 设置为虚拟资产的路径(在虚拟资产的 Transports> HTTP 选项卡中 HTTP endpoint下可找到)。

Chunking/Unchunking 行为

代理支持接收 chunked 请求和来自目标服务的 chunked 响应。如果服务响应使用 HTTP chunking,代理将在其返回原始调用者/AUT 之前 unchunk 响应。

其他 HTTP 消息代理配置

可以创建属性文件,配置其他 HTTP 监听器设置。属性文件允许微调 HTTP 监听器性能并指定其他 SSL 设置。

  1. 创建纯文本并指定要设置的属性(请查阅 HTTP Listener Message Proxy Performance Properties 和 HTTP Listener Message Proxy SSL Properties)。 
  2. 将文件保存到工作区中 VirtualAssets 目录中,并命名其为 embeddedServer.properties

每次启用具有 HTTP 监听器的代理时都将读取该文件。

HTTP 监听器消息代理属性

embedded.connector.maxHttpHeaderSize指定请求和响应 HTTP 数据头的最大大小(以字节为单位)。如果未指定,则将该属性设置为 8192 (8 KB)。

HTTP 监听器消息代理性能属性

所有属性都是可选的,非整数型值将被忽略。

embedded.connector.maxThreads

指定连接器应该创建请求处理线程的最大数。该属性确定可同时处理地最大请求数。默认为 200

embedded.connector.minThreads

指定应该始终运行的最小线程数。默认为 10

embedded.connector.acceptors

指定应该用于接受连接的线程数。在拥有多个 CPU 的机器上增加该值,或者当使用多个 non-keep-alive 连接时。大多数情况下,12 已经足够。默认为 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

将该属性设置为 true ,强制执行服务器的密码顺序(来自密码设置)。将该属性设置为 false ,选择客户端显示的第一个可接受密码套件。该功能要求 Java 8 或更高版本。默认为 undefined,这将这将导致 JSSE 实现顺序的定义。

embedded.ssl.maxCertPathLength

验证客户端证书时,允许最大中间证书数。默认为 5

embedded.ssl.crlPath将路径设置为包含证书撤销列表的文件,该列表用于验证客户端证书。如果该属性未设置,则不会根据证书撤销列表检查客户端证书。
embedded.ssl.keyManagerAlgorithm设置要使用的证书编码算法。默认情况下,使用 KeyManagerFactory.getDefaultAlgorithm() ,它为 Sun JVMs 返回 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 代理: 

  • Proxy listen path/BookStore
  • Service hostexample.parasoft.com
  • Service port9080
  • Service forward path[empty]


该配置将监听 /BookStore ,并将所有通讯报文转发到实际的书店服务。

如果希望监听除了服务路径之外的路径,可以如下配置代理:

  • Service forward path/BookStore
  • Proxy listen path/SomeOtherPath


这将会把通讯报文从代理上的 /SomeOtherPath 路由到实际书店服务。 

相同情况下,所有跳转至这些路径(包括子路径)的通讯报文都将发送给服务。在第二个示例中,发送给 /SomeOtherPath/SubPath 的通讯报文会发送给 /BookStore/SubPath。由于保留了查询,/SomeOtherPath?param=value 将发送到 /BookStore?param=value。

转发请求到要求数据头文件名区分大小写的服务

当请求转发给要求 HTTP 数据头名称区分大小的服务时,如果正在使用桌面版的 Virtualize 服务器,您的消息代理数据头将使用小写字母,此时,可能无法正常工作。

您可以在 /VirtualAssets/ 目录中创建一个 _global.headers 文件,并使用要传递的特定大小写添加数据头。右键单击 UI 中的服务器,并重新部署所有虚拟资产,以便在您的环境中开始使用该文件。

还可以解决特定消息代理的 HTTP 数据头大小写问题。在 /VirtualAssets/ 目录中创建一个 <proxy-name>.headers 文件,并使用要传递给特定代理的指定大小写添加数据头.该文件将应用于特定代理,并覆盖全局文件。右键单击 UI 中的服务器,并重新部署所有虚拟资产,以便在您的环境中开始使用该文件。

示例数据头文件

X-AUTHORIZATION
ANOTHER-HEADER
HEADER3


例如:发送通讯报文到虚拟资产

代理也可以发送通讯报文到虚拟资产。在这种情况下,就像输入另一个服务一样,输入 Virtualize 服务器的主机和端口信息。

例如,若要将通讯报文发送到远程服务器上的虚拟资产: 

  • Service host virtualize.parasoft.com
  • Service port9080
  • Proxy listen path/path


如要将通讯报文发送给本地服务器的虚拟资产,可以使用:

  • Service host localhost
  • Service port9080
  • Proxy listen path/pva


HTTP 代理没有区分虚拟资产和实际服务。两者的配置方式相同。然而,如果 HTTP 正在给本机发送消息,则必须指定 Service forward path ,因为代理不允许转发给自己。

转发请求到要求数据头文件名区分大小写的服务

当请求转发给要求 HTTP 数据头名称区分大小的服务时,如果正在使用桌面版的 Virtualize 服务器,您的消息代理数据头将使用小写字母,此时,可能无法正常工作。有关更多详情,请查阅 Forwarding Requests to Services that Require Case-sensitive Header Names

安全配置

安全配置有两个方面: 

  • 如果您正向其转发通讯报文的服务使用 SSL 和/或访问身份验证,则需要执行 Proxy-Level Configuration (来自代理的 UI 控件)。
  • 如果 AUT 使用 SSL 和/或访问身份验证,则需要执行 Server-Level Configuration (适用于基于 Tomcat 的 Virtualize 服务器)。

因此,根据您的配置,您可以执行服务器级别配置、代理级别配置,或者两者都执行。

代理级别配置

代理级别安全配置(如果您正向其转发通讯报文的服务使用 SSL 和/或访问身份验证,该配置是有关配置),它涵盖了:

SSL

SSL 要求额外的设置。在配置面板的下方,需要指定:

  • 是启用信任自签名证书。
  • 还是启用信任所有证书。
  • 设置信任库,验证服务器证书。

此外,需要提供使用特定密匙库和证书需要的信息,这样 Virtualize 便可确定要展示哪个证书给服务器(例如,双向(2-way) SSL)。



SSL 配置面板字段

选项说明
Use SSL when connecting to the service启用 SSL。
Trust all server certificates

如果启用该选项,将接受所有证书。不执行任何验证。

当消息代理与服务建立连接时,该选项禁用信任验证;它允许接受服务提供的任何证书的连接。总的说来,如果证书信任不关注 Virtualize 部署的环境,则应该启用该选项。

Accept self-signed certificates

如果启用该选项,只要在它们上进行验证的验证方法 java.security.cert.X509Certificate.checkValidity() 返回 true,将接受证书。该验证方法有效地检查了当前日期和时间是否在证书中给定的有效期之内。将不会评估证书信任路径,也不应用所提供的信任库配置。

该选项确定 Virtualize 是否应该信任服务提供的证书(该证书未被信任的证书机构签名)。总的说来,如果证书信任不关注 Virtualize 部署的环境,则应该启用该选项。

注意,信任库配置(如下所述)只在既未选中 信任所有服务证书 也未选中 接受自签名证书 时可用。


信任库配置面板字段

选项说明
Key store file指定到密匙库文件的路径。密匙库确定 SSL 握手期间消息代理提供给服务的证书和密匙。
Key store password指定访问密匙库的密码。
Key store type指定密匙库的类型。
Certificate指定对服务器进行身份验证时,要使用的证书别名。

完善密匙库详细信息后,单击 Load 按钮。然后,从 Certificate 下拉菜单中为 Virtualize 要提供给服务器的证书别名。如果单击 Load时, Certificate 下拉框未填充,则可能输入了不正确的密码或密匙库类型。


信任库配置面板字段

这些字段只有在既未选中 Trust all 也未选中 Accept self-signed certificates (如上所述)时才可用。

选项说明
Key store file

指定到信任库文件的的路径。信任库确定消息代理在与服务握手时,应该信任的证书。如果该库中不包括服务提供的证书,则将拒绝连接。如果未提供信任库,则将使用默认的 JRE 信任库。 

该选项只有在未选中 trust all server certificates 时才可用。

Key store password指定访问密匙库的密码。
Key store type指定密匙库类型。


NTLM 设置面板字段

选项说明
Use NTLM指定服务是否要求 NTLM 身份验证。
Username指示用于 NTLM 身份验证的用户名。
Password指示用于 NTLM 身份验证的密码。


Kerberos 面板字段

选项说明
Kerberos service principal指定对请求进行身份验证的服务主体。

Basic/Digest 身份验证

如果正在测试的应用程序提供 Basic 和 Digest 的身份验证凭证作为请求的一部分,并将它们作为 HTTP 数据头的一部分进行传输,则代理将不加修改地将它们传递给服务(与它处理其他 HTTP 数据头的方法相同)。 

NTLM 身份验证

如果服务要求 NTLM 身份验证,请提供 NTLM 部分的用户名和密码。


Kerberos 身份验证

如果服务要求 Kerberos 身份验证,请在 Kerboros 身份验证部分设置 Kerboros Service Principal

服务级别配置

服务级别安全配置(如果 AUT 使用 SSL 和/或访问身份验证,则这它是相关设置),它涉及了:

配置 Virtualize 服务器

该 Virtualize 服务器默认使用端口 9080。如果希望更改代理端口(如,通过将服务器移出公共/已知端口以提供安全),请查阅 Using an Alternative Port for the Virtualize HTTP Server

如果 AUT 使用 SSL,则需要配置 Virtualize 服务器,如 Configuring SSL (HTTPS) for the Virtualize Server中所述。 

使用具有 WAFFLE 的 NTLM

若要使用 NTLM 的第三方库 WAFFLE:

  1. 请将下面的 jar 文件复制到 tomcat 的 lib 目录中: jna.jar, platform.jar, wafflejna.jar
  2. 将以下内容添加到 tomcat/conf/server.xml

    <Context>
      <Valve className="waffle.apache.NegotiateAuthenticator" principalFormat="fqn" roleFormat="both"/> 
      <Realm className="waffle.apache.WindowsRealm" /> </Context> 

    server.xml 在哪里?

    如果安装了 Virtualize ,但没有安装 SOAtest 的情况下:启动 Virtualize,确保至少创建了一个响应程序,然后更改 [Virtualize install dir]/eclipse/plugins/com.parasoft.xtest.libs.web_[Virtualize_ver]/root/tomcat/conf/server.xml中的 server.xml 文件。

    如果同时既安装了 Virtualize 也安装了 SOAtest:启动 Virtualize,确保至少创建了一个响应程序,然后更改 [SOAtest install dir]/eclipse/plugins/com.parasoft.xtest.libs.web_[SOAtest_ver]/root/tomcat/conf/server.xml中的 server.xml 文件。

  3. 将以下内容添加到 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> 
  4. 重启服务。

有关更多详情,请查阅单点登录:Tomcat Negotiate Authenticator (Kerberos + NTLM) w/ Waffle 教程和 WAFFLE 首页。

使用不支持的配置(具有 WAFFLE、JAAS 的 Kerberos)

WAFFLE 包括对 Kerberos 身份验证的支持。关于指导和支持,请查看 WAFFLE 首页。 

JAAS 是配置基于 Tomcat 的 Virtualize 服务器的另一个选项,它用来进行 Kerberos 身份验证。关于如何使用 JAAS,请咨询 Tomcat。

  • No labels