Histórico da Página
...
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 PATH=D:\Desenvolvimento\Protheus\web\ws 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 |
5 - Configurando o Service Provider usando o servidor:
5.1 - Alterar o entityID do ServiceProvider: setSAMLID.
...
5.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) return endif 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 |
6 - 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.
7 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.
67.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.
9 - Configurando sites que podem ser acessados a partir do SAML
Edite o arquivo sso\etc\services.conf e inclua os sites desejados, um em cada linha do arquivo.
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
8 - 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
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:
http https://myhostname:8080localhost/spEntityIDwebex/saml2/get/url?httphttps://www.google.com
ou seja,
entityID/saml2/get/url?url_do_serviço_web
...