
Federación en comúnproporciona metadatos de IdP y SP. Su política de actualización recomienda comprobar frecuentemente elagregado de metadatospara utilizar la versión más reciente. Recomiendan encarecidamente los SP InCommonactualizar y verificar metadatosal menos diariamente.
Siguiendo las instrucciones proporcionadas enConsumo de metadatospágina, descargo un agregado y obtengo una copia auténtica del Certificado de firma de metadatos.
Luego, debo "Verificar la firma XML en los metadatos descargados". Aquí es donde tengo problemas. Puedo verificar los metadatos descargados.con el certificado x509 incorporado, pero no se puede verificar utilizando el Certificado de firma de metadatos descargado por separado.
Tengo los dos archivos descargados de InCommon:
- XML:
InCommon-metadata-idp-only.xml
- clave de firma privada:
inc-md-cert.pem
Pensé que debería poder ejecutar el 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
Eso falla al decir "Error al cargar la clave privada desde ./inc-md-cert.pem". Puedo verificar que contiene una clave válida usando openssl x509 -text -in ./inc-md-cert.pem
. (y es legible, y esa es la ruta correcta). Falla de la misma manera si hago referencia a él con --privkey-pem
o --pubkey-pem
.
Ahora, si uso --pubkey-cert-pem ./inc-md-cert.pem
en su lugar, se ejecuta sin error, indicando OK SignedInfo References (ok/all): 1/1
.
Pero no, claramente está ignorando mi clave de firma privada y simplemente realizando una verificación basada en la clave incrustada en el archivo metadata.xml. (Puedo eliminar el --pubkey-cert-pem
argumento por completo y la verificación aún funciona utilizando el certificado x509 integrado.
Actualizar
Dado que el archivo de firma proporcionado está autofirmado (por la organización), intenté agregarlo como un certificado confiable. Por ejemplo, si intenta la verificación básica con 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
¿Y qué si ese es el problema? Así que intento agregar la --trusted-pem
opción
# 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
Supongo que hay un error fundamental de mi parte, ya que esto no puede ser tan difícil: ¿Cómo uso una clave externa (proporcionada por InCommon) para verificar la firma del archivo de metadatos (proporcionado por InCommon)?
Respuesta1
Una solución, aunque parece un poco insatisfactoria:
a) Verificar el archivo de metadatos InCommonusando el 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) Luego, simplemente compare el certificado incorporado con el certificado descargado por separado; deben coincidir, módulo de espacio en blanco. Tenga en cuenta que uno u otro certificado puede estar encadenado, lo que debe ignorar a efectos de comparación.
Respuesta2
Después de bastante lucha, descubrí que puedes intentar agregar --enabled-key-data
a tu línea de comando, por ejemplo:
--enabled-key-data rsa
o
--enabled-key-data x509
Cualquiera de esos debería funcionar. También puedes probar
xmlsec1 --list-key-data
para ver los que puedes elegir.
En tu 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
deberías hacer lo que quieras.