Negotiate / NTLM – RFC4599
The WWW-Authenticate Response Header
- server 接收请求
- acceptable Authorization header 未发送
- server 响应 "
401 Unauthorized
"状态码 和 "WWW-Authenticate:
"头
challenge = "Negotiate" auth-data
auth-data = 1#( [gssapi-data] )
gssapi-data
当 gss_accept_security_context
返回给 client 一个 token 时,指令包含 base64 编码的 initialContextToken
这在 server 的初始响应中不存在
200 :成功,"
WWW-Authenticate
"响应头 包含 身份验证的最后一步
gss_init_security_context
处理gssapi-data
,确定安全状态
| 成功,应用可用此响应 否则,根据认证状态采取适当行动
The Authorization Request Header
- client 收到响应
- 响应包含 server 发的 "
WWW-Authenticate
"header
- 响应包含 server 发的 "
- 重试 HTTP 请求,传递 HTTP "
Authorization
"header
credentials = "Negotiate" auth-data2
auth-data2 = 1#( gssapi-data )
gssapi-data
指令包含base64 编码的 initialContextToken
2xx :成功
其他代码:身份认证失败
401 :携带 “Negotiate
” 和gssapi-data
的 "WWW-Authenticate
"头,继续请求
client 可使用携带初始 token 的 "Authorization
"header 向 server 发起连接,以绕过 401
案例分析:
- client 发起 GET 请求,URI: “http://www.nowhere.org/dir/index.html”
C: GET dir/index.html
- client 未发送认证头,server 响应:
S: HTTP/1.1 401 Unauthorized
S: WWW-Authenticate: Negotiate
- client 获取证书 :使用 SPNEGO GSSAPI 机制生成 GSSAPI 信息
- 发起新请求,包括如下认证头:
C: GET dir/index.html
C: Authorization: Negotiate a87421000492aa874209af8bc028
- server 解码
gssapi-data
,传递给 SPNEGO GSSAPI 机制(gss_accept_security_context
函数)-
不完整:server 响应 401,及含
gssapi-data
的WWW-Authenticate header
(循环)S: HTTP/1.1 401 Unauthorized S: WWW-Authenticate: Negotiate 749efa7b23409c20b92356
-
client 解码
gssapi-data
,传递给Gss_Init_security_context
,返回新gssapi-data
给 serverC: GET dir/index.html C: Authorization: Negotiate 89a8742aa8729a8b028
-
-
完整:向 client 提供最后的认证数据(多个数据由 WWW-Authenticate 携带)
S: HTTP/1.1 200 Success S: WWW-Authenticate: Negotiate ade0234568a4209af8bc0280289eca
-
client 解码 gssapi-data,传递给 gss_init_security_context
成功,应用可用此响应
-
-
其他注意事项
- 注:SPNEGO HTTP 认证设施仅提供认证,并不保护 HTTP头 或者 使用过程中身份认证及WWW认证头的数据
- 其他机制,如TLS可保证机密性,TLS证书的哈希可保证通道连接安全,Kerb-TLS 经修改后可提供身份认证及机密性
- 此机制不用于HTTP代理的HTTP身份验证。
- HTTP proxy 应用于 client 和 server 之间时,不同 authenticated clients 与相同 server 之间不可共享连接,否则 server 将失去对安全信息的跟踪
- 代理需支持 “
Proxy-support: Session-Based-Authentication
” HTTP header (来自server的“401 Unauthorized
”响应)
- 注: client 与 server 发送用户数据之前,需完整建立身份认证。
gss_init_security_context
的返回值将表明安全信息是否完整,完整才可发数据。