亚马逊AWS官方博客

智能体驱动测试变革:让智能体成为测试第一性 之三 用 Web Bot Auth 为 AgentCore Browser Tool 打造可信身份

序言

在自动化测试领域,我们正面临一个日益严重的矛盾:测试智能体越是智能,越容易被网站安全系统误判为“恶意机器人”。CAPTCHA、速率限制和访问阻断,这些防护措施本是用来抵御攻击,却意外成为了测试自动化的“拦路虎”。

测试智能体的困境

当你的AI助手尝试登录系统验证流程、模拟用户行为进行压力测试,或者爬取页面数据进行分析时,却频繁遭遇CAPTCHA拦截。本该自动化的测试流程被迫中断,需要人工介入,这完全违背了“测试第一性”的自动化愿景。

测试场景中的真实痛点

想象这些典型测试场景:

  • 端到端流程验证:智能体模拟完整用户旅程,却在关键步骤卡在CAPTCHA
  • 竞品分析测试:自动化收集竞品信息时被频繁阻断
  • 安全测试:模拟异常行为时被误判为攻击而封禁
  • 性能压测:多并发请求触发速率限制,影响测试准确性

传统解决方案要么脆弱(如OCR破解CAPTCHA),要么不具扩展性(如IP白名单),更重要的是,它们都在“绕过”防护,而非“合作”。

Web Bot Auth:测试智能体的“合法身份”

现在,Amazon Bedrock AgentCore Browser 推出的 Web Bot Auth 功能,为测试智能体提供了革命性的解决方案:可验证的加密身份

工作原理
当测试智能体访问被测网站时,它会出示由权威机构颁发的“数字身份”。网站的WAF系统可以:

  1. 验证签名真实性
  2. 确认其来自受信任目录
  3. 根据网站策略决定是否放行

对测试团队的三大价值

1. 测试流程零中断

# 启用Web Bot Auth的测试智能体配置
browser_config = {
    "name": "e2e_test_agent",
    "browserSigning": {"enabled": True}  # 一键启用身份验证
}
# 从此,CAPTCHA不再打断你的自动化测试流程

2. 获得“合法测试者”身份

主流防护提供商(AWS WAF、Cloudflare等)的许多客户网站默认允许已验证机器人访问。这意味着你的测试智能体可以:

  • 无需特殊申请即可访问测试环境
  • 在生产环境进行监控测试时减少干扰
  • 在第三方系统集成测试中获得更好协作

3. 精细化测试权限管理

网站所有者可以精确控制:

  • “允许性能测试智能体以100请求/秒访问API”
  • “允许安全测试智能体扫描特定端点”
  • “禁止所有其他自动化访问”

这为测试建立了明确的“交通规则”。

测试场景应用示例

场景一:全天候监控测试

# 监控测试智能体配置
monitoring_agent = TestAgent(
    tools=[signed_browser],
    task="每小时检查服务健康状态,遇到CAPTCHA自动处理"
)
# 7×24小时运行,不再担心凌晨3点被CAPTCHA阻断

场景二:跨系统集成测试

# 第三方系统测试流程
integration_test = {
    "steps": [
        "登录合作伙伴门户",
        "同步订单数据",  # 曾经卡在CAPTCHA
        "验证数据一致性"  # 现在流畅执行
    ]
}

场景三:安全合规测试

# 安全测试智能体获得“白帽”身份
security_scanner = SecurityTestAgent(
    credentials="verified_tester",  # 可验证的安全测试者
    scope="允许扫描除支付外的所有端点"
)

行业趋势:智能体成为测试第一性

Web Bot Auth不仅是一项技术特性,更是测试理念的演进:
:测试脚本作为工具的补充
:测试智能体作为测试的第一性原理
:绕过防护的“猫鼠游戏”
:建立信任的“合作共赢”

什么是 Web Bot Auth(WBA)

WBA 是一套正在被行业快速采纳的 Bot 身份验证标准。它的核心思想是让合法的自动化工具用加密签名为自己“证明身份”,而不是只依赖 IP、UA、或行为特征。
WBA 的工作机制基于两份 IETF 正在推进中的草案:

  1. 公钥目录草案(Directory Draft)
    用于让爬虫/AI 代理公开他们的公钥。网站或防护系统(如 AWS WAF)可以从目录获取这些公钥。
  2. 协议草案(Protocol Draft)
    定义这些公钥如何用于为 HTTP 请求生成签名,确保请求确实来自声明的 bot/agent,而不是伪造的机器人。

通过这两个组件,WBA 提供了一种类似于“机器人版本的 TLS 身份认证”的机制。

