3

我有带有 https 设置的弹簧安全性。

尝试以安全方式在 URL 上运行 curl GET 时,我看到了意外行为。

当 curl 第一次向服务器发送请求时,它没有授权数据(为什么?我专门添加了它)。然后,服务器回复 Authentication Error (401)。然后客户端重新传输请求,这次使用授权数据,服务器正确回复所需的数据。

知道为什么会这样吗?

卷曲命令:

curl -v --insecure --anyauth --user 用户名:密码 -H "Accept: application/json" -H "Content-Type: application/json" -X GET localhost:8443/myresource

请求 1:

> GET /myresource HTTP/1.1
> User-Agent: curl/7.21.3 (x86_64-redhat-linux-gnu) libcurl/7.21.3 NSS/3.13.1.0 zlib/1.2.5 libidn/1.19 libssh2/1.2.7
> Host: localhost:8443
> Accept: application/json
> Content-Type: application/json

回应1:

< HTTP/1.1 401 Unauthorized
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=B56A7F49E715795B5D1158DB192710AA; Path=/myresource ; Secure; HttpOnly
< WWW-Authenticate: Digest realm="Protected", qop="auth", nonce="MTM0Njg2MjYwMjY0ODozNDk5ZDkxNTYxNjMxMDJmNDA4MWQ1NTBmZjk5OGQ5Nw=="
< Content-Type: text/html;charset=utf-8
< Content-Length: 1119
< Date: Wed, 05 Sep 2012 16:29:52 GMT

要求 2:

> GET /myresource HTTP/1.1
> Authorization: Digest username="username", realm="Protected", nonce="MTM0Njg2MjYwMjY0ODozNDk5ZDkxNTYxNjMxMDJmNDA4MWQ1NTBmZjk5OGQ5Nw==", uri="/myresource", cnonce="ODczNjg0", nc=00000001, qop="auth", response="58faded9ae5f639ba0056fb86edca71f"
> User-Agent: curl/7.21.3 (x86_64-redhat-linux-gnu) libcurl/7.21.3 NSS/3.13.1.0 zlib/1.2.5 libidn/1.19 libssh2/1.2.7
> Host: localhost:8443
> Accept: application/json
> Content-Type: application/json

回应 2:

< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Set-Cookie: JSESSIONID=37F375C5663C4A049D95D49C7C1CF0FD; Path=/myresource ; Secure; HttpOnly
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Wed, 05 Sep 2012 16:29:52 GMT
4

2 回答 2

8

男人卷曲

--anyauth

(HTTP) 告诉 curl 自己找出身份验证方法,并使用远程站点声称支持的最安全的方法。这是通过首先发出请求并检查响应标头来完成的,因此可能会导致额外的网络往返。这用于代替设置特定的身份验证方法,您可以使用--basic、--digest、--ntlm 和--negotiate 来执行此操作。

请注意,如果您从标准输入进行上传,则不建议使用 --anyauth,因为它可能需要发送两次数据,然后客户端必须能够回退。如果从标准输入上传时需要,上传操作将失败。

您应该使用 --digest 而不是 --anyauth。

于 2012-09-06T15:09:58.947 回答
3

如果没有来自服务器的第一个 401 响应,就无法进行摘要式身份验证。

即:服务器回复第一个请求:

WWW-Authenticate: Digest realm="Protected", qop="auth", nonce="MTM0Njg2MjYwMjY0ODozNDk5ZDkxNTYxNjMxMDJmNDA4MWQ1NTBmZjk5OGQ5Nw=="

客户端在组装有效的摘要身份验证请求之前需要此信息。Digest 需要使用 nonce 和 op 方法以提供有效的

response="58faded9ae5f639ba0056fb86edca71f"

如第二个请求所示。

所以简而言之,如果没有首先获得 401,您就无法执行摘要请求,因为没有它,您没有足够的信息来组装响应。

于 2017-10-18T03:17:29.173 回答