Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
cris_hansen
Advisor
Advisor


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!


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:


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