Создание подписанного запроса SAML2 LogOut

Моя цель - реализовать протокол Single Log Out Protocol. Сначала я понимаю, как работает этот протокол и как я могу применить его в моем сценарии: ADFS 2.0 как IdP, для меня это как "черный ящик"

На данный момент я делаю следующее:

  1. Отправляю моему IdP

  2. IdP запрашивает у меня учетные данные, я предоставляю их и получаю успешный логин.

  3. Получаю значение SessionIndex и создаю

myhostmyemail@mydomain.com_0628125f-7f95-42cc-ad8e-fde86ae90bbe

  1. Возьмем приведенный выше и закодируем его в Base64

  2. Получим следующую строку: SAMLRequest=base64encodedRequest&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1

  3. С помощью вышеуказанной строки генерируется подпись

  4. Кодируем подпись в base64

  5. Отправляем запрос: https://"https://idphost/adfs/ls/?SAMLRequest=base64encodedRequest&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1&Signature=base64EncodedSignature

Но IdP мне отвечает: Проверка подписи SAML-сообщения не удалась.

Для подписи я использую свой закрытый ключ (2048 байт), а для проверки предполагается, что IdP использует мой открытый ключ (тот, который я отправил ему при регистрации хоста)

Код для подписи запроса выглядит так:

// Retrieve the private key
KeyStore keyStore = KeyStore.getInstance("JKS", "SUN");
FileInputStream stream;
stream = new FileInputStream("/path/to/my/keystore.jks");
keyStore.load(stream, "storepass".toCharArray());
PrivateKey key = (PrivateKey) keyStore.getKey("keyAlias","keyPass".toCharArray());

// Create the signature
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(key);
signature.update("SAMLRequest=jVJda8IwFH2e4H8ofW%2BbVmvboGWCDApusDn2sBdJm1sNtEmXmw7x1y92KDrY2Ov5uueEzJG1TUfXaqd68wIfPaBxDm0jkQ7Mwu21pIqhQCpZC0hNRTfLxzWNfEI7rYyqVONeWf52METQRijpOsVq4W7JoSzjJJnWAEAmwLMMpmRG0jCrYJICIcR13kCjdSxcG%2BA6K9tQSGYGZG9MhzQIGrUT0uPw6VegpV%2FtA8ZrDBq0ZxB7KCQaJo2NICT1yMwjk9cwonFG4%2BTdzceju%2FmpOx3EOu8qYThgGJ3j5sE1fZE%2F2X3FynlQumXm9%2BGhHw6I4F49SCm0TDRLzjWgrXiKee5ZI2oB%2Bj%2Bj8qYX6GvFtdj1cPRryzPJ4Xh%2F2%2Fe736VvRzf2nn24wmoP%2BZbMojSM4tpL6iz2plFVeYyn4NUc0hmDjJQlfCf9cI5HZ%2Fjm4%2BRf&RelayState=null&SigAlg=http%3A%2F%2Fwww.w3.org%2F2000%2F09%2Fxmldsig%23rsa-sha1".getBytes());

String signatureBase64encodedString = (new BASE64Encoder()).encodeBuffer(signature.sign());
14
задан Dani 22 November 2012 в 18:07
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: