Todas configurações a seguir podem ser feitas no Windows e Linux.
1 - Descompactar dentro do diretório do Application Server o arquivo libsamlsp-windows.zip para Windows ou libsamlsp-linux.zip para Linux.
Conteúdo descompactado:
libsamlsp.dll (Windows) ou libsamlsp.so (Linux) -> Biblioteca dinâmica que contém todas as funcionalidades do SAML Service Provider.
sso -> Diretório de uso exclusivo da libsamlsp.
Estrutura do diretório sso:
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 o servidor HTTP no Application Server, na sessão HTTP coloque "Enable=1" para habilitar o http.
4 - (Opcional) Dentro da sessão HTTP 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.
5 - Configurando o Service Provider:
5.1 - Alterar o entityID do ServiceProvider: setSAMLID.
5.2 - Alterar o entityID do IdentityProvider: setSAMLID.
5.3 - Configurar o Service Provider para recuperar automaticamente o arquivo de configuração do Identity Provider: setIDPConf.
5.4 - Inserir e configurar o Service Provider para utilizar sua versão de certificado digital: setSPCert.
Exemplo ( Configurando o Service Provider para utilizar o Identity Provider da Shibboleth )
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 // http://tdn.totvs.com/display/tec/setSAMLID if setSAMLID("http://myhostname:8080/spEntityID", 1, @error) == .F. return alert("setSAMLID: " + error) endif // http://tdn.totvs.com/display/tec/setSAMLID if setSAMLID("https://idp.testshib.org/idp/shibboleth", 2, @error) == .F. return alert("setSAMLID: " + error) endif // http://tdn.totvs.com/display/tec/setIDPConf if setIDPConf("http://testshib.org/metadata/testshib-providers.xml", "shibboleth.tst.xml", @error) == .F. return alert("setIDPConf: " + error) endif // http://tdn.totvs.com/display/tec/setSPCert if setSPCert("certfile.txt", getCert(), "keyfile.txt", getPrivKey(), @error) == .F. return alert("setSPCert: " + error) endif return
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 ), 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.
6.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: http://myhostname:8080/spEntityID/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 incluindo a extensão ".xml", e.g. ( myhostname.xml ).
Exemplo ( Configurando o Identity Provider da Shibboleth a partir do XML de configuração do Service Provider )
1º Passo:
Baixar o arquivo XML de configuração do Service Provider ( http://myhostname:8080/spEntityID/saml2/metadata ).
2º Passo:
Acesse o site do IDP da Shibboleth e fazer o upload do XML de configuração do SP ( https://www.testshib.org/metadata.html )
Neste site temos dois passos simples:
Botão "Choose File", abri uma janela para selecionar o arquivo de configuração do SP ( Selecione o XML de configuração do SP baixado anteriormente ).
Botão "Upload File", faz o upload e faz a federação do IDP com o SP.
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:
http://myhostname:8080/spEntityID/saml2/get/totvssmartclient/default.htm
ou seja,
entityID/saml2/get/totvssmartclient/default.htm
Atençã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:
http://myhostname:8080/spEntityID/saml2/get/url?http://google.com
ou seja,
entityID/saml2/get/url?url_do_serviço_web
Obs. No cenário web, é necessário que a URL do serviço web seja previamente cadastrada (setSAMLSvc) , caso contrário será apresentado o erro "URL not allowed".
Para testar o ambiente, inicie o Application Server e acesse a sua URL do serviço SAML a partir do browser.
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.
Veja também: saveIDPXML