
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-pem
ou --pubkey-pem
.
Agora, se eu usar --pubkey-cert-pem ./inc-md-cert.pem
em 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-pem
argumento 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-pem
opçã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-data
para 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.