2014-10-08 2 views
2

Мы получаем стандартное утверждение 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.

+2

Вы выполнили какую-либо конфигурацию, отличную от фрагмента кода выше? Я не знаю ColdFusion, но вам нужно каким-то образом зарегистрировать или ссылаться на известный открытый ключ из IdP, чтобы ваш Java-код мог разрешить и убедиться, что цифровая подпись действительна или фактически создана из личного ключа IdP. В других серверах (например, серверы приложений JavaEE) это обычно шаг конфигурации для «импорта» открытого ключа. В автономных программах Java я обычно вижу, что это делается с ссылкой на файл java keystore file (в интернете об этом сообщается в лотереях). –

+0

Я подозреваю, что вы правы. Тем не менее, всякий раз, когда я смотрю на какой-либо из скудных примеров ColdFusion о проверке утверждений, они никогда не упоминают ничего о хранилищах ключей. Может быть, просто предполагается, что читатель уже установил это. Похоже, у меня есть еще несколько исследований, поскольку я понятия не имею, как использовать хранилище ключей. – SentryGoingUp

+0

Глядя на этот код, я бы поспорил, что он ожидает, что открытый ключ будет в утверждении. –

ответ

4

Если это не подтверждается или вы получаете сообщение «Не удается разрешить элемент с идентификатором». Добавьте третью строку ниже. То, что происходит, - это более новая версия Apache Santuario, которая больше не предполагает, что IdAttribute является «ID». Вам нужно вручную установить его.

xmlResponse = getHttpRequestData().content.Trim(); 
docElement = XmlParse(variables.xmlResponse); 
docElement.setIdAttribute("ID",true); //Add this line 
+0

Я собираюсь принять это как ответ, потому что единственным решением, которое я смог найти, было использование немного более старых версий библиотек Santuario. Использование последних библиотек не помогло ... следовательно, решение выше, вероятно, правильный ответ. – SentryGoingUp

0

Поскольку вы упоминаете Apache Santuario, вот Java code sample от этого проекта, который включает в себя проверку цифровой подписи XML.

Этот образец использует открытый ключ из X509Certificate вместо самого сертификата.Ваш пример кода, похоже, использует сам сертификат:

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); 

Как о настройке этого использовать java.security.PublicKey из X509Certificate:

keyInfo = xmlSignature.getKeyInfo(); 
X509CertificateResolverCN = "org.apache.xml.security.keys.keyresolver.implementations.X509CertificateResolver"; 
keyResolver = CreateObject("Java", X509CertificateResolverCN).init(); 
keyInfo.registerInternalKeyResolver(keyResolver); 
x509cert = keyInfo.getX509Certificate(); 
publicKey = x509cert.getPublicKey() 

isValid = xmlSignature.checkSignatureValue(publicKey); 

Отказ от ответственности: Я никогда не писал линию CF в моем жизнь, поэтому, если она работает, но есть корректировки, чтобы прокомментировать, и я ее настрою.

Смежные вопросы