Проверка подписи без промежуточного сертификата

Можно ли проверить подпись только при наличии родительского или корневого сертификата в иерархии?

Отказ от ответственности: я новичок в работе с сертификатами, поэтому, пожалуйста, простите за наивную терминологию.

Рассмотрим следующую ситуацию.

  • У нас есть две стороны (назовем их IdP для поставщика удостоверений и SP для поставщика услуг) и некий центральный центр сертификации CA, которому определенно доверяет как IdP, так и SP.
  • CA имеет собственный сертификат CertCA, известный как IdP, так и SP (импортированный в хранилище ключей IdP и SP под каким-либо псевдонимом)
  • Наш CA выдает один сертификат для IdP (CertIdP) и один для SP (CertSP).
  • IdP имеет CertIdP в своем хранилище ключей и знает пароль для него, поэтому IdP может подписывать сообщения с помощью CertIdP.
  • То же самое для SP / CertSP
  • Теперь предположим, что SP не знает CertIdP, а IdP не знает CertSP. Они знают только CertCA, который использовался для подписи CertIdP и CertSP. (Насколько я понимаю, у нас есть иерархия сертификатов CertIdP -> CertCA ‹- CertSP здесь-)
  • IdP хочет отправить подписанное сообщение SP. Он создает сообщение, а затем использует CertIdP для его подписи.
  • SP получает сообщение, подписанное IdP с помощью CertIdP. Как отмечалось выше, у SP нет CertIdP, только родительский сертификат CertCA.

У меня вопрос: Может ли поставщик услуг проверки проверить подпись сообщения, подписанного CertIdP, только имея его родительский сертификат CertCA?

Предыстория, зачем она нужна.

Мы внедряем систему единого входа на базе SAML с помощью PicketLink. Мы используем SAML2SignatureValidationHandler PicketLink для проверки подписей. Для этого поставщику услуг (SP) необходимо иметь сертификат IdP в своем хранилище ключей. Когда подписанное утверждение SAML передается SP, этот обработчик использует сертификат IdP для проверки подписи.

Вышеописанный процесс работает хорошо, но у нас есть некоторые организационные проблемы. Этот процесс предполагает, что SP имеет сертификат IdP для проверки. Если что-то изменится, необходимо заменить сертификат IdP на стороне SP. У нас может быть большое количество SP (сотни, а не тысячи), так что это довольно сложно.

Поскольку и CertIdP, и CertSP выпускаются одним и тем же центром (CA), которому определенно доверяют как IdP, так и SP, у нас возникла идея, что мы можем использовать сертификат CA для проверки подписи. Если это сработает, это может устранить необходимость обмена сертификатами между IdP и SP. Сертификат CA также очень "долговечный", поэтому если его нужно обменивать только один раз в вечности (вечность, в нашем случае составляет около 10-20 лет).

Однако я не уверен, возможно ли технически проверить подпись, подписанную с помощью CertIdP, только с родительским CertCA. Является ли это возможным? Или мы здесь совершенно ошиблись?

Если это актуально, мы на платформе Java / JBoss на стороне SP, IdP - это стороннее программное обеспечение.

Обновление:

Это подпись, которую я получаю сейчас от IdP:

    <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/2000/09/xmldsig#rsa-sha1" />
            <ds:Reference URI="#_...">
                <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#">
                        <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"
                            PrefixList="ds saml samlp" />
                    </ds:Transform>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <ds:DigestValue>r...=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>X...==</ds:SignatureValue>
    </ds:Signature>

person lexicore    schedule 23.07.2014    source источник


Ответы (3)


это зависит от того, содержит ли ваш ответ SAML сертификат подписи <ds:X509Data>...</ds:X509Data> или только его открытый ключ <ds:KeyValue>...</ds:KeyValue>.

<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ...>
  ...
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>...</ds:SignedInfo
    <ds:SignatureValue>...</ds:SignatureValue>
    <ds:KeyInfo>
      <ds:X509Data>
        <ds:X509Certificate>...</ds:X509Certificate>
      </ds:X509Data>
    </ds:KeyInfo>
  </ds:Signature>
</saml2p:Response>

vs.

<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ...>
  ...
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>...</ds:SignedInfo
    <ds:SignatureValue>...</ds:SignatureValue>
    <ds:KeyInfo>
      <ds:KeyValue>
        <ds:RSAKeyValue>
          <ds:Modulus>...</ds:Modulus>
          <ds:Exponent>...</ds:Exponent>
        </ds:RSAKeyValue>
      </ds:KeyValue>
    </ds:KeyInfo>
  </ds:Signature>
</saml2p:Response>

