Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

1 - Descompactar dentro do diretório do Application Server o arquivo libsamlsp-windowssso.zip para Windows ou libsamlsp-linuxsso.zip para Linux.

Conteúdo descompactado:

...

sso
  |- etc ( Arquivos de configuração do SAML, certificados e chaves privadas )
  |- lib ( Libs necessárias para a execução da libsamlsp )
  |- share
    |- xml ( Arquivos schema para validar os XML's de configuração e os assertions )
  |- var
    |- cache ( Cópia local dos arquivos de configuração dos IDP's configurados )
    |- log ( Arquivos de log da libsamlsp, libsaml, libxmltooling, libxml-security, libxerces )


2 - Copiar o arquivo invoker-applet.zip para o diretório "PATH" que é configurado na sessão HTTP do arquivo de configuração do Application Server.3 - Habilitar Habilitar o servidor HTTP e HTTPS no Application Server , na sessão HTTP coloque "Enable=1" para habilitar o http.para executar os testes.

    4 - (Opcional) Dentro da sessão HTTP ou HTTPS insira a linha "SAMLSessionName=Nome a sua escolha", este é o nome do cookie de sessão do Service Provider, se esta linha não for inserida, o Service Provider vai criar um cookie de sessão com um nome padrão.


Exemplo da coinfiguração do arquivo .ini


Bloco de código
languagecpp
firstline1
linenumberstrue
[HTTP]
ENABLE=1
PORT=80
SessionTimeout=36000
SAMLSessionName=localhost_http_80

[HTTPS]
ENABLE=1
PORT=443
SessionTimeout=36000
SAMLSessionName=localhost_https_443

[localhost/webex]
ENABLE=1
PATH=\Totvs\bin\appserver\web\ws
ENVIRONMENT=SEU_AMBIENTE
INSTANCENAME=webex
RESPONSEJOB=job_webex

[job_webex]
enable=1
type=webex
instances=1,5,1,1
INSTANCENAME=webex
environment=SEU_AMBIENTE
ONSTART=STARTWEBEX
ONCONNECT=CONNECTWEBEX
ONEXIT=FINISHWEBEX


[ONSTART]
jobs=job_webex
REFRESHRATE=30


3 - Configurando o Service Provider usando o servidor:

  53.1 -  Alterar o entityID do ServiceProvider: setSAMLID.

  53.2 - Alterar o entityID do IdentityProvider: setSAMLID.

  53.3 - Configurar o Service Provider para recuperar automaticamente o arquivo de configuração do Identity Provider: setIDPConf.

  5 3.4 - Inserir e configurar o Service Provider para utilizar sua versão de certificado digital no formato PEM X.509: setSPCert.

          Se não tiver um certificado e chave for formato X.509, crie um certificado auto-assinado usando o OpenSSL. 

          openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem

         Serão criados os arquivos "key.pem" e "certificate.pem", no formato X.509 base 64 ASCII com validade de 365 dias.

         Copie os arquivos .pem para o diretório RootPath do seu ambiente.


Exemplo  de um programa ADVPL ou TLPP para configurar  setSPCert.Exemplo ( Configurando o Service Provider para utilizar o Identity Provider da Shibboleth )num site de testes gratuito.


Bloco de código
languagecpp
firstline1
linenumberstrue
static function getCert()
  certificate := "-----BEGIN CERTIFICATE-----" + CRLF;
  + "MIIC7jCCAdagAwIBAgIJAId3b8yf3qBfMA0GCSqGSIb3DQEBBQUAMBgxFjAUBgNV" + CRLF;
  + "BAMTDXRlYy1sdmluaWNpdXMwHhcNMTIxMTIyMTk1MTEwWhcNMjIxMTIwMTk1MTEw" + CRLF;
  + "WjAYMRYwFAYDVQQDEw10ZWMtbHZpbmljaXVzMIIBIjANBgkqhkiG9w0BAQEFAAOC" + CRLF;
  + "AQ8AMIIBCgKCAQEAs+VCZmdnRg+YrN3rMl1IiNT0kpqCD6LrEU9Inw8rPSQ7uoJx" + CRLF;
  + "2wVfLSvzoMueHV7A2/GWEEQFRqJ8gyPvdO7ahJ60RzVKHAKiR/p5l2ONct7vXRVs" + CRLF;
  + "jn3ZHe0au4s1Zhx0nLaveHa3uFqbuKkvcfHz1jGmjxFF3Hgcz+wWp1qvKQWGSEzh" + CRLF;
  + "89ANkmVrMwyZVm+QiELSeSbF2dy+P5ymVUZ3/0sVrLW9IbCr/2SH3O0ID2PgNlPp" + CRLF;
  + "dyxFcwCqII58cbfRjkm2Hs71InRC8nRjeRdNlWmMYzYtnzuI5i7rA6Rn81I20LcT" + CRLF;
  + "duneyMEVqR0uwCbBrW8hE14CloO6xNtJczMMCwIDAQABozswOTAYBgNVHREEETAP" + CRLF;
  + "gg10ZWMtbHZpbmljaXVzMB0GA1UdDgQWBBRN+g35SDc5ugbtgbkDZ9hvLLcjezAN" + CRLF;
  + "BgkqhkiG9w0BAQUFAAOCAQEAQwdtDbpn0OQYCCUjZTLR9Bs6v3vZqlgWYfnfHoGw" + CRLF;
  + "AXHrOpjcWis85wdyEQjeE2+KcKB9mGgG2LphG9mBrfCf1BVPzENkQUnS6AqVhuJe" + CRLF;
  + "KE2mlavNONOygWmG4wQQJQBljSZyVaSL0Asdy2sDMa7v66n+qiqj+hY3JTKVYlbF" + CRLF;
  + "lJDl+POkh784T6C0OXO0XzOYpzCvyrj4lQXAZC5Vfiex30vJs6a9RuhwwSVy/BNL" + CRLF;
  + "BDDKnyLb+2KfysVecKdwEmymNNTK1pzK5VBslH6v8e7cI2bQ2aXDpb1tnKwtNxm+" + CRLF;
  + "COl5peOveKURXr1oFWXWYMbL/9/ziLkX92/60uZDfDAKCQ==" + CRLF;
  + "-----END CERTIFICATE-----"
return certificate


static function getPrivKey()
  privKey := "-----BEGIN RSA PRIVATE KEY-----" + CRLF;
  + "MIIEpAIBAAKCAQEAs+VCZmdnRg+YrN3rMl1IiNT0kpqCD6LrEU9Inw8rPSQ7uoJx" + CRLF;
  + "2wVfLSvzoMueHV7A2/GWEEQFRqJ8gyPvdO7ahJ60RzVKHAKiR/p5l2ONct7vXRVs" + CRLF;
  + "jn3ZHe0au4s1Zhx0nLaveHa3uFqbuKkvcfHz1jGmjxFF3Hgcz+wWp1qvKQWGSEzh" + CRLF;
  + "89ANkmVrMwyZVm+QiELSeSbF2dy+P5ymVUZ3/0sVrLW9IbCr/2SH3O0ID2PgNlPp" + CRLF;
  + "dyxFcwCqII58cbfRjkm2Hs71InRC8nRjeRdNlWmMYzYtnzuI5i7rA6Rn81I20LcT" + CRLF;
  + "duneyMEVqR0uwCbBrW8hE14CloO6xNtJczMMCwIDAQABAoIBAE++UbfJIHtrEHeY" + CRLF;
  + "i9iwhyW4mI2gFgVOZ7stlPiFJdqdhCiCCGxZLj583Csr93P3e7BDoAynylrsThtn" + CRLF;
  + "w47nDlB5dVqXYbmW5U7Y1itogtwnvJ1bkNp9KNBeOVpnNA2GkZ6iUJgqr/f1mk+6" + CRLF;
  + "F4EACuGo8rc6peg8CjGU6tnWlgytWv32o0bIXGxL9uvoe+khefiL0tGmflgegQdQ" + CRLF;
  + "oz6grtWiclM2xGADp4bl200Uh2Ky8/+B8ByAim5ClZcKdgzD8TVymYq0JprmEjvq" + CRLF;
  + "ESTc4VFqnFy2GzEjvCb5L7ohEj7bb6aT9ruGC6y/1TNnYZa6gY6kDhuFRNltIwPL" + CRLF;
  + "9e3cn6ECgYEA10e65gzY2fezJ86BZ+TT9hnG+kPpJOkdSrxq+xI5i6NRrNdnW0C4" + CRLF;
  + "zykkbcBGnqifIOes3Bz8FtSraMEuTSqIkh80NBHDA5JwFJcXgfpNOA5FUYm+P/yx" + CRLF;
  + "DOsayrNskUXJ5HPHWBVas3RbqNCt4Uf9VLlANc8cOFwbnaLYcOUGo/sCgYEA1ewj" + CRLF;
  + "ZiMVu9DVm0thstgJQE0kAJ/2ENS3ys5/CwMBPkGLWMxX7fCnSfhC/Zi3ic9vgHbT" + CRLF;
  + "0ihZoD5KOVSW2qUPUCEgCd53+iLj6Ph6zmHpdlyAHZBnP3G2vG0YYpYXSI6fXGHb" + CRLF;
  + "ZBNPUuyYGFphq53k9AGyFJKX2HZdQOASClYfqzECgYEAlfXth1rjo9IcBlqfYhPQ" + CRLF;
  + "YtpJ9QNhYMjSEsF1dDeZxl+aAWB7KuHG2ue57InHp7WmQ3GexCWcpPq3/Fy1OCOs" + CRLF;
  + "xrzdzHei9NYJJQ6q3WvSZn3qY4Yj9Ma9PlZ3b0PVGM0Yef78masmZ2NihhH3Tbqs" + CRLF;
  + "CVySEemXqtrekcxiISIoogkCgYEAqT/R5f4+NMGOLvaeDoyEDT67DE+CtGBIJYno" + CRLF;
  + "08KF2karRA8wRk3PXWOxRMjt9XeMJVxeTHimKHT/7onxbH2JNwFuQsCjteCi5vCo" + CRLF;
  + "4N5wgre+mSVlurlyNXQvBdjwBPTqOoIlvPDWIqqTzzi667fZrAAnb8Vno9hKAYkG" + CRLF;
  + "XO000xECgYACur0xK1nXv+95NcodafMLcoonkDbNHJNfCXWDyYOYqCdPj6kVkFtE" + CRLF;
  + "U52RZ2jfby/S4vOyGirn9c4xSI6jzwCL/P6xVoUbmNl9iCEUtPWdofnpBaicVdSf" + CRLF;
  + "fcPURtz8r4tZSVCQ/YljPvsdKCl1wVBAN0hyMZPeU4BZ1zIvXZpbQw==" + CRLF;
  + "-----END RSA PRIVATE KEY-----"
return privKey
 
static function setIdpShib()
  local error

#include 'protheus.ch'
#include 'fileio.ch'

user function setIdpShib()
  local error
 
  // http://tdn.totvs.com/display/tec/setSAMLID 
  if setSAMLID("https://localhost/webex/", 1, @error) == .F.
	ConOut("Error setSAMLID: " + error)
    return
  endif
  
  // http://tdn.totvs.com/display/tec/setSAMLID setSAMLID
  if setSAMLID("httphttps://myhostname:8080/spEntityIDsamltest.id/saml/idp", 12, @error) == .F.
    return alertConOut("Error setSAMLID: " + error)
  endif
   return
   endif
  
  // http://tdn.totvs.com/display/tec/setSAMLIDsetIDPConf
  if setSAMLIDsetIDPConf("https://idp.testshib.orgsamltest.id/saml/idp/shibboleth", 2"samltest.id.metadata.xml", @error) == .F.
    return alertConOut("setSAMLIDError setIDPConf: " + error)
     return
  endif endif
   
  // http://tdn.totvs.com/display/tec/setIDPConfsetSPCert
  if setIDPConfsetSPCert("http://testshib.org/metadata/testshib-providers.xml"certfile.pem", readFile("certificate.pem"), "shibboleth.tst.xml"keyfile.pem", readFile("key.pem"), @error) == .F.
    return alertConOut("setIDPConfError setSPCert: " + error)
     return
  endif
 
  // http://tdn.totvs.com/display/tec/setSPCert
  if setSPCert("certfile.txt", getCert(), "keyfile.txt", getPrivKey(), @error) == .F.
    return alert("setSPCert: " + error)
  endif
return
return

static function readFile(FileName)
	local FileSize
	Local Readed
	local Register := ""
	local hArq := FOpen(FileName)

	If hArq == -1
        ConOut("Error:" + Str(FError()) + ", Error opening file '" + FileName + "'")
		return nil
	EndIf
	
	FileSize := FSEEK(hArq, 0, FS_END)
	
	FSEEK(hArq, 0, FS_SET)
	
	Readed := fRead(hArq, @Register, FileSize)
		
	If Readed <> FileSize
		ConOut("Error:" + Str(FError()) + ", Error reading file '" + FileName + "'")
		return nil
	Endif

	fclose(hArq)
return Register


4 - Execute a user function setIdpShib no smartclient, usando a função inicial U_SETIDPSHIB.

    A execução criará os seguintes arquivos no diretório sso/etc: serviceprovider.xml , certfile.pem e keyfile.pem.


5 6 - Configurando o Identity Provider para fornecer identidades para o Service Provider.

  OBS. O Service Provider tem um serviço que retorna um arquivo XML com sua configuração, esta configuração é extraída a partir do arquivo de configuração do Service Provider ( Item 6 ), portanto, este procedimento deve obrigatoriamente ser feito após finalizar a configuração do Service Provider.

  O Arquivo XML que contém a configuração do Service Provider pode ser utilizado para configurar o Identity Provider automaticamente, mais adiante, tem um exemplo de como fazer isso com o IDP da Shibboleth. 


  65.1 -  A URL do serviço que retorna o arquivo XML de configuração é a mesma configurada como entityID do SP, só é necessário acrescentar o caminho "/saml2/metadata", utilizando o entityID do exemplo acima a URL ficaria assim: httphttps://myhostname:8080localhost/spEntityIDwebex/saml2/metadata.

  Acessando esta URL a partir do browser, o arquivo XML será baixado na máquina local,  o arquivo será salvo com o nome "metadata", é necessário renomear este arquivo para o nome do seu host o arquivo pode ser renomeado e incluindo a extensão ".xml", e.g. (  myhostnamemetadata.xml ).

Exemplo ( Configurando o Identity Provider da Shibboleth a partir do XML de configuração do Service Provider )

...

Baixar o arquivo XML de configuração do Service Provider (  httphttps://myhostname:8080localhost/spEntityIDwebex/saml2/metadata ).

2º Passo:

Acesse o site do IDP da Shibboleth e fazer faça o upload do XML de configuração do SP (  https://wwwsamltest.testshib.orgid/metadataupload.htmlphp )

Neste site temos dois passos simples:

Botão "Choose File" ou "Escolher Ficheiro", abri abre uma janela para selecionar o arquivo de configuração do SP ( Selecione o XML de configuração do SP baixado anteriormente no 1º Passo).
Botão "Upload File", faz o upload e faz a federação do IDP com o SP.


6 - Importante.

    Para testar o IDP no site de testes https://samltest.id/saml/idp será necessário editar o arquivo sso\etc\security-policy.xml. Inclua a tag <PolicyRule type="NullSecurity"/> na TAG <Policy id="default" validate="false"> conforme o exemplo abaixo. A mesma não deve ser usada quando estiver usando um provedor IDP em ambiente de produção, pois, ela diminui o nível de segurança. 


<SecurityPolicies xmlns="urn:mace:shibboleth:2.0:native:sp:config">

    <Policy id="default" validate="false">
        ...

        <!-- Identified by type="NullSecurity", enables debugging by disabling security and permitting unauthenticated messages to pass successfully into higher layers. -->
        <PolicyRule type="NullSecurity"/>
    </Policy>

   ...

</SecurityPolicies>


7 -  Testando o Service Provider

A URL do serviço SAML é mesma configurada como entityID do SP, só é necessário acrescentar o caminho "/saml2/get/totvssmartclient" ( Desktop ) ou  "/saml2/get/url?url_do_serviço_web" ( Web ).

Exemplos:

Desktop:

httphttps://myhostname:8080localhost/spEntityIDwebex/saml2/get/totvssmartclient/default.htm

ou seja, 

entityID/saml2/get/totvssmartclient/default.htm

Web:

http://myhostname:8080/spEntityID/saml2/get/url?http://google.com

ou seja, 

...

Aviso
titleAtenção

Para versões igual ou superior ao Lobo Guará é necessário inserir a pagina "default.htm" no fim da requisição para abertura do smartclient. Caso isso não seja inserido, o server tentará carregar a página default configurada no appserver.ini e isso poderá ocasionar na não abertura do smartclient.


Web:

  7.1 - Criar um programa para testes.

  Crie e compile um programa para devolver data e hora


#include'totvs.ch'


userfunctionhoraAtual()
return"Hora atual >>" + TIME() + "<<"


Obs. No cenário web, é necessário que a URL do serviço web seja previamente cadastrada (setSAMLSvc) , caso   ou  inclua os sites a serem acessados no arquivo sso\etc\services.conf.

Caso contrário será apresentado o erro "URL not allowed".


  7.2 - Incluir os sites a serem acessados usando a função setSAMLSvc ou editando o arquivo sso\etc\services.conf. O servidor deve ser inicializado após esta operação.



  7.3 - Para testar o ambiente, inicie o Application Server e acesse a sua URL do serviço SAML a partir do browser.este link: https://localhost/webex/saml2/get/url?http://localhost/webex/u_horaatual.apw

      Obs. Se tudo foi configurado corretamente, quando você executar o passo acima, você será redirecionado para a página de login do IDP, após o login, o IDP vai te redirecionar para página do SP e se o processo de validação da resposta SAML ( assertion ) foi concluído com sucesso, o SmartClient Desktop ou a página web será aberta, caso contrário será apresentado um erro na página.

...