Расшифровка ответа SAML2 с помощью модуля Python pysaml2 - PullRequest
0 голосов
/ 01 мая 2018

Я интегрирую свое приложение с 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 не зашифрован, я могу обработать ответ и получить из него идентификационные данные пользователя и атрибуты пользователя. Однако после того, как он зашифрован в конце okta с помощью открытого ключа моего сервера, я не могу расшифровать его своим закрытым ключом.

Настройки 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 и это работает

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

1 Ответ

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

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

saml_settings['id_attr_name'] = 'Id'

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

...