卷曲授权

时间:2012-09-05 16:42:03

标签: curl https

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

尝试以安全的方式对URL运行curl GET时,我发现了一个意外的行为。

当curl首先向服务器发送请求时,它没有授权数据(为什么?我特意添加了它)。然后,服务器回复认证错误(401)。 然后,客户端重新发送请求,这次使用授权数据,服务器正确回复所需数据。

知道为什么会这样吗?

卷曲命令:

  

curl -v --insecure --anyauth --user username:password -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

2 个答案:

答案 0 :(得分:7)

来自man curl

  

- anyauth

     

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

     

请注意,如果您从中上传,则不建议使用--anyauth   stdin,因为它可能需要两次发送数据然后再发送客户端   必须能够倒带。如果从上传时需要出现   stdin,上传操作将失败。

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

答案 1 :(得分:2)

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

即:服务器使用以下命令回复第一个请求:

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

客户端需要此信息才能汇总有效的摘要式身份验证请求。摘要需要使用nonce和op方法才能提供有效的

response="58faded9ae5f639ba0056fb86edca71f"

如第二个请求中所示。

因此,简而言之,如果没有第一次获取401就无法进行摘要请求,因为如果没有足够的信息来汇总响应,那么就无法进行摘要请求。