A verificação de assinatura para metadados SAML InCommon usando xmlsec1 falha

A verificação de assinatura para metadados SAML InCommon usando xmlsec1 falha

Federação InCommonfornece metadados de IdP e SP. Sua política de atualização recomenda a verificação frequente doagregado de metadadospara usar a versão mais recente. Eles recomendam fortemente SPs InCommonatualizar e verificar metadadospelo menos diariamente.

Seguindo as instruções fornecidas emConsumo de metadadospágina, faço download de um agregado e obtenho uma cópia autêntica do Certificado de Assinatura de Metadados.

Em seguida, devo "Verificar a assinatura XML nos metadados baixados". É aqui que estou tendo problemas. Consigo verificar os metadados baixadoscom o certificado x509 incorporado, mas não é possível verificar usando o certificado de assinatura de metadados baixado separadamente.

Eu tenho os dois arquivos baixados do InCommon:

  • XML:InCommon-metadata-idp-only.xml
  • chave de assinatura privada:inc-md-cert.pem

Achei que deveria ser capaz de executar o comando:

# xmlsec1 --verify \
     --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \
     --privkey-pem ./inc-md-cert.pem \
     ./InCommon-metadata-idp-only.xml

Isso falha ao dizer "Falha ao carregar a chave privada de ./inc-md-cert.pem". Posso verificar se contém uma chave válida usando openssl x509 -text -in ./inc-md-cert.pem. (e é legível e esse é o caminho correto.) Falha da mesma maneira se eu fizer referência a ele com --privkey-pemou --pubkey-pem.

Agora, se eu usar --pubkey-cert-pem ./inc-md-cert.pemem vez disso, ele roda sem erros, indicando OK SignedInfo References (ok/all): 1/1.

Mas não, está claramente ignorando minha chave de assinatura privada e simplesmente fazendo a verificação com base na chave incorporada no arquivo metadata.xml. (Posso remover o --pubkey-cert-pemargumento completamente e a verificação ainda funciona, usando o certificado x509 incorporado.

Atualizar

Dado que o arquivo de assinatura fornecido é autoassinado (pela organização), tentei adicioná-lo como um certificado confiável. Por exemplo, se você tentar a verificação básica com o openssl, compare:

# openssl verify ./inc-md-cert.pem
error 18 at 9 depth lookup:self signed certificate
# openssl verify -CAfile ./inc-md-cert.pem ./inc-md-cert.pem
./inc-md-cert.pem: OK

E daí se esse for o problema? Então eu tento adicionar a --trusted-pemopção

# xmlsec1 --verify \
     --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \
     --privkey-pem ./inc-md-cert.pem \
     --trusted-pem ./inc-md-cert.pem \
     ./InCommon-metadata-idp-only.xml
func=xmlSecOpenSSLAppKeyLoadBIO:file=app.c:line=263:
   obj=unknown:subj=PEM_read_bio_PrivateKey and PEM_read_bio_PUBKEY:
   error=4:crypto library function failed: 
func=xmlSecOpenSSLAppKeyLoad:file=app.c:line=153:
   obj=unknown:subj=xmlSecOpenSSLAppKeyLoadBIO:
   error=1:xmlsec library function failed:
   filename=/tmp/inc-md-cert.pem;errno=2
func=xmlSecAppCryptoSimpleKeysMngrKeyAndCertsLoad:file=crypto.c:line=118:
   obj=unknown:subj=xmlSecCryptoAppKeyLoad:
   error=1:xmlsec library function failed:uri=./inc-md-cert.pem
Error: failed to load public key from "./inc-md-cert.pem".
Error: keys manager creation failed

Erro fundamental da minha parte, presumo, pois não pode ser tão difícil: como uso uma chave externa (fornecida pela InCommon) para verificar a assinatura do arquivo de metadados (fornecida pela InCommon)?

Responder1

Uma solução, embora pareça um pouco insatisfatória:

a) Verifique o arquivo de metadados InCommonusando o certificado incorporado.

# xmlsec1  --verify --id-attr:ID \ 
        urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor  \
       ./InCommon-metadata-idp-only.xml
OK
SignedInfo References (ok/all): 1/1
Manifests References (ok/all): 0/0

b) Em seguida, basta comparar o certificado incorporado com o certificado baixado separadamente - eles devem corresponder ao módulo de espaço em branco. Observe que um ou outro certificado pode estar encadeado, o que você deve ignorar para fins de comparação.

Responder2

Depois de um pouco de esforço, descobri que você pode tentar adicionar --enabled-key-dataà sua linha de comando, por exemplo:

--enabled-key-data rsa ou --enabled-key-data x509

Qualquer um deles deve funcionar. Você também pode tentar

xmlsec1 --list-key-datapara ver aqueles que você pode escolher.

No seu caso parece que

xmlsec1 --verify \
  --enabled-key-data rsa \
  --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \
  --pubkey-cert-pem ./inc-md-cert.pem \
  ./InCommon-metadata-idp-only.xml

deve fazer o que quiser.

informação relacionada