Radius协议 - 如何将密码发送到服务器?
我使用TinyRadius将我的Java WebServer(作为Radius Client)认证到Windows Server(作为Radius Server)。Radius协议 - 如何将密码发送到服务器?
我成功地将用户访问请求发送到服务器并收到密码。
final RadiusClient client = new RadiusClient(
new RadiusEndpoint(
new InetSocketAddress(RADIUS_SERVER_ADDRESS, PORT),
SHARED_SECRET
)
);
final AccessRequest request = new AccessRequest(
USERNAME,
USER_PASS
);
request.setAuthProtocol(AccessRequest.AUTH_PAP);
request.addAttribute("NAS-IP-Address", RADIUS_CLIENT_ADDRESS);
RadiusPacket packet = null;
try {
packet = client.authenticate(request);
} catch (final RadiusException | IOException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
此代码后面跟着一个日志,表明用户认证已被服务器批准。
Sep 29, 2017 10:05:32 AM org.tinyradius.util.RadiusClient authenticate
INFO: send Access-Request packet: Access-Request, ID 1
User-Name: mp
NAS-IP-Address: 192.168.0.58
Sep 29, 2017 10:05:33 AM org.tinyradius.util.RadiusClient authenticate
INFO: received packet: Access-Challenge, ID 1
State: 0x7b41324244344539362d453139332d344539392d413134322d4134423536364441443938437d
Reply-Message: Enter PASSCODE
我Windows服务器上的事件查看器也声明访问请求已被接受。
事实上,我正确地收到我的移动应用程序的密码(我使用Censornet的短信密码,altought这是无关紧要的)。
不幸的是,我无法找到任何TinyRadius密码例如在网络上,但同时浏览其他图书馆,我偶然发现了这个python library,其中指出:
的询问 - 例外
messages
和state
属性messages
可以显示给用户以提示他们提供他们的 质询响应。必须作为RADIUS属性回显state
。
和
最后再利用替代密码的用户 质询响应认证。
所以我所做的就是使用上面的代码。我把PASSCODE,而不是USER_PASS,我将状态属性添加到我的AccessRequest。
final RadiusAttribute stateAttr = new RadiusAttribute(24, STATE.getBytes());
request.addAttribute(stateAttr);
我发送请求到服务器,我可以看到这个日志。
Sep 29, 2017 10:34:04 AM org.tinyradius.util.RadiusClient authenticate
INFO: send Access-Request packet: Access-Request, ID 1
User-Name: mp
NAS-IP-Address: 192.168.0.58
State: 0x307837623431343133353330333433363334333832643433333433343339326433343432343633303264343234343335343532643330343533323337343633383332333333373332333933373764
Sep 29, 2017 10:34:04 AM org.tinyradius.util.RadiusClient authenticate
INFO: received packet: Access-Reject, ID 1
Reply-Message: Session is unknown or has expired
Windows事件查看器中指出:
Event description:
Event type: Authentication request
Result: Failure
Failure reason: Password validation failed
所以我读的RFC 2865访问挑战章的第4.4节,他们指出:
收到有效的 接入挑战表明一个新的接入请求应该是 发送 与用户密码属性替换为 用户的响应(加密),并包括来自访问挑战的状态属性 (如果有的话)。访问请求中只能存在0或1个状态属性实例。
因此,我正在做一切正确的,我猜。有人可以帮我吗?
Okey,问题是我如何在我的第二个AccessRequest中设置状态。
这并不工作:
final RadiusAttribute stateAttr = new RadiusAttribute(24, STATE.getBytes());
request.addAttribute(stateAttr);
以下工作:
// this is the same code as written in the question
// I send the authentication request to the server and he answers
// with a Access-Challenge packet, which is saved in the variable 'packet'
final AccessRequest request = new AccessRequest(
USERNAME,
USER_PASS
);
// ...
packet = client.authenticate(request);
现在,我们已经收到密码后,我们创建了一个新的AccessRequest回答的挑战,并设置状态采取以下方式。
final AccessRequest challengeResponseRequest = new AccessRequest(
USER,
PASSCODE
);
// here we set the state correctly
// packet is the challengePacket recevied from the code above...
challengeResponseRequest.addAttribute(new RadiusAttribute(24, packet.getAttribute(24).getAttributeData()));
// finally...
client.authenticate(challengeResponseRequest);
,您会收到确认日志:
Sep 29, 2017 2:05:13 PM org.tinyradius.util.RadiusClient authenticate
INFO: received packet: Access-Accept, ID 2
Class: 0x8f8007ad0000013700010200c0a800050000000024db5d173578383201d3379907bd2a500000000000000098