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

можно ли проверить подпись, имеющую только предок или корневой сертификат в иерархии?

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

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

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

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

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

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

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

Так как 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>

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>

и

<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 keystore он свяжется с веб-службой, чтобы получить новый CertIdP и добавить его в локальное хранилище ключей. Сохранение локального хранилища ключей-это производительность, доступность и конфиденциальность.


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

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

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

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

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

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

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


короткий ответ: "Нет."Если у вас есть только сертификат ЦС, но не сертификат IdP или SP, вы не можете проверить подпись IdP или SP.

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

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