2012-05-14 3 views
2

парень, 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"); 
} 

ответ

3

стандарт WS-Security определяет пароль переваривать в Base64 (SHA-1 (нонса + созданный + пароль)).

Вы отражаете это правильно хэширование содержания beforeEncryption переменных и сохранить результат в encryptedRaw и затем base64 закодировать его кодируется переменное. Все идет нормально. Но переменная , закодированная, нигде не используется. По какой-то причине вы вычисляете второй дайджест base64 (sha1 («пароль»)) и сохраняете его до переменной senha, которая используется позже для заполнения элемента WSS Password.

Полностью удалить код, который вычисляет второй переварить и использовать содержание кодируемого переменной:

Концептуально, изменить pwd.setValue() от:

pwdE.setValue(senha) 

Кому:

pwdE.setValue(encoded) 

и убедитесь, что закодирован переменной будет строка, а не массив байтов.

Кроме того, вы должны рассмотреть возможность использования лучшего значения для nonce, чем хеш-код объекта.

+0

ОК. Спасибо Матей. Я проверю это и сообщите здесь .... –

+0

Хорошо ... не работает, теперь я получаю эту ошибку: Сообщение старше, чем разрешено MessageAge. Может быть, конфигурация сервера неправильная? Я это увижу. Есть идеи?? –

+0

Линии timestamp = timestamp.substring (0, 19); и timestamp = timestamp + "Z"; вонять. Добавляя «Z» до конца, вы указываете, что значение времени находится в часовом поясе UTC. Попробуйте использовать временную метку, если она содержит часовой пояс, или указать GMT TZ при создании объекта календаря. Если время форматирования находится в другом часовом поясе, чем в UTC, вы фактически получите время в прошлом (если вы впереди) или в будущем. Вы должны убедиться, что будете использовать правильное значение времени (в период свежести), иначе сервер отклонит попытку аутентификации в качестве атаки повтора. См. Спецификацию профиля UsernameToken Profile, p7. – Matej

 Смежные вопросы

  • Нет связанных вопросов^_^