парень, pleeaseee помогите мне !!!Потребление веб-сервиса с помощью usernametoken профиля с pwd digest
Я создал веб-службу, которая использует защиту UserNameToken Profile с типом пароля, например «дайджест». Когда я пытаюсь использовать веб-сервис из SOAP-UI (отправляя информацию в голове xml), я могу нормально использовать web-сервис, но когда я пытаюсь использовать этот веб-сервис с JAVA, сервер не аутентифицирует пользователя.
Я пытаюсь использовать ось и JAX-WS (отправьте информацию в заголовке конверта, например SOAP-UI), но сервер не аутентифицирует пользователя.
Может кто-нибудь мне помочь?
Вот мой код:
public void faz() throws NoSuchAlgorithmException, Exception {
/////////////////////////////////////////////////////////////
//get the timestamp, nonce and password in SHA-1 and BASE64//
/////////////////////////////////////////////////////////////
String nonce, timestamp, secret;
nonce = String.valueOf(this.hashCode());
BASE64Encoder encoder2 = new BASE64Encoder();
nonce = encoder2.encode(nonce.getBytes());
Calendar c = Calendar.getInstance();
c.setTime(new Date());
timestamp = DatatypeConverter.printDateTime(c);
timestamp = timestamp.substring(0, 19);
timestamp = timestamp+"Z";
secret = "weblogic1";
MessageDigest SHA1 = null;
try {
SHA1 = MessageDigest.getInstance("SHA1");
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
;
String beforeEncryption = nonce + timestamp + secret;
try {
SHA1.reset();
byte[] toEncrypt = beforeEncryption.getBytes("UTF-8");
SHA1.update(beforeEncryption.getBytes());
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException(uee);
}
byte[] encryptedRaw = SHA1.digest();
byte[] encoded = Base64.encodeBase64(encryptedRaw);
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update("password".getBytes());
BASE64Encoder encoder = new BASE64Encoder();
String senha = encoder.encode(digest.digest());
System.err.println(senha);
////////////////////////////////////
//////////END //////////////////////
////////////////////////////////////
CalculaServiceService ss = new CalculaServiceServiceLocator();
CalculaService service = ss.getCalculaServicePort();
String uri = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
String uriCrea = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
SOAPHeaderElement securityE = new SOAPHeaderElement(uri, "Security",
null);
SOAPHeaderElement tokenE = new SOAPHeaderElement(uri, "UsernameToken",
null);
SOAPHeaderElement userE = new SOAPHeaderElement(uri, "Username", null);
tokenE.setObjectValue(null);
securityE.setObjectValue(null);
userE.setValue("username");
SOAPHeaderElement pwdE = new SOAPHeaderElement(uri, "Password", null);
pwdE.addAttribute(uri, "Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
pwdE.setValue(senha);
SOAPHeaderElement nonceE = new SOAPHeaderElement(uri, "Nonce", null);
nonceE.addAttribute(uri, "EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest");
nonceE.setValue(nonce);
SOAPHeaderElement createdE = new SOAPHeaderElement(uriCrea, "Created", null);
createdE.setValue(timestamp);
tokenE.addChildElement(userE);
tokenE.addChildElement(pwdE);
tokenE.addChildElement(nonceE);
tokenE.addChildElement(createdE);
securityE.addChildElement(tokenE);
((Stub) service).setHeader(securityE);
service.calcula(13, 10, "somar");
}
ОК. Спасибо Матей. Я проверю это и сообщите здесь .... –
Хорошо ... не работает, теперь я получаю эту ошибку: Сообщение старше, чем разрешено MessageAge. Может быть, конфигурация сервера неправильная? Я это увижу. Есть идеи?? –
Линии timestamp = timestamp.substring (0, 19); и timestamp = timestamp + "Z"; вонять. Добавляя «Z» до конца, вы указываете, что значение времени находится в часовом поясе UTC. Попробуйте использовать временную метку, если она содержит часовой пояс, или указать GMT TZ при создании объекта календаря. Если время форматирования находится в другом часовом поясе, чем в UTC, вы фактически получите время в прошлом (если вы впереди) или в будущем. Вы должны убедиться, что будете использовать правильное значение времени (в период свежести), иначе сервер отклонит попытку аутентификации в качестве атаки повтора. См. Спецификацию профиля UsernameToken Profile, p7. – Matej