Я пытаюсь выполнить инициированный SP SAML 2.0 SLO в PHP, моя проблема: LogoutResponse код состояния AuthnFailed, следовательно, нет выхода IdP. Согласно информационной панели Okta (IdP), причиной является неверная подпись.
Я использую библиотеку безопасности robrichards / xmlseclibs и привязку POST. Запрос проверяется на https://www.samltool.com/validate_logout_req.php и через http://php.net/manual/en/domdocument.schemavalidate.php.
Вот моя украшенная просьба:
<?xml version="1.0" encoding="utf-8"?>
<samlp:LogoutRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"ID="_logout_1_5ab86804b6057"Version="2.0"Destination="https://dev-680804.oktapreview.com/app/catalystitdev680000_xxxx_1/exkeb8o4nbMQ7xxxxxxx/slo/saml"IssueInstant="2018-03-26T16:24:52+13:00">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://xxxxxxx/</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference>
<ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>5SXEPj5gyXWuf/BXfZ7QTVrUuJaF3Khh...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>TmAUPHY4rO...</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIFUzCCAzugAwIBAgI...</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">and...</saml:NameID>
<samlp:SessionIndex>_authn_5ab8680105723</samlp:SessionIndex>
</samlp:LogoutRequest>
Вот как я создал свой pkey и crt:
#!/bin/bash
# https://github.com/mattermost/docs/blob/master/source/scripts/generate-certificates/gencert.md
umask 377
certname="${CRT_FILENAME:-"nzta-x509"}"openssl x509 \
-in <(
openssl req \
-days 3650 \
-newkey rsa:4096 \
-nodes \
-keyout "${certname}.key" \
-subj "/C=${CRT_C:-"NZ"}/L=${CRT_L:-"Wellington"}/O=${CRT_O:-"XXXX"}/OU=${CRT_OU:-"Sysadmins"}/CN=${CRT_CN:-"xxxx-xxxx"}") \
-req \
-signkey "${certname}.key" \
-sha256 \
-days 3650 \
-out "${certname}.crt" \
-extfile <(echo -e "basicConstraints=critical,CA:true,pathlen:0")
chmod 600 ${certname}.crt
У меня заканчиваются идеи. Как я могу получить больше контекста ошибки. «Неверная подпись» мне мало помогает …
«Неверная подпись» означает, что LogoutRequest не подписан должным образом. Типичные проблемы:
Спасибо Zeitgeist. Я нашел хороший инструмент для этого:
xmlsec1 --verify LogoutRequest.xml
Вывод довольно многословный, давая мне много чего пережевать:
func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=360:obj=x509-store:subj=X509_verify_cert:error=4:crypto library function failed:subj=/C=NZ/L=Wellington/O=XXX/OU=Sysadmins/CN=xxx-xxx;err=18;msg=self signed certificate
func=xmlSecOpenSSLX509StoreVerify:file=x509vfy.c:line=408:obj=x509-store:subj=unknown:error=71:certificate verification failed:err=18;msg=self signed certificate
func=xmlSecKeysMngrGetKey:file=keys.c:line=1370:obj=unknown:subj=xmlSecKeysMngrFindKey:error=1:xmlsec library function failed:
func=xmlSecDSigCtxProcessKeyInfoNode:file=xmldsig.c:line=871:obj=unknown:subj=unknown:error=45:key is not found:
func=xmlSecDSigCtxProcessSignatureNode:file=xmldsig.c:line=565:obj=unknown:subj=xmlSecDSigCtxProcessKeyInfoNode:error=1:xmlsec library function failed:
func=xmlSecDSigCtxVerify:file=xmldsig.c:line=366:obj=unknown:subj=xmlSecDSigCtxSignatureProcessNode:error=1:xmlsec library function failed:
Error: signature failed
ERROR
SignedInfo References (ok/all): 1/1
Manifests References (ok/all): 0/0
Error: failed to verify file "LogoutRequest.xml"