Мы получаем стандартное утверждение SAML 2.0 от поставщика идентификации, и я не могу его проверить, используя только пример кода примера ColdFusion 9, который существует в Интернете.Не удалось проверить утверждение SAML с ColdFusion
Код, приведенный ниже, можно найти в Интернете в качестве примера того, как проверить SAML с ColdFusion. См. Эту страницу: http://blog.tagworldwide.com/?p=19
SAML XML отправляется нам как сообщение формы. У нас есть страница, настроенная для обнаружения входящего утверждения. Соответствующий код приведен ниже:
xmlResponse = getHttpRequestData().content.Trim();
docElement = XmlParse(variables.xmlResponse);
Init = CreateObject("Java", "org.apache.xml.security.Init").Init().init();
SignatureConstants = CreateObject("Java", "org.apache.xml.security.utils.Constants");
SignatureSpecNS = SignatureConstants.SignatureSpecNS;
xmlSignatureClass = CreateObject("Java", "org.apache.xml.security.signature.XMLSignature");
xmlSignature = xmlSignatureClass.init(docElement.getElementsByTagNameNS(SignatureSpecNS,"Signature").item(0),"");
keyInfo = xmlSignature.getKeyInfo();
X509CertificateResolverCN = "org.apache.xml.security.keys.keyresolver.implementations.X509CertificateResolver";
keyResolver = CreateObject("Java", X509CertificateResolverCN).init();
keyInfo.registerInternalKeyResolver(keyResolver);
x509cert = keyInfo.getX509Certificate();
isValid = xmlSignature.checkSignatureValue(x509cert);
ColdFusion-не имеет встроенную библиотеку для обработки проверки x509, так что две библиотек Java были импортированы в нашу установку ColdFusion. Они пришли из проекта Apache Santuario. К ним относятся:
- сериализатору-2.7.1.jar
- xmlsec-1.5.3.jar
код работает просто отлично, но он всегда выдает "НЕТ", подпись не действительный. Я уверен, что это утверждение должно быть правильным.
Я признаю, что здесь просто кодирование груза, поскольку я недостаточно хорошо знаком с Java, чтобы действительно понять, что здесь происходит.
Я пробовал все, что мог придумать. Может ли кто-нибудь предложить какие-либо советы или идеи о том, что проверить или что изменить, чтобы продолжить поиск неисправностей?
== UPDATE 1 - Добавлено SAML утверждение Пример ==
В этом примере утверждение из Salesforce.com практически идентичен по формату, который мы получаем. Да, наше утверждение включает в себя открытый ключ, как это делает (хотя и усеченный здесь).
<samlp:Response ID="_257f9d9e9fa14962c0803903a6ccad931245264310738" IssueInstant="2009-06-17T18:45:10.738Z" Version="2.0">
<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">
https://www.salesforce.com
</saml:Issuer>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
<saml:Assertion ID="_3c39bc0fe7b13769cab2f6f45eba801b1245264310738"
IssueInstant="2009-06-17T18:45:10.738Z" Version="2.0">
<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">
https://www.salesforce.com
</saml:Issuer>
<saml:Signature>
<saml:SignedInfo>
<saml:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<saml:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<saml:Reference URI="#_3c39bc0fe7b13769cab2f6f45eba801b1245264310738">
<saml:Transforms>
<saml:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<saml:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="ds saml xs"/>
</saml:Transform>
</saml:Transforms>
<saml:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<saml:DigestValue>vzR9Hfp8d16576tEDeq/zhpmLoo=
</saml:DigestValue>
</saml:Reference>
</saml:SignedInfo>
<saml:SignatureValue>
AzID5hhJeJlG2llUDvZswNUrlrPtR7S37QYH2W+Un1n8c6kTC
Xr/lihEKPcA2PZt86eBntFBVDWTRlh/W3yUgGOqQBJMFOVbhK
M/CbLHbBUVT5TcxIqvsNvIFdjIGNkf1W0SBqRKZOJ6tzxCcLo
9dXqAyAUkqDpX5+AyltwrdCPNmncUM4dtRPjI05CL1rRaGeyX
3kkqOL8p0vjm0fazU5tCAJLbYuYgU1LivPSahWNcpvRSlCI4e
Pn2oiVDyrcc4et12inPMTc2lGIWWWWJyHOPSiXRSkEAIwQVjf
Qm5cpli44Pv8FCrdGWpEE0yXsPBvDkM9jIzwCYGG2fKaLBag==
</saml:SignatureValue>
<saml:KeyInfo>
<saml:X509Data>
<saml:X509Certificate>
MIIEATCCAumgAwIBAgIBBTANBgkqhkiG9w0BAQ0FADCBgzELM
[Certificate truncated for readability...]
</saml:X509Certificate>
</saml:X509Data>
</saml:KeyInfo>
</saml:Signature>
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">
[email protected]
</saml:NameID>
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml:SubjectConfirmationData NotOnOrAfter="2009-06-17T18:50:10.738Z"
Recipient="https://login.www.salesforce.com"/>
</saml:SubjectConfirmation>
</saml:Subject>
<saml:Conditions NotBefore="2009-06-17T18:45:10.738Z"
NotOnOrAfter="2009-06-17T18:50:10.738Z">
<saml:AudienceRestriction>
<saml:Audience>https://saml.salesforce.com</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AuthnStatement AuthnInstant="2009-06-17T18:45:10.738Z">
<saml:AuthnContext>
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified
</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
<saml:AttributeStatement>
<saml:Attribute Name="portal_id">
<saml:AttributeValue xsi:type="xs:anyType">060D00000000SHZ
</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="organization_id">
<saml:AttributeValue xsi:type="xs:anyType">00DD0000000F7L5
</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="ssostartpage"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml:AttributeValue xsi:type="xs:anyType">
http://www.salesforce.com/security/saml/saml20-gen.jsp
</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="logouturl"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<saml:AttributeValue xsi:type="xs:string">
http://www.salesforce.com/security/del_auth/SsoLogoutPage.html
</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
</samlp:Response>
== UPDATE 2 - Используется Keytool добавить открытый ключ Java хранилища ключей ==
Добавленные открытый ключ для Java файл хранилища ключей "cacerts" с помощью команды Keytool. Я вижу, что открытый ключ теперь добавлен в наш файл cacerts и что сертификат помечен как «доверенный».
Мы отправили их открытый ключ в файл * .pem, поэтому я использовал его для добавления своего ключа в хранилище ключей. Я также попытался преобразовать файл * .pem в файл * .der и импортировать его. Оба отлично работали. Однако мой код по-прежнему возвращает «НЕТ» для isValid. Тьфу.
Открытый ключ в файле * .pem точно соответствует открытому ключу, который входит в утверждение SAML.
Вы выполнили какую-либо конфигурацию, отличную от фрагмента кода выше? Я не знаю ColdFusion, но вам нужно каким-то образом зарегистрировать или ссылаться на известный открытый ключ из IdP, чтобы ваш Java-код мог разрешить и убедиться, что цифровая подпись действительна или фактически создана из личного ключа IdP. В других серверах (например, серверы приложений JavaEE) это обычно шаг конфигурации для «импорта» открытого ключа. В автономных программах Java я обычно вижу, что это делается с ссылкой на файл java keystore file (в интернете об этом сообщается в лотереях). –
Я подозреваю, что вы правы. Тем не менее, всякий раз, когда я смотрю на какой-либо из скудных примеров ColdFusion о проверке утверждений, они никогда не упоминают ничего о хранилищах ключей. Может быть, просто предполагается, что читатель уже установил это. Похоже, у меня есть еще несколько исследований, поскольку я понятия не имею, как использовать хранилище ключей. – SentryGoingUp
Глядя на этот код, я бы поспорил, что он ожидает, что открытый ключ будет в утверждении. –