Надежные записи сертификатов не защищены паролем Spring SAML

Я создал файл testIdp.cer, скопировав 509 записей IDP, которые планирую подключиться. Затем я создал файл JKS, выполнив следующую команду

keytool -importcert -alias adfssigning -keystore C:\Users\user\Desktop\samlKeystore.jks -file    C:\Users\user\Desktop\testIdp.cer

Когда он был выполнен, он попросил ввести пароль, для которого я дал пароль. На вопрос "Доверять этот сертификат? [Нет]:", я дал "y" в качестве ввода. Сообщение появилось как "Сертификат был добавлен в хранилище ключей".

Затем я сконфигурировал следующие данные в securityContext.xml

<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
    <constructor-arg value="classpath:security/samlKeystore.jks"/>
    <constructor-arg type="java.lang.String" value="mypassword"/>
    <constructor-arg>
        <map>
            <entry key="adfssigning" value="mypassword"/>
        </map>
    </constructor-arg>
    <constructor-arg type="java.lang.String" value="adfssigning"/>
</bean>

<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
  <property name="alias" value="adfssigning" />
  <property name="signingKey" value="adfssigning"/>     
</bean>

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

Это исключение возникает при запуске сервера

Caused by: org.opensaml.saml2.metadata.provider.FilterException: Signature trust establishment failed for metadata entry
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.verifySignature(SignatureValidationFilter.java:327)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.processEntityGroup(SignatureValidationFilter.java:240)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.doFilter(SignatureValidationFilter.java:158)
at org.opensaml.saml2.metadata.provider.AbstractMetadataProvider.filterMetadata(AbstractMetadataProvider.java:493)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.processNonExpiredMetadata(AbstractReloadingMetadataProvider.java:395)

Это исключение происходит, когда я запускаю домашнюю страницу моего приложения

java.lang.UnsupportedOperationException: trusted certificate entries are not password-protected
at java.security.KeyStoreSpi.engineGetEntry(Unknown Source)
at java.security.KeyStore.getEntry(Unknown Source)
at org.opensaml.xml.security.credential.KeyStoreCredentialResolver.resolveFromSource(KeyStoreCredentialResolver.java:132)

Ответ 1

Ваш сертификат .cer содержит только открытый ключ, вы не должны определять <entry key="adfssigning" value="mypassword"/> для открытых ключей; его можно использовать только для частных. Просто выньте запись adfssigning и обязательно включите закрытый ключ - как в примере приложения Spring SAML.

Хранилище SAML может содержать два основных типа ключей - общедоступные и частные (плюс их сертификаты). Каждый ключ имеет псевдоним, который используется для ссылки на него. Ключевое хранилище может быть защищено паролем (предоставляется во втором параметре конструктора), плюс каждый закрытый ключ может быть также защищен дополнительным паролем (они определены в третьем параметре конструктора на карте alias- > password). Открытые ключи, которые вы импортируете в хранилище ключей (так же, как вы делали с приведенной выше командой), не должны определяться на этой карте. Они будут автоматически доступны после импорта без дополнительных объявлений. Для работы Spring SAML хранилище ключей должно содержать как минимум один закрытый ключ (пример приложения содержит закрытый ключ с псевдонимом apollo), и его псевдоним должен быть предоставлен в третьем параметре конструктора.

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

Ответ 2

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

Вам нужно импортировать закрытый ключ и, который не может быть выполнен непосредственно с помощью keytool.

Подробное описание решения найдено здесь: fooobar.com/questions/37689/...

Здесь выдержка:

openssl pkcs12 -export -in server.crt -inkey server.key \
           -out server.p12 -name [some-alias] \
           -CAfile ca.crt -caname root

keytool -importkeystore \
    -deststorepass [changeit] -destkeypass [changeit] -destkeystore server.keystore \
    -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass some-password \
    -alias [some-alias]

Ответ 3

Эта ошибка возникает также, когда у вас нет личного ключа в вашем хранилище ключей. SAML использует закрытый ключ для создания метаданных поставщика услуг, используемых для связи с IDP. Просто добавьте его в хранилище ключей следующим образом: keytool -genkey -v -keystore some_key_store.jks -alias some_alias -keyalg RSA -keysize 2048 -validity 36500 Заполните вопросы и задайте правильное число дней., (В моем примере это действительно в течение 100 лет) Не забудьте добавить публичный сертификат от IDP. Тогда вы должны быть готовы к работе.

Ответ 4

Получите публичный сертификат с помощью команды openssl:

openssl s_client -showcerts -connect iam-sso.google.net:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem

Импортируйте его в хранилище ключей:

keytool -import -alias "new-qet-alias" -keystore /usr/share/tomcat8/webapps/ROOT/WEB-INF/classes/saml/samlKeystore.jks -file mycertfile.pem