2014-04-10 2 views
2

Windows 및 Mac OS X에서 모두 컬을 사용하여 시도했으며 항상 동일한 결과를 산출합니다. 나는 영역에 대한 요청을 시작하고 난 인증 할 --digest 플래그를 사용하고 있습니다 :curl은 항상 두 개의 헤더를 반환합니다.

curl <options> --digest --user admin <endpoint> -v -v --raw

내 전화의 모든 두 개의 헤더 결과 :

* Adding handle: conn: 0x7f908c80ba00 
* Adding handle: send: 0 
* Adding handle: recv: 0 
* Curl_addHandleToPipeline: length: 1 
* - Conn 0 (0x7f908c80ba00) send_pipe: 1, recv_pipe: 0 
* About to connect() to localhost port 8002 (#0) 
* Trying ::1... 
* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 8002 (#0) 
* Server auth using Digest with user 'admin' 
> PUT /endpoint HTTP/1.1 
> User-Agent: curl/7.30.0 
> Host: localhost:8002 
> Accept: */* 
> Content-type: application/xml 
> Content-Length: 0 
> 
< HTTP/1.1 401 Unauthorized 
< WWW-Authenticate: Digest realm="public", qop="auth", nonce="e54fba22d0eca67e26155cf243dcf4ca", opaque="370985129eb9e9d5" 
< Content-type: application/xml 
* Server <X> is not blacklisted 
< Server: <X> 
< Content-Length: 173 
< Connection: Keep-Alive 
< Keep-Alive: timeout=5 
< 
* Ignoring the response-body 
* Connection #0 to host localhost left intact 
* Issue another request to this URL: 'http://localhost:8002/endpoint' 
* Found bundle for host localhost: 0x7f908b6095c0 
* Re-using existing connection! (#0) with host localhost 
* Connected to localhost (127.0.0.1) port 8002 (#0) 
* Adding handle: conn: 0x7f908c80ba00 
* Adding handle: send: 0 
* Adding handle: recv: 0 
* Curl_addHandleToPipeline: length: 1 
* - Conn 0 (0x7f908c80ba00) send_pipe: 1, recv_pipe: 0 
* Server auth using Digest with user 'admin' 
> PUT /endpoint HTTP/1.1 
> Authorization: Digest username="admin", realm="public", nonce="e54fba22d0eca67e26155cf243dcf4ca", uri="/endpoint", cnonce="ICAgICAgICAgICAgICAgICAgICAgIDEzOTc5NzM3MzY=", nc=00000001, qop=auth, response="47da275c9b69e8541ed335a040d4d10d", opaque="370985129eb9e9d5" 
> User-Agent: curl/7.30.0 
> Host: localhost:8002 
> Accept: */* 
> Content-type: application/xml 
> Content-Length: 118 
> 
* upload completely sent off: 118 out of 118 bytes 
< HTTP/1.1 204 No Content 
* Server <X> is not blacklisted 
< Server: <X> 
< Content-Length: 0 
< Connection: Keep-Alive 
< Keep-Alive: timeout=5 
< 
* Connection #0 to host localhost left intact 

왜 난 항상 401을받을 수 있나요 머리글? --anyauth 플래그로 표시되지만 --digest 플래그로는 표시되지 않습니다.

+0

당신의 로그에 PUT 요청을하고있는'PUT/endpoint'라고 쓰여 있습니다. 하지만 콘텐츠 길이는 0입니다. 'Content-Length : 0'. 그러니 질문에서 정확한 컬 명령을 편집하고 업로드하십시오. –

+0

내용이 있건 없건 동일합니다 – Tamas

답변

3

곱슬 머리 부분이 모두 보입니다.

--digest curl은 실제 데이터를 얻을 수있는 두 번째 요청을 수행 할 수 있도록 nonce 등을 얻으려면 먼저 401을 가져와야합니다.

--anyauth를 사용하면 curl은 인증 정보가 있다고 가정하지 않으므로 일반 요청을 먼저 수행하여 (브라우저와 비슷 함) 페이지를 "조사"한 다음 401 응답을 기반으로합니다 행동 할거야. 예, 그렇다면 --anyauth는 서버가 자원에 대해 지원한다고 말한 것 중에서 가장 적합한 인증 방법으로 사용할 다이제스트라고 판단하면 서버에 3 건의 요청이 발행됩니다.

0

Curl은 401 응답에서 nonce (임의 값, 단일 사용 값)를 제공해야하기 때문에 두 개의 요청을합니다. 따라서 적절한 WWW-Authenticate 헤더를 만들 수 있습니다.

+0

고마워요. 한 가지 더 묻습니다. --anyauth와 --digest는 nonce를 어떻게 변경합니까? --anyauth를 사용하면 서버로 3 회 여행 할 수 있습니까? – Tamas

1

http 권한을 사용하는 HTTP 서버에서 제대로 인증하려면 서버에 대한 사용 권한 유형을 적어도 1 회 요청해야합니다. 이것이 첫 번째 요청입니다. 서버가 다시 서버에 암호를 seding에 대한 사용 인코딩 방법이 요청에 대한 응답이 경우에는 다음과 같습니다

서버에서 받았다 클라이언트가 암호 해시를 생성하는 데 사용되는이 값
< WWW-Authenticate: Digest realm="public", qop="auth", nonce="e54fba22d0eca67e26155cf243dcf4ca", opaque="370985129eb9e9d5" 

, 스니퍼는 무차별 적으로 비밀번호를 강제로 입력하지 않고 비밀번호를 확인할 수 없습니다. Wikipedia에는 키를 생성하기 위해 암호로 해시가 해시 된 방법에 대한 정확한 설명이 있습니다. 다음과 같은 출력을 볼 이러한 해시는, 서버에 다른 HTTP 요청을 다시 보내는 데 사용되는

인증 : 다이제스트 이름 = "관리자"영역 = "공공", 비표 = "e54fba22d0eca67e26155cf243dcf4ca", URI = "/엔드 포인트 "cnonce은 ="ICAgICAgICAgICAgICAgICAgICAgIDEzOTc5NzM3MzY = "은 NC = 00000001 QOP =는 인증 = 응답"47da275c9b69e8541ed335a040d4d10d "는 불투명 ="370985129eb9e9d5는 "

이 두 번째 요청 컬을 만들고, 그리고 실제 데이터를 업로드 당신은 (0 바이트/끝점)을 보내고 있습니다

관련 문제