Как подписать утверждение saml 2.0 с помощью файла openssl (.PCKS8)

Привет, мне нужна информация о запросе аутентификации saml 2.0. Я хочу подписать свой запрос авторизации с помощью файла *.pkcs8, созданного openssl. Я могу сделать с файлом хранилища ключей, используя java keytool. Но я хочу добиться того же, используя создание файла *.PKCS8 с помощью openssl. Я боролся с этим в течение некоторого времени. Я могу сгенерировать xml с ним.

// Запрос аутентификации...

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" AssertionConsumerServiceURL="http://localhost:8080/sp/AssertionConsumerService" Destination="http://localhost:8080/idp/SingleSignOnService" ID="95cc3943-67dd-43ef-809b-2ccd8bd3e4e9" IssueInstant="2013-04-26T12:18:48.799Z" Version="2.0">
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">sp</saml:Issuer>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
      <ds:Reference URI="#95cc3943-67dd-43ef-809b-2ccd8bd3e4e9">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
            <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" 
              PrefixList="ds saml samlp"/>
           </ds:Transform>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
        <ds:DigestValue>2HkVe/KnVzcMgneRUItjq2V/FEA=</ds:DigestValue>
       </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>
           NjCxy8R3NjkN8B932FJolGTqtYTBBTLboHUo7ZqEXxICUW/ZhOV2Pwe+c4R0/TrPqBPVZBItlXyv
           at3edIMrr7RlEFGy3rt7pPVRXUcmF6jtDZajCpwwaEKKD--REMOVED SOME CODE------------
           egb8dua65WhY1KkugNPG4FWTVhtzul/CBo9a8vN/ZuXRbZQ6sUWbq1BFgC6Zmw8kr1aUNBwqRi7r
           ZNPXcGVhXuFQTTV4Kuc1eiI1lgANKLTrkCBRSw==
   </ds:SignatureValue>
  </ds:Signature>
</samlp:AuthnRequest>

// КОНЕЦ

Я не могу получить значения keyInfo и x509data и сертификата, которые мне удалось получить с помощью java keytool.

    <ds:KeyInfo>
      <ds:X509Data>
        <ds:X509Certificate>hZB2kOYypWs33Bs2BTaKZOKGig0CAwEAATANBgkqhkiG9w0BAQUFAAOB
         gQB3Cfe0iTfrXY9E22TFy5b87kwpDKjLopNLtX3kqSUlfjnbN5tYN4zr91H5dZUkuFF83z7ztzKi
         zkcxiMgVVQkU2X1bn5SdErvmS7aEcG8+5TdlO5bf+8as04u5qug+oQun5s1t9mSvaF7Ol5CX/gkp
         EUTjXx28kldbY7ETgDUrSw==</ds:X509Certificate>
      </ds:X509Data>
     </ds:KeyInfo>
   </ds:Signature>

Также скажите, завершен ли мой запрос на аутентификацию. Также является одинаковым запрос Authn для сообщения Artifact и POST (Assertion) saml.

ПОМОГИТЕ ПОЖАЛУЙСТА!!!


person vinay jalalpuram    schedule 06.05.2013    source источник


Ответы (2)


Как вы создаете свой объект org.opensaml.xml.security.credential.Credential? Вы можете загрузить закрытый ключ только из файла PKCS8. Вам по-прежнему нужен открытый ключ для полного создания объекта Credential. Если ваш открытый ключ хранится в байтах, закодированных DER, вы можете использовать следующий код для создания Credential и используйте его, чтобы подписать запрос

/**
 * Load privateKeyDerBytes from PKCS8 file and publicKeyDerBytes from .cer, .crt, .der files
 */
private static Credential getCredential(byte[] privateKeyDerBytes , byte[] publicKeyDerBytes) throws IOException
{
    PrivateKey privateKey = PKCS8Key.parse(new DerValue( privateKeyDerBytes ));
    PublicKey publicKey = X509Key.parse(new DerValue(publicKeyDerBytes));
    BasicCredential basicCredential = new BasicCredential();
    basicCredential.setUsageType(UsageType.SIGNING);
    basicCredential.setPrivateKey(privateKey);
    basicCredential.setPublicKey(publicKey);
    return basicCredential;
}

