Histórico da Página
...
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
[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 | ||||||
---|---|---|---|---|---|---|
| ||||||
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 5 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. --> </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 | ||
---|---|---|
| ||
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.
...