domingo, 7 de maio de 2017

OSB 11g and Rest Service

Neste post vou mostrar como fazer a chamada do serviço rest que foi gerado no post intellij, spring boot and rest via OSB 11g.

Passos:

1-) Crie um Business Service com as seguintes configurações:

Service Type: Messaging Service


Request Message Type: Text
Response Message Type: Text


Endpoint URI: http://localhost:8090/mytest


2-) Crie um Proxy service e defina no WSDL duas operações, uma para chamada via Method GET e outra para POST.


3-) Inclua um "Route" e depois "Routing" na operação "getOperation" e aponte para o Business Service que criamos.

4-) Insira um "Message Processing"  do tipo "Insert" com as seguintes configurações:

Expression: <http:relative-URI>/myGetMethod</http:relative-URI>
Location: "as last child of"
XPath: ./ctx:transport/ctx:request
In Variable: outbound

5-) Faça a mesma coisa do passo anterior para as seguintes configurações:

Expression: <tran:encoding xmlns:tran="http://www.bea.com/wli/sb/transports">utf-8</tran:encoding>
Location: "as last child of"
XPath: ./ctx:transport/ctx:request
In Variable: outbound

Expression: <http:http-method>GET</http:http-method>
Location: "as last child of"
XPath: ./ctx:transport/ctx:request
In Variable: outbound

6-) Insira um "Stage Actions" do tipo "Transport headers" e inclua as seguintes configurações:

http Content-Type: 'application/json'
http Accept: 'application/json'

7-) Em "Response Action" inclua um "Message Processing" do tipo "Assign" com os seguintes valores:

Expression: $body/text()
Variable: myTestResponse

8-) Iinclua um "Message Processing" do tipo "Replace" com os seguintes valores:

 XPath: .
In Variable: body
Expression:
<br:getOperationResponse>
    <out>{data($myTestResponse)}</out>
</br:getOperationResponse>

 Replace node contents: true


9-) Agora vamos a operação "postOperation".
Inclua um "Route" e depois "Routing" na operação "getOperation" e aponte para o Business Service que criamos.

11-) Neste metodo exige parametros de entrada, vamos incluir  um "Message Processing" do tipo "Replace" com os seguintes valores:

 XPath: .
In Variable: body
Expression:
fn:concat('{"firstName":"',data($body/br:postOperationRequest/firstName),
     '","lastName":"',data($body/br:postOperationRequest/lastName),
     '"}')
 Replace node contents: true


10-) Insira os "Message Processing"  do tipo "Insert" com as seguintes configurações:

Expression: <http:relative-URI>/myPostMethod</http:relative-URI>
Location: "as last child of"
XPath: ./ctx:transport/ctx:request
In Variable: outbound

Expression: <tran:encoding xmlns:tran="http://www.bea.com/wli/sb/transports">utf-8</tran:encoding>
Location: "as last child of"
XPath: ./ctx:transport/ctx:request
In Variable: outbound

Expression: <http:http-method>POST</http:http-method>
Location: "as last child of"
XPath: ./ctx:transport/ctx:request
In Variable: outbound

11-) Insira um "Stage Actions" do tipo "Transport headers" e inclua as seguintes configurações:

http Content-Type: 'application/json'
http Accept: 'application/json'
 

12-) Em "Response Action" inclua um "Message Processing" do tipo "Assign" com os seguintes valores:

Expression: $body/text()
Variable: myTestResponse

13-) Inclua um "Message Processing" do tipo "Replace" com os seguintes valores:

 XPath: .
In Variable: body
Expression:
<br:postOperationResponse>
    <message>{data($myTestResponse)}</message>
</br:postOperationResponse>
 Replace node contents: true

14-)  Resultado:

getOperation:


postOperation:


Obs: Para tratar o retorno ou mesmo no request no formato JSON, não existe uma tratativa nesta versão do OSB, para se fazer isso, gere uma lib em java com os frameworks existentes no mercado como o GSON da google e execute um "Java Callout" para fazer as transformações de XML para JSON e vise versa.



IntelliJ, Spring Boot and Rest

Neste post vou colocar um passo a passo em como criar uma aplicação usando a ide IntelliJ usando o Spring Boot, e expondo um serviço Rest, que pretendo utilizar em outros post.
Para quem não conhece o IntelliJ, fica o link.

Passos:

1-) Criar template do projeto com as configurações do Spring Boot.
Acesso o start spring e preencha os campos:
  • Group: <package para o projeto>
  • Artifact: "MyRestProject"
Em "Search for dependencies" selecione "Web"


Click em "Generate Project"

2-) Abra o IntelliJ e click em "Import Project"



3-) Selecione o diretório do projeto que foi gerado no start spring.



4-) Click em "Next"


5-) Click em "Next" até chegar em "Finish"



6-) Após finalizar o import do projeto, click com o botão direito em cima do "pom.xml" e selecione "+ Add as Maven Project"


O Maven vai baixar todas as libs de dependências.
Caso a ide esteja reclamando do import, click em cima do import, e depois "alt + enter", e selecione para adicionar ao classpath.


7-) Nos passos seguintes, irei criar uma classe com a annotation   @RestController, um método para GET, um método para POST e as classes que irão mapear os parametros de request e response.

 MyRestController:

MyPostRequest:

MyPostResponse: 



MyGetResponse:


8-) Click com o botão direito no projeto e execute o comando "Build Module 'MyRestProject''"

9-) Vamos executar o projeto, abra a classe "MyRestProjectApplication", click com o botão direito e selecione a opção "Create 'MyRestProjectA...main()'".
Altere a opção "Use classpath of module" para o projeto "MyRestProject" e depois em "OK"
 






