Ir para o conteúdo
foopo

Problema com pedido SAML2

Mensagens Recomendadas

foopo

Antes de mais saudações a todos, este é o meu primeiro tópico!

Ando com um problema num pedido em SAML2, na verdade nunca fiz nada ligado a web-services ou do género... Acontece que tenho um pedido de autenticação para fazer ao Fornecedor de autenticação, que para quem não sabe é o servidor "responsável" na obtenção de dados dos cidadões em portugal através do cartão de cidadão. Já tive a ler a documentação que eles têm, mas como já estou perto de dois dias sem nehum sucesso... Aqui vai o que tenho feito até agora:

date_default_timezone_set("UTC");
$data=date("Y-m-d", time());
$hora=date("H:i:s",time());
$timeStamp=$data.'T'.$hora."Z"; //timestamp UTC para o pedido
$id = "_".md5(rand()); //id único para o pedido
$certx509 = file_get_contents('certificado.cer');
$certx509 = base64_encode($certx509);

//pedido em saml2
$saml_request='<samlp:AuthnRequest
 ID="'.$id.'"
 Version="2.0"
 IssueInstant="_'.$timeStamp.'"
 Destination="https://autenticacao.teste.cartaodecidadao.gov.pt/fa/Default.aspx"
 ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
 AssertionConsumerServiceURL="endereço da entidade para resposta"
 ProviderName="Nome da entidade que pede o serviço"
 xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">endereço da entidade</saml:Issuer>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#'.$id.'">
<Transforms>
 <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
 <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
 <InclusiveNamespaces PrefixList="#default samlp saml ds xs xsi"
	 xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
 </Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>oypLiC5MkXdKFbs0pA25Z/mt4jk=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>...signatureValue...</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>'.$certx509.'</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
<samlp:Extensions>
<fa:RequestedAttributes xmlns:fa="http://autenticacao.cartaodecidadao.pt/atributos">
<fa:RequestedAttribute Name="AttributeName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrnameformat:
uri" isRequired="true"/>
</fa:RequestedAttributes>
</samlp:Extensions>
</samlp:AuthnRequest>';
//echo($saml_request);

$saml_request=base64_encode($saml_request);
?>
<form action="https://autenticacao.teste.cartaodecidadao.gov.pt/fa/Default.aspx"method="post">
<input type="hidden" name="SAMLRequest" value="<?=$saml_request?>"/>
<input type="hidden" name="RelayState" value="pedido teste" />
<button>Fazer Pedido</button>
</form>

Ora suscitam-me dúvidas os campos do certificado (julgo que terá que ser o meu), signatureValue (não foi acordado nenhum tipo de assinatura em ambos os lados... tou na dúvida ) e não sei se faltará algo, ou algo que estará incorreto. E depois é converter tudo para base64 e enviar por post, é só?

Qualquer ajuda será bem-vinda, obrigado.

Editado por Rui Carlos
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Tens aí um SignedInfo, pelo que assumo que o SignatureValue seja a assinatura do digest lá contido (pressuponho que o digest tenha sido obtido com o SHA1, e que vá ser assinado com RSA).

Não percebi muito bem de onde é que o digest aparece. Pressuponho que venha da mensagem/pedido que estás a tentar enviar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
foopo

Boas Rui, antes de mais obrigado pela tua resposta. O que postei do Signature, foi um exemplo que retirei do manual de apoio deles e o valor do digest vinha lá incluido. E o que quero é precisamente construir a assinatura e não sei como (à excepção do certificado que julgo ser fazer base64 ao certificado da minha entidade e concatenar ao pedido). Ora eu tenho uma chave pública deles, tenho de usar isso para criar a assinatura e o digest? Não sei como... Ando a ler esta documentação, http://www.w3.org/TR/xmldsig-core/, mas estou algo confuso...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Penso que a questão deve ser sobretudo de onde vem o digest, e também não te sei responder a essa questão. A assinatura deverá ser feita com uma chave privada da tua entidade, pois o objectivo é garantir a integridade de algo que vocês estão a enviar (e depois envias o certificado com a vossa chave pública, para que quem recebe a mensagem possa verificar a sua autenticidade).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
foopo

Bem encontrei algo na net que diz como criar o valor do digest, é algo como fazer: 1-canolization do próprio xml, 2-aplicar o sha e seguidamente base64. Para construir o valor da assinatura é que não sei. Achas que será aplicar canolization à chave privada e seguidamente aplicar o algoritmo sha e incluir o resultado no siganatureValue?

Editado por foopo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
foopo

Boas Rui. Arranjei uma biblioteca que faz a assinatura, embora ainda tenha de perceber o que será ao certo o <Reference URI> e se terá implicações diretas no valor da assinatura e digest, já que essa mesma biblioteca não me gera esse elemento.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.