2015-07-14 1 views
1

Я совершенно новый для SAML, я просто создаю saml, но для каждого требования мне также нужно добавить узлы сертификатов KeyInfo и x509, включая публичный сертификат клиента, я использовал ниже кода для генерации элемента подписи, но не знаю, как добавить KeyInfo & X509Data внутри подписи. нужна помощь в этом?Как добавить KeyInfo & X509Data под Signature в SAML 2.0 с помощью Java

BasicX509Credential signingCredential = new BasicX509Credential(); 
    //Namespace nameSpaceSAML = new Namespace("http://www.w3.org/2000/09/xmldsig#","ds"); 
    KeyStore keyStore = getKeyStore(signingKeyStorePath,signingKeyStorePassword); 
    PrivateKey privateKey = getPrivateKey(keyStore,signingKeyalias,signingKeyStorePassword); 
    signingCredential.setPrivateKey(privateKey); 
    signature = (Signature) Configuration.getBuilderFactory().getBuilder(Signature.DEFAULT_ELEMENT_NAME).buildObject(Signature.DEFAULT_ELEMENT_NAME); 
    signature.setSigningCredential(signingCredential); 
    signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1); 
    signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS); 

ответ

0

Для тех, кто ищет ответ, как я понял, решение, чтобы добавить элементы KayInfo вместе с X509Data, как показано ниже, и она работает отлично ...

KeyInfo keyInfo=(KeyInfo)Configuration.getBuilderFactory().getBuilder(KeyInfo.DEFAULT_ELEMENT_NAME).buildObject(KeyInfo.DEFAULT_ELEMENT_NAME); 
     X509Data data=(X509Data)Configuration.getBuilderFactory().getBuilder(X509Data.DEFAULT_ELEMENT_NAME).buildObject(X509Data.DEFAULT_ELEMENT_NAME); 
     X509Certificate cert=(X509Certificate)Configuration.getBuilderFactory().getBuilder(X509Certificate.DEFAULT_ELEMENT_NAME).buildObject(X509Certificate.DEFAULT_ELEMENT_NAME); 
     signature.setSigningCredential(signingCredential); 
     value=org.apache.xml.security.utils.Base64.encode(signingCredential.getEntityCertificate().getEncoded()); 
     cert.setValue(value); 
     data.getX509Certificates().add(cert); 
     keyInfo.getX509Datas().add(data); 
     signature.setKeyInfo(keyInfo); 
2

Если вы хотите меньше кода, для этого есть вспомогательный класс для подписей.

X509KeyInfoGeneratorFactory x509Factory = new X509KeyInfoGeneratorFactory(); 
x509Factory.setEmitEntityCertificate(true); 
x509Factory.setEmitEntityCertificateChain(true); 
x509Factory.setEmitX509IssuerSerial(true); 
x509Factory.setEmitX509SubjectName(true); 

Configuration.getGlobalSecurityConfiguration().getKeyInfoGeneratorManager().registerFactory("x509emitingKeyInfoGenerator", x509Factory); 

SecurityHelper.prepareSignatureParams(signature, SPCredentials.getCredential(), null, "x509emitingKeyInfoGenerator"); 

Это устанавливает KeyInfo, подписывая алгоритмы и т.д. Использование методов setEmit на заводе, чтобы установить, что должно быть добавлено к KeyInfo

Для получения более подробной информации читайте my blog post on it. Я также написал book on OpenSAML, где я объясняю функции подписи и шифрования и более подробно.

+0

Спасибо @Stefan, это сработало. Я также ищу, что приведенные ниже элементы являются частью , но не могут получить информацию об этом. ' CN = VeriSign Класс 3 Secure Server CA - G3, OU = Условия использования на https://www.verisign.com/rpa (c) 10, OU = VeriSign Trust Network, O = «VeriSign, Inc.», C = US 147750819997667206557338217414016145916 'Можете ли вы пожалуйста, помогите мне, как добавить этот дополнительный элемент. – Rakesh

+0

Обновлен ответ. Удачи! –

+0

bravo !. пытался с нескольких дней. отлично работает –

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