AWS WAF 如何使用 WBA?

有了 WBA 支持后,AWS WAF 能够:

  • 自动验证 AI agent 或 bot 请求的加密签名
  • 自动放行已验证的 WBA 流量(无需自定义规则)
  • 区分“带签名的合法自动化访问”和“未经验证的可疑 bot”

之前,AWS WAF 的 Category AI 规则集会默认阻拦未识别的 AI bot 流量。
现在,这项行为进行了显著改进:

  • 如果 bot 通过 WBA 认证 → 自动放行
  • 如果 bot 未验证或签名错误 → 仍按原策略处理(可能被阻断)

换句话说,AWS WAF 不再一刀切,而是开始识别“可信 AI agent”。

          ┌──────────────────────────────────────────┐
          │         ① 公开公钥(Key Directory)        
          └──────────────────────────────────────────┘
                             │
                             ▼
               Bot/Agent 将公钥上传到:
               - Web Bot Auth Key Directory(IETF 草案)
               - 并声明自己的 identity (bot_id)
        ┌──────────────────────────────────────────┐
        │         ② Bot 生成带签名的 HTTP 请求        
        └──────────────────────────────────────────┘
                             │
                             ▼
                   Bot 发起正常 HTTP 请求
                   并使用私钥生成签名:
     ┌────────────────────────────────────────────────────────┐
     │  HTTP Message Signature                                 
     │  -----------------------------------------------------  
     │  Signature-Input:
     │  Signature:
     │  Bot-ID:
     └────────────────────────────────────────────────────────┘
                             │
                             ▼
        ┌──────────────────────────────────────────┐
        │        ③ 网站 / CDN / WAF 获取公钥          
        └──────────────────────────────────────────┘
      Website/CDN/WAF 执行:
      1. 根据 Bot-ID 查询公钥目录  
      2. 获取 bot 公钥  
      3. 提取 Signature 与待验字段  
                             │
                             ▼
        ┌──────────────────────────────────────────┐
        │         ④ 使用公钥验证签名有效性            
        └──────────────────────────────────────────┘

       验证步骤:
       - 计算 HTTP 消息规范化
       - 用公钥校验数字签名
       - 签名正确 → bot 身份可信
       - 签名无效 → 可能为伪造 bot
                             │
                             ▼
   ┌─────────────────────────────────────────────────────────────┐
   │               ⑤ AWS WAF / Cloudflare / Akamai 的决策逻辑       
   └─────────────────────────────────────────────────────────────┘
           已验证(Valid Signature)
                │
                ├──► **Allow(放行)**
                │       标记为 “Verified Bot / Signed Agent”
                │
           未验证(Invalid / Missing Signature)
                │
                └──► **Block / Challenge / Rate Limit**
                        按策略执行(防止恶意机器人)

自动化工作流程的挑战与解决方案

CAPTCHA 是基于浏览器的智能体工作流程中最主要的障碍之一。您的智能体会在任务中途停止,等待人工干预来解决证明“您不是机器人”的验证难题,但您的智能体确实是机器人,而这正是问题的关键。CAPTCHA的存在有其正当理由。网站在保护其内容、库存和评价方面持续面临挑战。Web应用防火墙(WAF)和机器人检测服务保护着这些网站,但它们几乎将所有自动化流量都视为可疑对象,因为缺乏可靠的方法来区分合法智能体和恶意程序。

解决方案对比分析

对比维度 传统解决方案 Web Bot Auth 解决方案
核心方法 程序化破解CAPTCHA(OCR识别、图像点击) 提供可验证的加密身份凭证
技术原理 计算机视觉模型识别扭曲文本或点选图像网格 基于IETF草案协议的加密签名机制
可靠性 脆弱且不稳定,依赖CAPTCHA形式变化 稳定可靠,基于密码学验证
成本效益 昂贵,需要持续维护破解模型 经济高效,一次性身份配置
合规性 绕过网站所有者设定的防护机制 尊重网站控制权,符合安全策略
身份验证 无真实身份验证,易被封锁 可验证的加密身份,可被信任
IP依赖 依赖IP白名单,云环境地址变化会导致失效 不依赖IP,基于身份验证
用户代理 User-Agent易被伪造和模仿 加密签名无法伪造,提供真实身份
扩展性 需要与每个网站手动协调,无法规模化 自动注册到主流WAF提供商,即时生效
网站控制 剥夺了网站所有者的控制权 给予网站所有者三级精细控制权限
长期维护 需要持续对抗CAPTCHA更新 基于标准化协议,维护成本低
行业接受度 被视为规避手段,可能被封锁 与AWS WAF、Cloudflare等主流提供商合作

