Skip to Content

Introdução


Esse é um documento que fala sobre um caso envolvendo um problema de SSO baseado em certificados X.509, via Web Dispatcher.

Quando o cenário usado era:

[ web browser com certificado X.509 ] <-> [ Web Dispatcher ] <-> [ WebAS Java ]

então o SSO não funcionava.

Já usando:

[ web browser com certificado X.509 ] <-> [ WebAS Java ]

o SSO funcionava normalmente, uma vez que o certificado X.509 estava mapeado a um usuário do WAS Java.

Análise


Antes de envolver o time de segurança do lado Java (componente BC-JAS-SEC), foram revistas as configurações do web dispatcher, e analisados o conteúdo registrado no log.

Um cenário similar ao acima foi criado:

[ web browser com certificado X.509 ] <-> [ Web Dispatcher ] <-> [ WebAS ABAP ]

O cenário

[ web browser com certificado X.509 ] <-> [ WebAS ABAP ]

Também funcionava, já estava configurado a algum tempo. Para fins de demonstração, o trace do WAS ABAP mostra:

“…

N  dy_signi_ext: X.509 client certificate logon with ticket request

M  SapSecuInit: libsapsecu loaded from >C:\usr\sap\SID\DVEBMGS00\exe\sapcrypto.dll<

M SapSecuInit(): set_secudir(“C:\usr\sap\SID\DVEBMGS00\sec”)==0  OK

N CertGetInfo: Subject-Name >CN=xyz, O=empresa, C=BR<

N CertGetInfo: Issuer-Name >CN=CAempresa, O=empresa, C=BR<

N  lookup USREXTID for certificate mapping information

N  GetUsrExtId: search for <DN, “CN=xyz, O=empresa…”> in client nnn for user “”

N  GetUsrExtId: found matching user >xyz< in client nnn

N CheckX509CertIssuer: check skipped

N  GetUsrExtId: 1 matching USREXTID entries found

N iSignSncServerLogin: client/user/lang/access/auth :nnn/xyz     /E/H/X

N iSignSncServerLogin: check for SSL requirement not required – done by ICman

N  DyISigni: client=nnn, user=xyz     , lang=E, access=H, auth=X

N  usrexist: effective authentification method: X.509 client certificate

N  Get_RefUser(nnn,xyz) =>

N  password logon is generally enabled (default)

N  productive password is still valid (expiration period=0 / days gone=0)

N  password change not required (expiration period=0 / days gone=582)

N  save user time zone = >BRAZIL< into spa

N  DyISignR: return code=0 (see note 320991)

…”

Em negrito as informações importantes:

a) Tipo de logon

b) Dados sobre o certificado X.509

c) Resultado do mapeamento certificado X usuário ABAP

d) Resultado do logon

Análise: teste 1


Agora vamos ao primeiro teste de SSO via Web Dispatcher:

O serviço que pretende-se acessar é o WEBGUI, usando o certificado instalado no IE. A URL, via web dispatcher, é:

https://webdispatcher.foo.bar:10000/sap/bc/gui/sap/its/webgui

Resultado no IE:

O SSO não funcionou, uma vez que a tela de logon apareceu.

O que é mostrado no log do web dispatcher?

“…

[Thr 2044] ->> SapSSLSessionInit(&sssl_hdl=0000000002E0C750, role=2 (SERVER), auth_type=1 (ASK_CLIENT_CERT))

[Thr 2044] <<- SapSSLSessionInit()==SAP_O_K

[Thr 2044] in: args = “role=2 (SERVER), auth_type=1 (ASK_CLIENT_CERT)”

[Thr 2044] out: sssl_hdl = 0000000002F2FA50

[Thr 2044] ->> SapSSLSetNiHdl(sssl_hdl=0000000002F2FA50, ni_hdl=115)

[Thr 2044] NiIBlockMode: set blockmode for hdl 115 TRUE

[Thr 2044]   SSL NI-sock: local=aaa.bbb.ccc.ddd:10000  peer=aaa.bbb.ccc.eee:53379

[Thr 2044] <<- SapSSLSetNiHdl(sssl_hdl=0000000002F2FA50, ni_hdl=115)==SAP_O_K

[Thr 2044] ->> SapSSLSessionStart(sssl_hdl=0000000002F2FA50)

[Thr 2044]   No Client Certificate

[Thr 2044]   New session (TLSv1.0)

…”

Em negrito:

a) O Web Dispatcher está instruído a requisitar um certificado (parâmetro icm/HTTPS/verify_client = 1 está setado no arquivo de perfil);

