用户代理必须对于每个领域(realm)通过用户标识(user-ID)及口令来对自身进行授权,这是基本授权方案的工作模式。Realm值应当被看作不透明的字符串,该值将用于同服务器端其它的realm值相比较。只有用户标识及口令通过受保护资源的认证,服务器才会给请求授权。授权参数没有可选项。在接收到对受保护区域的未经认证的资源请求时,服务器应当回应一个challenge,格式如下:
WWW-Authenticate: Basic realm="WallyWorld"
"WallyWorld"是由服务器分配的字符串,用于对请求URI所指定的受保护资源进行标识。
为了接收授权,客户端需要在基于64位(base64 )的证书中发送用户标识及口令,中间用冒号':'分隔。格式如下:
basic-credentials = "Basic" SP basic-cookie basic-cookie = <base64 [5] encoding of userid-password, except not limited to 76 char/line> userid-password = [ token ] ":" *TEXT
如果用户代理希望发送用户标识"Aladdin"和口令“open sesame”,应当遵循下面形式:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
使用Python验证下这个值是否符合上述描述, 即验证"客户端需要在基于64位(base64 )的证书中发送用户标识及口令"
Tomcat管理页面使用 Basic Authentication Scheme进行认证。我们可以试验一下。 首先访问这个管理页面
发出的HTTP请求如下:
接收到的HTTP响应如下。通过www-Authenticate请求头我们可以看到这个页面使用基本授权方式。
首先用浏览器访问http://127.0.0.1:8080/manager/status,并用Fiddler捕获这个HTTP请求
GET /manager/status HTTP/1.1 Host: 127.0.0.1:8080 Connection: keep-alive Cache-Control: max-age=0 Authorization: Basic Og== User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Referer: http://127.0.0.1:8080/ Accept-Encoding: gzip,deflate,sdch Accept-Language: zh-CN,zh;q=0.8 Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3 Cookie: JSESSIONID=9484EC2A4599C23353A727AD7589692C; JSESSIONID=E4376078FF561C9E4768CA23BA6E3261
这个请求的HTTP响应如下,显示未通过Tomcat认证
HTTP/1.1 401 Unauthorized Server: Apache-Coyote/1.1 Pragma: No-cache Cache-Control: no-cache Expires: Thu, 01 Jan 1970 08:00:00 CST WWW-Authenticate: Basic realm="Tomcat Manager Application" Content-Type: text/html;charset=ISO-8859-1 Transfer-Encoding: chunked Date: Sat, 27 Oct 2012 02:36:28 GMT
使用Fiddler请求构造功能发出一个新的HTTP请求。 注意替换Authorization请求头为新值。 下面将描述新值的生成过程。
按照之前的描述, 客户端需要在基于64位(base64 )的证书中发送用户标识及口令。 我们按照这个步骤操作。
1. 通过Tomcat的配置文件可以得到用户标识和口令为tomcat和secret
2. 生成用户标识及口令对应的base64编码。
3. 将伪造的http请求中的Authorization头的值替换成第2步中生成的值。 并发出这个请求。
4. 结果如下。 浏览器发出的请求, 认证失败;使用 Fiddler伪造的请求, 认证成功