10-) Click em "Run" no canto direito superior:




11-) Teste com o SOAPUI:

Method GET:




Method POST:



Obs: Eu alterei a porta de listener do Spring Boot, por default ele roda na porta 8080, caso queira alterar a porta, edite o arquivo application.properties que existe na pasta resource do projeto e acrescente:

server.port=<PORTA>


segunda-feira, 1 de maio de 2017

Consumindo serviço com Client Authentication no OSB 11g

Neste post irei demonstrar como consumir serviço que exija a configuração de "client authentication" (SSL Two way).
Os passos para fazer o import do certificado com chave publica se encontra no meu post "Weblogic and Wildcard SSL certificate".
Vamos configurar um JKS para nosso certificado com a chave privada para a autenticação.

Passos:

1-) Gerar um JKS com a chave privada:

keytool -importkeystore -srckeystore myPrivateKey.p12 -srcstoretype pkcs12 -destkeystore clientAuth.jks -deststoretype jks


Listar o certificado que foi importado:

keytool -list -storepass mystorepass -keystore clientAuth.jks



Altere o alias:

keytool -changealias -alias "imported certificate" -destalias "myPrivatekey" -keystore clientAuth.jks -storepass mystorepass




2-) Configurar um "PKI Credential Mapper"

  • Faça login no console do Weblogic
    Vá em Security Realms -> myrealm -> Providers -> Credential Mapping
  • Click em "new"


Preencha o campo "Name" e em "Type" selecione "PKICredentialMapper"


Click em "OK"

Click em "PKICredentialMapper"


Click na aba "Provider Specific"

Prencha os campos:
Keystore File Name: <PATH DO JKS GERADO>/clientAuth.jks
Keystore Pass Phrase: mystorepass
Confirm Keystore Pass Phrase: mystorepass



Click em "Save" e faça restart no server.

3-) Configurações no sbconsole: 

Obs: As configurações que irei demonstrar a seguir podem ser feito no OEPE.

Criando um Service Key Provider





Em SSL Client Authentication Key click em "Browser"

   

No campo password preencha com a senha da chave privada e não do JKS.

 Click em "Save"

Configure o Business Service para usar "Client Authentication"


Altere o Proxy Service para utilizar o Service Key Provider que criamos, vá no proxy e selecione a aba "Security"  

 

Quando executar o serviço, verá na variável inbound o provider.

Weblogic and Wildcard SSL certificate

Recentemente tive problemas ao consumir um serviço via https no OSB 11g, onde o certificado digital deste serviço possui "*.dominio.com" (wildcard).

Irei demonstrar as configurações necessárias para o correto funcionamento no Weblogic.

Caso esteja utilizando a versão 10.3.6 do Weblogic, aconselho que instale o patch mais recente para a versão. (No caso deste post, o ultimo é o 25388747  - Oracle Support)

Passos:

1-) Importar o certificado publico.

keytool -import -v -noprompt -trustcacerts -alias <ALIAS DO CERTIFICADO> -file <DIR_CERTIFICADO>/certficado.cer|.crt -keystore {HOME_OSB}/{WL_HOME}/server/lib/DemoTrust.jks -storepass <PassPhrase>

2-) No console:

Vá em Environment -> Servers -> AdminServer(caso tenha alterado o nome do default, escolha o seu server)
escolha a aba "SSL"





3-) Clique em "Advanced"

Configure os campos conforme abaixo:

Hostname Verification: Custom Hostname Verifier
Custom Hostname Verifier: weblogic.security.utils.SSLWLSWildcardHostnameVerifier
Use JSSE SSL: TRUE




4-) Click em "Save" e faça o restart do seu server.

Se habilitar o log para SSL verá as seguintes saidas, mostrando que esta sendo utilizado a configuração que foi efetuada.


Para habilitar o log, altere o arquivo setDomainEnv.sh com os parametros abaixo:

JAVA_OPTIONS="${JAVA_OPTIONS} -Dweblogic.debug.DebugSecuritySSL=true -Dweblogic.debug.DebugSSL=true -Dweblogic.StdoutDebugEnabled=true -Dweblogic.log.StdoutSeverityLevel=Debug -Dweblogic.log.LogSeverity=Debug"
export JAVA_OPTIONS


quinta-feira, 22 de janeiro de 2015

Como recuperar a senha criptografada no Weblogic

Muitas vezes esquecemos a senha do usuário administrador do domínio ou dos usuários que estão configurados no Data Source e no keystore. Nos passos abaixo irei demonstrar como recuperar a senha.

Passos:

1-) Crie o arquivo descriptografar_senha.py em $DOMAIN_HOME com o trecho de código abaixo:

from weblogic.security.internal import *
from weblogic.security.internal.encryption import *
encryptionService = SerializedSystemIni.getEncryptionService(".")
clearOrEncryptService = ClearOrEncryptedService(encryptionService)

pwd = raw_input("Cole a senha criptografada ({AES}Al9yx...): ")

preppwd = pwd.replace("\\", "")

print "Resultado: " + clearOrEncryptService.decrypt(preppwd)

2-) Para recuperar a senha do administrador vá em $DOMAIN_HOME/servers/AdminServer/security e abra o arquivo boot.properties com um editor de texto e copie a string do password

3-) Execute na linha de comando:

cd $DOMAIN_HOME
. ./bin/setDomainEnv.sh
java weblogic.WLST descriptografar_senha.py

4-) Cole a senha copiada no passo 2 e veja a senha descriptografada