b) O servidor (“local”) está conectado ao cliente (“peer”);

c) O Web Dispatcher não recebeu um certificado cliente!

Qual é o motivo para isso?


Isso é parte da configuração de SSO baseado em certificados X.509 no WAS ABAP! Precisamos olhar o que existe no PSE do Web Dispatcher:

Via linha de comando, analisemos o conteúdo do PSE:

a) o PSE em si:

“…

C:\<SECUDIR>\>date

The current date is: dd/mm/yyyy

Enter the new date: (dd-mm-yy)

C:\<SECUDIR>\>sapgenpse get_my_name -p SAPSSLS.pse

Subject : CN=webdispatcher.foo.bar, OU=SAP Labs Latin America,…

Issuer  : CN=CA…

Serialno: …

KeyInfo : RSA, 2048-bit

Validity  –  NotBefore: Dds Mes dd hh:mm:ss 201x (…)

              NotAfter:   Dds Mes dd hh:mm:ss 201x (…)

…”

O PSE é válido, então não há problemas com o certificado HTTPS do Web Dispatcher.

b) a lista de certificados do PSE:

“…

C:\<SECUDIR>\>sapgenpse maintain_pk -l -p SAPSSLS.pse

maintain_pk for PSE “C:\<SECUDIR>\SAPSSLS.pse”

PKList is empty.

…”

Ora, não há certificados na lista! O Web Dispatcher não pode confiar em nenhum certificado, provido por autoridades certificadoras!

Como resolver o problema?


a) Importar o certificado da autoridade certificadora, que assina os certificados cliente X.509:

“…

C:\<SECUDIR>\>sapgenpse maintain_pk -a SSO_CA.cer -p SAPSSLS.pse

maintain_pk for PSE “C:\<SECUDIR>\SAPSSLS.pse”

Subject : CN=CAempresa, O=empresa, C=BR

PKList updated (1 entries total, 1 newly added)

…”

b) Reiniciar o Web Dispatcher e testar o cenário novamente.

Resultado:


O IE agora solicita confirmação para o certificado a ser usado!

SSO X.509 WDP 01.jpg

Bom, existem ainda dois parâmetros que devem ser acrescentados ao arquivo de perfil do Web Dispatcher:

icm/HTTPS/trust_client_with_issuer = *

icm/HTTPS/trust_client_with_subject = *

Com eles, o Web Dispatcher é instruído a aceitar certificados assinados por qualquer CA (que esteja na lista de certificados do PSE!) e com qualquer “DN”. O valor “*” determina isso. Caso seja necessário um grau maior de segurança, basta adequar os valores.

Um novo teste, com os dois parâmetros ativos, mostra:

SSO X.509 WDP 02.jpg

O SSO funciona!

Entradas no log do Web Dispatcher:

“…

[Thr 7760] ->> SapSSLSessionInit(&sssl_hdl=0000000002C2C680, role=2 (SERVER), auth_type=1 (ASK_CLIENT_CERT))

[Thr 7760] <<- SapSSLSessionInit()==SAP_O_K

[Thr 7760] in: args = “role=2 (SERVER), auth_type=1 (ASK_CLIENT_CERT)”

[Thr 7760] out: sssl_hdl = 0000000002D4F9D0

[Thr 7760] ->> SapSSLSetNiHdl(sssl_hdl=0000000002D4F9D0, ni_hdl=133)

[Thr 7760] NiIBlockMode: set blockmode for hdl 133 TRUE

[Thr 7760]   SSL NI-sock: local=aaa.bbb.ccc.ddd:10000 peer=aaa.bbb.ccc.eee:54295

[Thr 7760] Base64-Dump of peer certificate (len=680 bytes)

[Thr 7760]

[Thr 7760] —–BEGIN CERTIFICATE—–

[Thr 7760] —–END CERTIFICATE—–

[Thr 7760]   Subject DN: CN=xyz, O=empresa, C=BR

[Thr 7760]   Issuer  DN: CN=CAempresa, O=empresa, C=BR

[Thr 7760] Current Cipher: TLS_RSA_WITH_AES128_CBC_SHA

[Thr 7760] <<- SapSSLSessionStart(sssl_hdl=0000000002D4F9D0)==SAP_O_K

[Thr 7760] status = “new SSL session, received client cert”

[Thr 7760]       Client DN = “CN=xyz, O=empresa, C=BR”

…”

Documentação relevante (em inglês):


SSL Parameters for ICM and Web Dispatcher

icm/HTTPS/verify_client

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply