Как создать хранилище ключей для SP из метаданных IdP - PullRequest
0 голосов
/ 03 июня 2019

Я работаю над настройкой своего SP с IdP. Они дали мне ссылку на свои метаданные. Мне удалось получить пример приложения SAML. Я переключил образцы метаданных с метаданными IdP, но, похоже, у меня проблема с сертификатом подписи.

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

Мне не дали никаких ключей или файлов сертификатов непосредственно от IdP, мне сказали, что все необходимые мне данные находятся в файле метаданных.

Вот мой bean-компонент keyManager в моем файле context.xml:

    <bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
        <constructor-arg value="file:F:/Certificates/PESTestKeystore.jks"/>
        <constructor-arg type="java.lang.String" value="changeit"/>
        <constructor-arg>
            <map>
                <entry key="dagtestkeystore" value="changeit"/>
            </map>
        </constructor-arg>
        <constructor-arg type="java.lang.String" value="dagtestkeystore"/>
    </bean>

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

    <bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
        <constructor-arg>
            <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
                <property name="entityId" value="urn:test:dag:dagtest"/>
                <property name="extendedMetadata">
                    <bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
                        <property name="signMetadata" value="true"/>
                        <property name="signingKey" value="dagtestkeystore"/>
                        <property name="signingAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                    </bean>
                </property>
            </bean>
        </constructor-arg>
    </bean>

Это сообщение об ошибке, которое я получаю:

Encountered error during federation passive request. 

Additional Data 

Protocol Name: 
Saml 

Relying Party: 
urn:test:dag:dagtest 

Exception details: 
Microsoft.IdentityModel.Protocols.XmlSignature.SignatureVerificationFailedException: MSIS0038: SAML Message has wrong signature. Issuer: 'urn:test:dag:dagtest'.
   at Microsoft.IdentityServer.Protocols.Saml.Contract.SamlContractUtility.CreateSamlMessage(MSISSamlBindingMessage message)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolManager.Issue(HttpSamlRequestMessage httpSamlRequestMessage, SecurityTokenElement onBehalfOf, String sessionState, String relayState, String& newSamlSession, String& samlpAuthenticationProvider, Boolean isUrlTranslationNeeded, WrappedHttpListenerContext context, Boolean isKmsiRequested)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.RequestBearerToken(WrappedHttpListenerContext context, HttpSamlRequestMessage httpSamlRequest, SecurityTokenElement onBehalfOf, String relyingPartyIdentifier, Boolean isKmsiRequested, Boolean isApplicationProxyTokenRequired, String& samlpSessionState, String& samlpAuthenticationProvider)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.BuildSignInResponseCoreWithSerializedToken(HttpSamlRequestMessage httpSamlRequest, WrappedHttpListenerContext context, String relyingPartyIdentifier, SecurityTokenElement signOnTokenElement, Boolean isKmsiRequested, Boolean isApplicationProxyTokenRequired)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.BuildSignInResponseCoreWithSecurityToken(SamlSignInContext context, SecurityToken securityToken, SecurityToken deviceSecurityToken)
   at Microsoft.IdentityServer.Web.Protocols.Saml.SamlProtocolHandler.Process(ProtocolContext context)
   at Microsoft.IdentityServer.Web.PassiveProtocolListener.ProcessProtocolRequest(ProtocolContext protocolContext, PassiveProtocolHandler protocolHandler)
   at Microsoft.IdentityServer.Web.PassiveProtocolListener.OnGetContext(WrappedHttpListenerContext context)

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Проблема : «Это сообщение об ошибке, которое я получаю:«

Encountered error during federation passive request. 

Exception details: 
Microsoft.IdentityModel.Protocols.XmlSignature.SignatureVerificationFailedException: MSIS0038: SAML Message has wrong signature. Issuer: 'urn:test:dag:dagtest'.

Разрешение :
Случай 1 : AuthnRequest не обязательно подписан.

Разрешение для случая 1 : в свойствах Обновления 1 SAML2 вы можете снять флажок Подписать AuthnRequest.См. Невозможно войти в систему с помощью единого входа с использованием SAML (Multi-SSO) и ADFS 2.0 (ошибки 364 и 303) .

Случай 2 : AuthnRequest должен бытьподписан.

В вашем случае ваш SP подписывает AuthnRequest, но IdP SAML (т. Е. Microsoft ADFS) не может использовать ваш открытый сертификат / ключ SP для проверки подписи AuthnRequest.