public static void signAssertion(Assertion assertion , byte[] privateKeyDerBytes , byte[] publicKeyDerBytes) throws IOException, SecurityException
{
    // get Credential 
    Credential credential = getCredential(privateKeyDerBytes, publicKeyDerBytes);
    // create Signature
    Signature signature = (Signature) Configuration.getBuilderFactory().getBuilder(
            Signature.DEFAULT_ELEMENT_NAME).buildObject(
            Signature.DEFAULT_ELEMENT_NAME);

    signature.setSigningCredential(credential);
    signature
            .setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1);
    signature
            .setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
    signature.setKeyInfo(getKeyInfo(credential));

    assertion.setSignature(signature);

}

public static KeyInfo getKeyInfo(Credential credential)
        throws SecurityException {
    SecurityConfiguration secConfiguration = Configuration
            .getGlobalSecurityConfiguration();
    NamedKeyInfoGeneratorManager namedKeyInfoGeneratorManager = secConfiguration
            .getKeyInfoGeneratorManager();
    KeyInfoGeneratorManager keyInfoGeneratorManager = namedKeyInfoGeneratorManager
            .getDefaultManager();
    KeyInfoGeneratorFactory factory = keyInfoGeneratorManager
            .getFactory(credential);
    KeyInfoGenerator generator = factory.newInstance();
    return generator.generate(credential);

}
person nadirsaghar    schedule 17.05.2013
comment
спасибо, Надирсагар. Я проверю ваше предложение и свяжусь с вами. - person vinay jalalpuram; 21.05.2013

Вы можете использовать это для вывода ключевой информации

X509KeyInfoGeneratorFactory fact = new X509KeyInfoGeneratorFactory();
fact.setEmitEntityCertificate(true);
signature.setKeyInfo(fact.newInstance().generate(cred));
person Stefan Rasmusson    schedule 07.05.2013
comment
Просто чтобы подтвердить, что я делаю это таким образом. 'Подпись подписи = (Подпись) Configuration.getBuilderFactory() .getBuilder(Signature.DEFAULT_ELEMENT_NAME) .buildObject(Signature.DEFAULT_ELEMENT_NAME); X509KeyInfoGeneratorFactory fact = new X509KeyInfoGeneratorFactory(); факт.setEmitEntityCertificate (истина); попробуйте {signature.setKeyInfo(fact.newInstance().generate(signingCredential)); } catch (SecurityException e) { // TODO Автоматически сгенерированный блок catch e.printStackTrace(); } samlMessage.setSignature(подпись);' - person vinay jalalpuram; 07.05.2013
comment
Это то, что вы делаете раньше? - person Stefan Rasmusson; 07.05.2013
comment
Нет . Я просто взял ваш код и попытался добавить его таким образом. но не генерируется необходимая информация о ключе (с x506cert). На самом деле нужно установить Keyinfo в учетные данные. возможно или нет я не уверен - person vinay jalalpuram; 07.05.2013
comment
как только я получу учетные данные для подписи. Вот мой код для кодирования и отправки запроса аутентификации. - person vinay jalalpuram; 07.05.2013
comment
HttpServletResponseAdapter outTransport = новый HttpServletResponseAdapter (ответ, ложь); BasicSAMLMessageContext messageContext = new BasicSAMLMessageContext(); messageContext.setOutboundMessageTransport(outTransport); messageContext.setPeerEntityEndpoint (конечная точка); messageContext.setOutboundSAMLMessage(samlMessage); messageContext.setOutboundMessageIssuer(issuingEntityName); messageContext.setRelayState(clientId); messageContext.setOutboundSAMLMessageSigningCredential (signingCredential); encoder.encode (messageContext); - person vinay jalalpuram; 07.05.2013
comment
Вы пытались проверить подпись после установки keyinfo? что-нибудь установлено? - person Stefan Rasmusson; 07.05.2013
comment
Неверный файл pcks. В чем может быть проблема . Я предполагаю, что файл .pcks8 имеет неправильную форму. На самом деле я не генерировал is . :( - person vinay jalalpuram; 07.05.2013