我正在尝试使用ab
对Web服务器进行基准测试。我需要发布一个相当大的JSON负载,该负载也需要使用RSA进行数字签名。该签名经过了全面测试,并且通常可以正常工作。但是,使用ab
时,签名不被接受(或被视为无效),而对于curl
则可以正常工作。
我可以使用curl使用静态签名(不使用时间戳的签名)进行验证。以下将产生有效的响应(状态:200):
curl -X POST https://example.com/post-endpoint -H 'X-KEY-ID: foobarID' -H 'X-SIGNATURE: base64-encoded-signature==' -H 'Content-Type: application/json' -d @payload.json
基本上,我需要与以上ab
命令等效的curl
命令。但是,当我尝试以下操作时,服务器会回复一条Invalid Signature
消息(状态:401):
ab -p payload.json -T application/json -H 'X-KEY-ID: foobarID' -H 'X-SIGNATURE: base64-encoded-signature==' https://example.com/post-endpoint
payload.json
的内容大致如下:
{"foo": "hello world", "bar": NaN, "int": "42", "float": "3.14", "nested_object": {"foo": "bar"}, "nested_list": [{"foo1": "bar1"}, {"foo2": "bar2"}]}
请注意,它以大括号开头/结尾,除NaN
值外,所有字段(和大多数值)都用双引号引起来。同样,输入验证也有效:当我省略必填字段时,服务器会通知我;这告诉我JSON有效负载本身已被服务器接受。
我的期望是ab
显然是沿(POST)传递文件的字节。这对于接受签名至关重要,因为有效载荷字节已签名。如果只有一位无效,则签名无效。
我想念什么?
在上述约束下如何使用ab
?
与payload.json
文件相反,有没有办法直接在终端中传递有效载荷?
ab
是否以某种方式弄乱了有效载荷:在末尾添加换行符\n
,对JSON进行排序等等?可以禁用此功能吗?