2015-03-30 3 views
1

Я пытаюсь выполнить проверку подписи на ответе SAML2, который получен от поставщика удостоверений с использованием OpenSAML. Я пытаюсь прочитать ответ из локальной файловой системы.Подпись криптографическая валидация не успешна opensaml

Вот мой код:

DefaultBootstrap.bootstrap(); 
    BasicParserPool ppMgr = new BasicParserPool(); 
    ppMgr.setNamespaceAware(true); 

//Read file from the filesystem 

File file1=new File("F:/Softwares/Assertion.xml"); 
InputStream inCommonSaml=new FileInputStream(file1); 

// Parse file 
Document inCommonSamlDoc = ppMgr.parse(inCommonSaml); 
Element metadataRoot = inCommonSamlDoc.getDocumentElement(); 
UnmarshallerFactory unmarshallerFactory=configuration.getUnmarshallerFactory(); 
Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(metadataRoot); 
Response inCommonSamlRes = (Response) unmarshaller.unmarshall(metadataRoot); 

    //Get certificate 
    SignatureValidator signatureValidator = new SignatureValidator(cert); 
    Signature signature=inCommonSamlRes.getSignature(); 
    signatureValidator.validate(signature); 


    try { 
     BasicX509Credential credential = new BasicX509Credential(); 

     File file2=new File("F:/Softwares/publicKey.crt"); 
     InputStream samlCertificate=new FileInputStream(file2);   
      CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
     //  
      @SuppressWarnings("deprecation") 
      java.security.cert.X509Certificate certificate = (java.security.cert.X509Certificate) certificateFactory.generateCertificate(samlCertificate); 
      // 

      X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec((certificate).getPublicKey().getEncoded()); 
      KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
      PublicKey key = keyFactory.generatePublic(publicKeySpec); 


      credential.setPublicKey(key); 
      Object obj = (credential).getPublicKey(); 
      if (obj instanceof RSAPublicKey) { 
       BigInteger modulus = ((RSAPublicKey) obj).getModulus(); 
       BigInteger exponent = ((RSAPublicKey) obj).getPublicExponent(); 
       System.out.println("modulus"); 
       System.out.println (org.apache.commons.codec.binary.Base64.encodeBase64String(modulus.toByteArray())); 
       System.out.println("public exponent:"); 
       System.out.println (org.apache.commons.codec.binary.Base64.encodeBase64String(exponent.toByteArray())); 

    } 
    //  System.out.println ("public key is: //n//r"+ credential.getPublicKey()); 
      return credential; 



    } catch (Exception e) { 
     throw e; //Throws a 'Signature did not validate against the credential's key' exception 
    } 

Примечание: Я использую тот же сертификат (publicKey.crt) подписать утверждение также.
Я получаю следующую ошибку: Подпись криптографическая проверка не удалась.

Пожалуйста, дайте мне знать, где я ошибаюсь? Что означает ошибка? Говорит ли он, что общедоступные и закрытые ключи одинаковы?

Спасибо, Ашвиньте J

+0

Можете ли вы опубликовать assertion.xml on gist? –

ответ

0

Я думаю, что вам нужно, чтобы получить .jks файл из IdP сервера (Идентичность Provider). Также, когда вы получаете SAMLResponse для вашего POST из IDP, этот SAMLResponse должен содержать подпись (FYI - будет кодированной строкой, вы можете декодировать и читать с использованием библиотеки Open SAML, доступной в центральном репозитории Maven). После того, как вы получите подпись, вы можете проверить, что с помощью OpenSAML

sigValidator.validate(response.getSignature()); 

Этот метод даст вам meesage, если все в порядке. Сообщение для справки «Подпись подтверждено с ключом от поставляемой credentia»

Вы можете по этой ссылке: http://sureshatt.blogspot.in/2012/11/how-to-read-saml-20-response-with.html, чтобы получить подпись и

(IMP): Ваш IDP (Идентичность Provider) следует отправить (может быть через HTTP POST), так что вы можете получить, у которого может быть NameID, то есть ClinetId

+0

.jks? Вы имеете в виду клавиши java? Как его получить? Я использую Java-инструмент как поставщик удостоверений. Спасибо – Ashwini

+0

Нет, его созданный keytool. Какой IDP (поставщик удостоверений) вы используете? В моем приложении я использую WSO2 IDP с файлом wso2carbon.jks. Этот файл содержит общедоступные и закрытые ключи ... PrivateKey со мной и с открытыми ключами с сервером, они являются ключевыми для идентификации личности друг друга, – Prateek

0

Этот ответ предназначен для входящих людей, которые получают эту ошибку и ищут в Google.

В моем случае я столкнулся с той же ошибкой: «ошибка: подпись криптографическая проверка не увенчалась успехом», с немного иным случаем. Я проверки с SimpleSamlPHP в SP и CAS в IDP.

Проблема заключалась в том, что мой SP использует один (самоподписанного) сертификата для SP проверки на IDP, а другой сертификат для SP в Apache, чтобы позволить SSL (так что я могу иметь протокол HTTPS)

Использование два отдельных сертификата могут отлично работать для многих процессов, таких как проверка имени входа и метаданных, но при этом, например, при выходе из системы, произошла ошибка выше.

Решение состоит в том, чтобы использовать только один сертификат для обоих процессов, и моя ошибка исчезла.