传统方案的根本缺陷

技术对抗循环:传统CAPTCHA破解方案本质上是一场“猫鼠游戏”——当网站更新CAPTCHA机制时,自动化解决方案需要相应更新破解算法,形成持续的技术对抗。
信任缺失:无论是IP白名单还是伪造User-Agent,都无法建立真正的信任关系。网站无法确认访问者的真实意图和身份。
规模化瓶颈:每个网站都需要单独协调和配置,这在涉及多个第三方服务或公共网站的自动化场景中完全不切实际。

Web Bot Auth 的核心优势

Web Bot Auth 通过将自动化智能体从“需要被检测的匿名访问者”转变为“可验证身份的合法访问者”,从根本上改变了游戏规则。这种方法不仅解决了CAPTCHA阻碍问题,更建立了一个可持续、可扩展且尊重各方权益的自动化生态系统。
关键转变:从“如何绕过防护”到“如何建立可信身份”的思维转变,让自动化工作流程能够在合规、可控的前提下顺畅运行。

示例代码

环境准备

git clone https://github.com/awslabs/amazon-bedrock-agentcore-samples.git
pip install bedrock-agentcore
pip install playwright

无WBA加持

很多网站配置了识别bot的规则,比如电商网站,酒店官网等,如果客户端发起请求没有WBA加持,访问很容易被拒绝。

browser_without_wba.py

import sys
sys.path.append('amazon-bedrock-agentcore-samples/01-tutorials/05-AgentCore-tools/02-Agent-Core-browser-tool/interactive_tools')

from playwright.sync_api import sync_playwright, Playwright, BrowserType
from bedrock_agentcore.tools.browser_client import browser_session
from browser_viewer import BrowserViewerServer
import time
from rich.console import Console
console = Console()
def run(playwright: Playwright):
    # Create the browser session and keep it alive
    with browser_session('us-west-2') as client:
        ws_url, headers = client.generate_ws_headers()
        # Start viewer server
        viewer = BrowserViewerServer(client, port=8005)
        viewer_url = viewer.start(open_browser=True)
        # Connect using headers
        chromium: BrowserType = playwright.chromium
        browser = chromium.connect_over_cdp(
            ws_url,
            headers=headers
        )
        context = browser.contexts[0]
        page = context.pages[0]
        try:
            page.goto("https://www.company_name.com")
            console.print(page.title())
            # Keep running
            while True:
                time.sleep(120)
        except KeyboardInterrupt:
            console.print("\n\n[yellow]Shutting down...[/yellow]")
            if 'client' in locals():
                client.stop()
                console.print("✅ Browser session terminated")
        except Exception as e:
            console.print(f"\n[red]Error: {e}[/red]")
            import traceback
            traceback.print_exc()
with sync_playwright() as playwright:
    run(playwright)

Access Denied

Access Denied
You don't have permission to access "http://www.company_name.com/" on this server.
Reference #18.a33dd17.1764779490.52867475

https://errors.edgesuite.net/18.a33dd17.1764779490.52867475

有WBA加持

如果客户端发起请求有WBA加持,同样的网站,可以正常访问。

browser_with_wba.py

import sys
sys.path.append('amazon-bedrock-agentcore-samples/01-tutorials/05-AgentCore-tools/02-Agent-Core-browser-tool/interactive_tools')

from playwright.sync_api import sync_playwright
from bedrock_agentcore.tools.browser_client import BrowserClient
from browser_viewer import BrowserViewerServer
import boto3
import json
import uuid
import time

region = 'us-west-2'
account_id = boto3.client('sts').get_caller_identity()['Account']

iam_client = boto3.client('iam')
role_name = 'agentcore-web-bot-auth-role'

assume_role_policy = {
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {"Service": "bedrock-agentcore.amazonaws.com"},
        "Action": "sts:AssumeRole",
        "Condition": {
            "StringEquals": {"aws:SourceAccount": account_id},
            "ArnLike": {"aws:SourceArn": f"arn:aws:bedrock-agentcore:{region}:{account_id}:*"}
        }
    }]
}

try:
    iam_client.create_role(
        RoleName=role_name,
        AssumeRolePolicyDocument=json.dumps(assume_role_policy)
    )
    print(f"✅ Role Created")
except iam_client.exceptions.EntityAlreadyExistsException:
    iam_client.update_assume_role_policy(
        RoleName=role_name,
        PolicyDocument=json.dumps(assume_role_policy)
    )
    print(f"✅ Role Updated")

execution_role_arn = f"arn:aws:iam::{account_id}:role/{role_name}"