Разрешение для варианта 2 : необходимо указать URL-адрес метаданных SAML SP для IdP SAML (т. Е. Microsoft ADFS), чтобы
Microsoft ADFS могла загружать метаданные SAML SPизвлеките открытый сертификат / ключ SP из метаданных SP, а затем используйте открытый сертификат / ключ SP для проверки подписанного AuthnRequest.

Подвопрос"Я работаю над настройкой своего SP сIdP. Они дали мне ссылку на свои метаданные. Я смог заставить приложение SAML Sample работать. Я переключил образец метаданных с метаданными IdP, но, похоже, у меня проблема с сертификатом подписи ».

Ответ :
Пример приложения SAML работает, поскольку они загрузили файл метаданных SAML SP примера приложения SAML в свой SAML IdP.

Два типичных подхода дляНастройка SAML SP с SAML IdP, в зависимости от различных требований SAML IdP, перечислены ниже.

(1) Вам необходимо создать закрытый ключ SAML SP и открытый сертификат / ключ для собственного приложения SP, сгенерировать SAML SPФайл метаданных (который включает в себя только открытый сертификат / ключ), затем у вас есть две опции

(Вариант I) загрузить файл метаданных SP в SAML IdP.

(Вариант II) предоставить URLфайла метаданных SP, затем IdP SAML (например, Microsoft ADFS) может загрузить файл метаданных SP с URL-адреса.

(2) Некоторые IdP SAML требуют, чтобы администраторы вручную загружали открытый сертификат / ключ SAML SP, иотправьте entityID и AssertionConsumerService URL SAML SP.

Вопрос : «Я попытался создать свое собственное хранилище ключей иимпорт данных сертификата x509 из файла метаданных IdP, но я получаю сообщение об ошибке с неверной подписью. "

Ответ :
(1) Обычно SAML SP требуетсясоздайте другой ключ и сертификат, которые отделены от SAML IdP.Другими словами, открытый сертификат / ключ, переносимый SAML SP и SAML IdP, должен отличаться, как показано в примере метаданных SAML SP "sp-example-org.xml" и предоставленном образце SAML IdP "idp-metadata.xml". Shibboleth IdP и SP testbed в репозитории GitHub.

Как собрать и запустить Shibboleth SAML IdP и SP с использованием контейнера Docker в репозитории GitHub предоставляет инструкцию по созданиюSAML IdP и SAML SP с использованием Shibboleth SAML IdP, OpenLDAP и Shibboleth SAML SP.

(I) shibboleth-sp-testapp / shibboleth-sp / предоставляет пример ключа SAML SP и сертификата, сгенерированного OpenSSL.

sudo openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -subj "/CN=sp.example.org" -keyout /etc/ssl/private/sp.example.org.key -out /etc/ssl/certs/sp.example.org.crt

(II) shibboleth-idp-dockerized / ext-conf / credentials / предоставляет пример ключей и сертификатов SAML IdP.

(III) shibboleth-idp-dockerized / ext-conf/ metadata / предоставляет пример соответствующего файла метаданных SAML IdP и файла метаданных SAML SP.

Вопрос : «Я также пытался создать хранилище ключей изфайл сертификата напрямую, но я получаю сообщение об ошибке, что мне не хватает закрытого ключа. "

Ответ :
Файл метаданных IdP включает только открытый сертификат / ключ, но не НЕ включает закрытый ключ.

Таким образом, вы можете NOT создать собственное хранилище ключей, импортировав данные сертификата x509 из файла метаданных IdP.

Вопрос : «Мне не дали никаких ключей или файлов сертификатов непосредственно от IdP, мне сказали, что все необходимые мне данные находятся в файле метаданных».

Ответ
Они верны. Все необходимые данные были в файле метаданных IdP.

Файл метаданных IdP содержит только открытые сертификаты, а НЕ закрытые ключи.

Вы можете вручную извлечь открытый сертификат / ключ из метаданных IdP, а затем создать открытый файл сертификата, используя шаблон, предоставленный шибболет-IDP-dockerized / доб-конф / Учетные / IDP-signing.crt . Обратите внимание, что обычно вам НЕ нужно создавать открытый файл сертификата IdP SAML, потому что большинство SP SAML (например, Shibboleth SAML SP) извлекает открытый сертификат из файла метаданных IdP, когда это требуется (как описано в разделе «Два типичных подхода для настройки»). SAML SP с SAML IdP, в зависимости от различных требований SAML IdP "в разрешение выше).

0 голосов
/ 04 июня 2019

Подпись для SAML AuthnRequest выполняется с помощью закрытого ключа вашего SP.Открытый ключ, включенный в сертификат, предоставленный с метаданными SAML IdP, необходим только для проверки подписи ответа подтверждения / SAML, отправленного IdP.

...