Jump to content
foopo

Problema com pedido SAML2

Recommended Posts

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.

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other 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?

Edited by foopo

Share this post


Link to post
Share on other sites
Rui Carlos

A assinatura é obtida com o RSA usando a vossa chave privada (e depois incluis a chave pública no certificado que também envias na mensagem).

(Na net encontram-se alguns exemplos de código para Java, mas não encontrei nada para PHP.)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.