cp_client = boto3.client('bedrock-agentcore-control', region_name=region)

print("⏳ Waiting for IAM role to propagate...")
time.sleep(5)

for attempt in range(3):
    try:
        response = cp_client.create_browser(
            name="web_bot_auth_" + str(uuid.uuid4())[:6],
            description="Browser with Web Bot Auth enabled",
            executionRoleArn=execution_role_arn,
            networkConfiguration={"networkMode": "PUBLIC"},
            browserSigning={"enabled": True}
        )
        break
    except Exception as e:
        if attempt < 2:
            print(f"⏳ Retry {attempt + 1}/3 after 20s...")
            time.sleep(20)
        else:
            raise

browserId = response['browserId']
print(f"✅ Browser Created with Web Bot Auth: {browserId}")

client = BrowserClient(region)
client.start(identifier=browserId)

try:
    ws_url, headers = client.generate_ws_headers()
    
    viewer = BrowserViewerServer(client, port=8005)
    viewer.start(open_browser=True)
    
    with sync_playwright() as p:
        browser = p.chromium.connect_over_cdp(ws_url, headers=headers)
        context = browser.contexts[0]
        page = context.pages[0]
        
        page.goto("https://www.company_name.com")
        print(f"Title: {page.title()}")
        
        time.sleep(120)
        browser.close()
finally:
    client.stop()

这段代码实现了使用 WBA 加持 AgentCore Browser Tool 的完整流程:

1. 环境准备

sys.path.append(...)  # 添加browser_viewer模块路径
from playwright.sync_api import sync_playwright  # 浏览器自动化
from bedrock_agentcore.tools.browser_client import BrowserClient  # AWS托管浏览器客户端
from browser_viewer import BrowserViewerServer  # 实时查看器

2. 创建IAM执行角色

assume_role_policy = {...}  # 定义信任策略

Principal: bedrock-agentcore.amazonaws.com
Condition: 限制只能从你的账号和us-west-2区域使用

3. 创建启用Web Bot Auth的Browser配置

cp_client.create_browser(
    browserSigning={"enabled": True}  # 关键:启用Web Bot Auth签名
)

browserSigning: 让浏览器自动对所有HTTP请求添加加密签名
签名头: Signature, Signature-Input, Signature-Agent
作用: 向网站证明这是合法AI代理,不是恶意bot
重试机制: IAM角色传播需要时间,最多重试3次

4. 启动Browser会话

client = BrowserClient(region)
client.start(identifier=browserId)  # 使用自定义browser配置

5. 启动Live Viewer

viewer = BrowserViewerServer(client, port=8005)
viewer.start(open_browser=True)  # 在浏览器中实时查看

访问 http://localhost:8005 可看到浏览器实时画面
支持手动控制(Take Control按钮)

6. Playwright连接并操作

browser = p.chromium.connect_over_cdp(ws_url, headers=headers)
page.goto("https://www.company_name.com")  # 访问网站

CDP协议: Chrome DevTools Protocol,远程控制浏览器
ws_url: WebSocket连接地址
headers: 认证头,包含AWS签名

7. Web Bot Auth工作原理

用户代码 → Playwright → AgentCore Browser (AWS托管)
                              ↓ 自动添加签名头
                         目标网站 (URL)
                              ↓ 验证签名
                         允许访问(无CAPTCHA)

结语

Web Bot Auth 的出现,为测试智能体提供了一个稳定、可识别的访问身份,让自动化流程在现代网站防护体系中能够更顺滑地运行。测试不再频繁被 CAPTCHA 或安全策略打断,也不再依赖脆弱的绕过方案,而是以一种更清晰、可控的方式与网站端协同。
对于测试团队来说,这意味着更少的干扰、更高的效率,以及更容易维护的自动化体系。让智能体以更合理的方式工作,让测试过程回归本身应有的连续性与可预期性。
在日常的 E2E 流程测试、持续监测、跨系统协作验证、安全扫描、合规验证、页面采集与对比、性能压测等场景中,Web Bot Auth 都提供了一条更稳妥的路径,使测试能够专注在验证行为本身,而不是被环境因素阻断。

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者

张羽

亚马逊云科技解决方案架构师

王一凡

亚马逊云科技解决方案架构师,目前专注于为汽车行业客户提供技术咨询与解决方案设计,与此同时,他还积极探索生成式AI的应用,力求将这些创新应用带入实际业务场景,帮助企业提升效率与竞争力。

AWS 架构师中心: 云端创新的引领者

探索 AWS 架构师中心,获取经实战验证的最佳实践与架构指南,助您高效构建安全、可靠的云上应用