Если сертификат подписи встроен, он может содержать расширение AuthorityInfoAccess, которое обычно содержит URL-адрес http или ldap для выдающего сертификат ЦС. Используя эти расширения от сертификата подписи до сертификата доверенного ЦС, вы сможете построить цепочку доверенных сертификатов. (Примечание: если CertCA фактически является прямым эмитентом CertIdP и CertSP, у вас уже есть необходимая цепочка доверенных сертификатов.)

Однако, если у вас есть только открытый ключ, вам необходимо иметь под рукой сертификат подписи, чтобы сопоставить открытый ключ. Итак, тогда все сводится к проблеме предоставления / распространения. Вы можете предоставить веб-службу, которая возвращает соответствующий сертификат подписи для запрошенного открытого ключа. Если сертификат подписи не был найден в локальном хранилище ключей SP, он свяжется с веб-службой, чтобы получить новый CertIdP и добавить его в локальное хранилище ключей. Сохранение локального хранилища ключей имеет значение для производительности, доступности и конфиденциальности.

person Christof R    schedule 23.07.2014
comment
На данный момент я получаю только SignedInfo и SignedValue (см. Обновление в вопросе). Но вы говорите, что если у меня есть X509Data с сертификатом, я могу проверить его с помощью сертификата CA, верно? - person lexicore; 23.07.2014
comment
Я только что узнал, что элемент <ds:KeyInfo> является необязательным в схеме xmldsig, а также в основном стандарте SAML 2.0. Да, вам просто нужно получить сертификат подписи, будь то через <ds: X509Data> или другими способами, в зависимости от варианта использования. Подход с централизованным механизмом обеспечения работает также без информации об открытом ключе, например, через известный URL-адрес, который предоставляет текущий сертификат проверки. - person Christof R; 23.07.2014
comment
@lexicore вам всегда понадобится сертификат, который использовался для подписи, чтобы проверить его. Проверка не может быть выполнена только с помощью сертификата CA, потому что вы не знаете, была ли подпись сделана с использованием сертификата, выданного этим CA или любым другим CA. По возможности настройте своего IdP так, чтобы он помещал подписывающий сертификат IdP в SAML в элемент <ds:KeyInfo>. - person pepo; 23.07.2014
comment
Спасибо! Награжден наградой, так как это был первый и правильный ответ. - person lexicore; 01.08.2014

Начну с небольшого вступления - проверка цифровой подписи выполняется в два этапа.

  • первая проверка подписи - которая проверяет, что значение подписи действительно соответствует контенту, который он защищает, и что контент, следовательно, не был подделан
  • проверка доверия - убедитесь, что подпись была сделана кем-то, кому доверяет верификатор).

Проверка цифровой подписи требует наличия открытого ключа, соответствующий закрытый ключ которого использовался для создания подписи. Нет никакого способа обойти это.

Но есть один вариант использования для проверки доверия, который позволяет использовать сертификаты CA - и он должен быть полезен в вашем случае.

Это работает так, что вы включаете только сертификаты подписи вашего CA (и, возможно, промежуточного CA) в метаданные, созданные для ваших SP и IDP. Затем вы включаете точный листовой ключ (выданный центром сертификации), используемый для создания подписи, как часть сообщения SAML (в элементе KeyInfo внутри подписи). Затем SP / IDP может проверить, что конечный ключ (который был ему заранее неизвестен) является доверенным, создав и проверив путь сертификации с использованием сертификатов CA, которые у него уже есть.

Это полезно для смены ключей (например, когда срок их действия истекает), поскольку SP и IDP могут изменить свой ключ подписи без необходимости уведомлять другую сторону. Продукты SAML иногда называют эту функцию привязанной или режимом доверия PKIX.

Обратите внимание, что этот подход не работает для цифрового шифрования, поскольку для шифрования необходимо заранее знать точный конечный ключ другой стороны.

person Vladimír Schäfer    schedule 23.07.2014

Короткий ответ - нет." Если у вас есть только сертификат CA, но нет сертификата IdP или SP, вы не можете проверить подпись IdP или SP.

Более подробный ответ: чтобы проверить подпись IdP поставщиком SP, SP сначала должен идентифицировать правильный открытый ключ, связанный с IdP. Проверка включает сравнение значения подписи, зашифрованной с помощью открытого ключа, с хешем содержимого и проверку их совпадения. Без открытого ключа IdP поставщик SP не может выполнить эту операцию.

Предположим, что у SP есть открытый ключ, который заставляет вышеуказанную проверку работать, и теперь он хочет подтвердить, что этот открытый ключ действительно принадлежит IdP. Для этого ему нужен сертификат, содержащий открытый ключ и имя IdP с подписью доверенного объекта, в данном случае CA. Поскольку у вас его нет, вы не можете проверить, что подпись была выполнена IdP.

person juhraffe    schedule 25.07.2014