Расшифровка ответа SAML2 с использованием модуля Python pysaml2

Я интегрирую свое приложение с okta, чтобы использовать единый вход. Okta будет передавать некоторую пользовательскую информацию в ответе SAML, которую мне нужно использовать в моем приложении. Следовательно, мы решили зашифровать ответ Saml (xml) в IDP, используя открытый ключ моего сервера (apache).

Теперь я пытаюсь расшифровать ответ saml2, чтобы получить атрибуты.

Мои приложения используют

  1. Python 3.5

  2. Джанго 1.11

  3. модуль python pysaml2

Я использую ниже, чтобы проверить / проанализировать ответ saml2, исходящий от okta https://github.com/fangli/django-saml2-auth

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

Настройки saml, которые у меня есть в моем приложении, приведены ниже:

saml_settings = { 'metadata': {
                 "local": [ metadat_xml
              ],           
},
'service': {
    'sp': {
        'endpoints': {
            'assertion_consumer_service': [
                (acs_url, BINDING_HTTP_REDIRECT),
                (acs_url, BINDING_HTTP_POST),
                (https_acs_url, BINDING_HTTP_REDIRECT),
                (https_acs_url, BINDING_HTTP_POST)
            ],
        },
        'allow_unsolicited': True,
        'authn_requests_signed': False,
        'logout_requests_signed': True,
        'want_assertions_signed': True,
        'want_response_signed': False,
    },
},

'key_file': "mykey.key",  # private part
'cert_file': "mykey.crt",  # public part
'xmlsec_binary': '/usr/bin/xmlsec1',
'encryption_keypairs': [{
    'key_file': 'mykey.key',
    'cert_file': 'mykey.crt',
       }]
      }
     if 'ENTITY_ID' in settings.SAML2_AUTH:
    saml_settings['entityid'] = settings.SAML2_AUTH['ENTITY_ID']

#print('entity id ' , settings.SAML2_AUTH['ENTITY_ID'])

if 'NAME_ID_FORMAT' in settings.SAML2_AUTH:
    saml_settings['service']['sp']['name_id_format'] = settings.SAML2_AUTH['NAME_ID_FORMAT']

# NOTE-'NAME_ID_FORMAT is set to None above

spConfig = Saml2Config()

spConfig.load(saml_settings)
spConfig.allow_unknown_attributes = True
saml_client = Saml2Client(config=spConfig)
return saml_client

Тогда у меня есть

saml_client = _get_saml_client(get_current_domain(r))
resp = r.POST.get('SAMLResponse', None)
authn_response = saml_client.parse_authn_request_response(resp, entity.BINDING_HTTP_POST )

Этот объект auth_response ничего мне не возвращает, когда сообщение зашифровано.

В журналах я вижу ошибку ниже

GbHvkJJM0WIsPYFGtiQ/0n+ux0tV/z/OKpT1AqEE74iRVHEHD7omP41iY/c4= 
</ns3:CipherValue></ns3:CipherData><ns3:ReferenceList><ns3:DataReference 
URI = "#_648cdbd139564492f0bdfe4fbbda92f6" /></ns3:ReferenceList> 
</ns3:EncryptedKey></ns1:EncryptedAssertion></ns0:Response>
2018-04-30 18:21:09,232 [DEBUG] sigver saml2.sigver decrypt(): Decrypt input 
len: 15187
2018-04-30 18:21:09,233 [DEBUG] sigver saml2.sigver _run_xmlsec(): xmlsec 
command: /usr/bin/xmlsec1 --decrypt --privkey-pem 
/private.pem --id-attr:ID EncryptedKey --output /tmp/tmp7rt7g95u.xml 
/tmp/tmpkhxwo8s4
2018-04-30 18:21:09,247 [DEBUG] sigver saml2.sigver _run_xmlsec(): xmlsec 
p_out:
2018-04-30 18:21:09,247 [DEBUG] sigver saml2.sigver _run_xmlsec(): xmlsec 
p_erryy: 
func=xmlSecXPathDataExecute:file=xpath.c:line=273:obj=unknown:
subj=xmlXPtrEval:error=5:libxml2 library function 
failed:expr=xpointer(id('_841612fffac65343e73f8913eeecfb30'))
func=xmlSecXPathDataListExecute:file=xpath.c:line=373:obj=unknown:
subj=xmlSecXPathDataExecute:error=1:xmlsec library function failed:
func=xmlSecTransformXPathExecute:file=xpath.c:line=483:
obj=xpointer:subj=xmlSecXPathDataExecute:error=1:xmlsec library function 
failed:
func=xmlSecTransformDefaultPushXml:file=transforms.c:
line=2411:obj=xpointer:subj=xmlSecTransformExecute:error=1:xmlsec library 
function failed:
func=xmlSecTransformCtxExecute:file=transforms.c:line=1302:
obj=unknown:subj=xmlSecTransformCtxXmlExecute:error=1:xmlsec library 
function failed:
func=xmlSecKeyDataRetrievalMethodXmlRead:file=keyinfo.c:line=1178:
obj=retrieval-method:subj=xmlSecTransformCtxExecute:error=1:xmlsec library 
function failed:
func=xmlSecKeyInfoNodeRead:file=keyinfo.c:line=114:obj=retrieval-method:
subj=xmlSecKeyDataXmlRead:error=1:xmlsec library function 
failed:node=RetrievalMethod
func=xmlSecKeysMngrGetKey:file=keys.c:line=1349:obj=unknown:
subj=xmlSecKeyInfoNodeRead:error=1:xmlsec library function 
failed:node=KeyInfo
func=xmlSecEncCtxEncDataNodeRead:file=xmlenc.c:line=957:
obj=unknown:subj=unknown:error=45:key is not found:
func=xmlSecEncCtxDecryptToBuffer:file=xmlenc.c:line=715:
obj=unknown:subj=xmlSecEncCtxEncDataNodeRead:error=1:xmlsec library function 
failed:
func=xmlSecEncCtxDecrypt:file=xmlenc.c:line=623:
obj=unknown:subj=xmlSecEncCtxDecryptToBuffer:error=1:xmlsec library function 
failed:

Error: failed to decrypt file
Error: failed to decrypt file "/tmp/tmpkhxwo8s4"

Я не уверен, почему команда xmlsec1 не работает и чего мне здесь не хватает. Я попытался расшифровать свой закрытый ключ (самоподписанный закрытый ключ) здесь https://www.samltool.com/decrypt.php и это работает

Не могли бы вы помочь мне здесь и сообщить, что я делаю неправильно?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 771
1

Ответы 1

Вам нужно добавить

saml_settings['id_attr_name'] = 'Id'

Атрибут идентификатора по умолчанию - ID, но Okta использует Id. Подробнее см. xmlsec FAQ.

Другие вопросы по теме