Child pages
  • Instalação Shibboleth-IDP 2.X + Ubuntu 10.04 LTS
Skip to end of metadata
Go to start of metadata

Autor: Rui Ribeiro
Data: 26/11/2010
Revisão: 1

Introdução

Este tutorial de instalação descreve os procedimentos que devem ser executados para a instalação do Shibboleth-IDP 2.x em uma máquina Ubuntu Server 10.04.

A instalação foi segmentada de forma a executar operações similares em bloco. Devido à dependências entre passos de instalação diferentes, não há como testar o funcionamento do Shibboleth-IDP antes do fim do roteiro. A resolução de atributos pode ser testada depois da configuração dos arquivos attribute-resolver.xml e attribute-filter.xml.

Ao final deste tutorial, o IDP já estará instalado mas ainda não terá sido incluido na Federação.

Requisitos

Para executar este roteiro, espera-se que já tenham sido executados os seguintes roteiros anteriormente:

Instalação e Configuração Básica do Ubuntu 10.04 LTS
Instalação Apache Tomcat + Ubuntu 10.04 LTS

Orientações gerais

  • Todos os comandos listados nos blocos de código devem ser executados pelo usuário root no console ou via ssh, salvo quando outra informação for dada. Recomenda-se fazer ssh no servidor e trocar de usuário com o comando sudo su - (confirmando com a senha de usuário).
  • Os comandos que se encontram nos blocos de código devem ser copiados e colados direto no console do ssh.

Procedimentos

Instalação dos pacotes

Execute a instalação do Apache.

apt-get update
apt-get install apache2 libapache2-mod-jk

Firewall

1. Faça a liberação das portas que serão utilizadas pelo Shibboleth-IDP. Para tanto, adicione as linhas a seguir no arquivo /etc/default/firewall.

# Shibboleth-IDP                                               #SHIB-IDP
iptables -A INPUT -p tcp -m tcp --dport 8443 -j ACCEPT         #SHIB-IDP
iptables -A INPUT -p tcp -m tcp --dport  443 -j ACCEPT         #SHIB-IDP
iptables -A INPUT -p tcp -m tcp --dport   80 -j ACCEPT         #SHIB-IDP
                                                               #SHIB-IDP

2. Após reinicie o script de firewall.

/etc/init.d/firewall restart

Configurar Java, Tomcat e Apache

As seguintes configurações devem ser feitas para que o Tomcat execute o Shibboleth-IDP:

1. Editar /etc/java-6-openjdk/security/java.security e adicionar as linhas 10 e 11 listadas abaixo:

security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/nss.cfg
..
security.provider.10=edu.internet2.middleware.shibboleth.DelegateToApplicationProvider
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

2. Editar /etc/tomcat6/server.xml para definir um conector na porta 8009 que redirecionará para a porta 8443. Para tanto descomente a linha exibida abaixo:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

3. Ainda no arquivo /etc/tomcat6/server.xml adicione as linhas a seguir abaixo da linha recém descomendata.

<Connector port="8443"
           maxHttpHeaderSize="8192"
           maxSpareThreads="75"
           scheme="https"
           secure="true"
           clientAuth="want"
           SSLEnabled="true"
           sslProtocol="TLS"
           keystoreType="PKCS12"
           keystoreFile="/opt/shibboleth-idp/credentials/idp.p12"
           keystorePass="changeit"
           truststoreFile="/opt/shibboleth-idp/credentials/idp.p12"
           truststorePass="changeit"
           truststoreAlgorithm="DelegateToApplication"/>

4. Criar o arquivo /etc/tomcat6/Catalina/localhost/idp.xml contendo o caminho para auto-deploy do Shibboleth-IDP.

<Context docBase="/opt/shibboleth-idp/war/idp.war"
         privileged="true"
         antiResourceLocking="false"
         antiJARLocking="false"
         unpackWAR="false"
         swallowOutput="true" />

O instalador do Shibboleth-IDP deixará o arquivo idp.war disponível no caminho descrito em docBase, e o Tomcat instalará ele durante a sua inicialização.

5. Criar o arquivo /etc/apache2/sites-available/idp-SSO - virtualhost para o portal de autenticação. O portal de autenticação pode utilizar um certificado SSL diferente do que será fornecido nos metadados da Federação (assinado por uma autoridade local ou mesmo obtido de terceiros).

<VirtualHost SUBSTITUIR_IP_SERVIDOR:443>
        ServerName  SUBSTITUIR_FULL_HOSTNAME
        ServerSignature Off
        SSLEngine               on
        SSLCertificateKeyFile   /etc/ssl/private/chave-apache.key
        SSLCertificateFile      /etc/ssl/certs/certificado-apache.crt
        DocumentRoot /var/www/vazio/

        <Directory /var/www/vazio/>
                Options -Indexes -FollowSymLinks -MultiViews
                AllowOverride None
                Order deny,allow
                Deny from all
        </Directory>

	JkMount /idp/* ajp13_worker

        CustomLog /var/log/apache2/access-idp-443.log combined
        LogLevel warn
        ErrorLog /var/log/apache2/error-idp-443.log

</VirtualHost>

6. Crie o arquivo /etc/apache2/conf.d/idp.conf com o conteúdo abaixo para configurar a ligação entre o Apache e o Tomcat

JkWorkersFile   /etc/libapache2-mod-jk/workers.properties
JkShmFile       /var/run/apache2/jk-runtime-status
JkLogFile       /var/log/apache2/mod_jk.log
JkLogLevel      info

7. Comandos para finalizar a configuração do Apache:

mkdir /var/www/vazio/
a2dissite default
a2ensite idp-SSO
a2enmod ssl
a2enmod jk

8. Adicionar certificados de servidor à cadeia de certificados confiáveis do java

cd /etc/ssl/certs/
wget https://svn.rnp.br/repos/CAFe/conf/certs/ds.chimarrao.cafe.rnp.br.crt --no-check-certificate
wget https://svn.rnp.br/repos/CAFe/conf/certs/ds.cafe.rnp.br.crt --no-check-certificate
wget https://svn.rnp.br/repos/CAFe/conf/certs/ACRaizdaICPEDU.crt --no-check-certificate
wget https://svn.rnp.br/repos/CAFe/conf/certs/ACUFSC.crt --no-check-certificate
wget https://svn.rnp.br/repos/CAFe/conf/certs/AC_SSL_UFSC.crt --no-check-certificate
keytool -importcert -keystore /etc/ssl/certs/java/cacerts \
        -alias ds.chimarrao.cafe.rnp.br -file /etc/ssl/certs/ds.chimarrao.cafe.rnp.br.crt \
        -storetype JKS -storepass changeit -noprompt
keytool -importcert -keystore /etc/ssl/certs/java/cacerts \
        -alias ds.cafe.rnp.br -file /etc/ssl/certs/ds.cafe.rnp.br.crt \
        -storetype JKS -storepass changeit -noprompt
keytool -importcert -keystore /etc/ssl/certs/java/cacerts \
        -alias ACRaizdaICPEDU -file ACRaizdaICPEDU.crt \
        -storetype JKS -storepass changeit -noprompt
keytool -importcert -keystore /etc/ssl/certs/java/cacerts \
        -alias ACUFSC -file ACUFSC.crt \
        -storetype JKS -storepass changeit -noprompt
keytool -importcert -keystore /etc/ssl/certs/java/cacerts \
        -alias AC_SSL_UFSC -file AC_SSL_UFSC.crt \
        -storetype JKS -storepass changeit -noprompt

Baixar e instalar o Shibboleth-IDP e bibliotecas Java

O Shibboleth-IDP está disponível no site da Internet2: Shibboleth-IDP

O arquivo bcprov-jdk16-144.jar é uma biblioteca que implementa protocolos criptográficos em Java. Ela substitui as bibliotecas padrão do java-6-openjdk. A biblioteca está disponível originalmente em "The Legion of the Bouncy Castle"

2. Copie a sequência de comandos abaixo, cole no terminal e edite os arquivos necessários:

cd /root/
wget https://svn.rnp.br/repos/CAFe/softwares/shibboleth-idp/shibboleth-identityprovider-2.1.5-bin.zip --no-check-certificate
wget https://svn.rnp.br/repos/CAFe/softwares/tomcat/bcprov-jdk16-144.jar --no-check-certificate
cp bcprov-jdk16-144.jar /usr/lib/jvm/java-6-openjdk/jre/lib/
unzip shibboleth-identityprovider-2.1.5-bin.zip
cd shibboleth-identityprovider-2.1.5/
cp -r endorsed /usr/share/tomcat6/
cp lib/shibboleth-jce-1.1.0.jar /usr/lib/jvm/java-6-openjdk/jre/lib/ext/
cat > src/installer/resources/install.properties -<<EOF
idp.home=/opt/shibboleth-idp
idp.home.input=/opt/shibboleth-idp
idp.hostname=`hostname -f`
idp.hostname.input=`hostname -f`
idp.keystore.pass=changeit
EOF

============================================================================
vim /root/shibboleth-identityprovider-2.1.5/src/main/webapp/WEB-INF/web.xml

E alterar o seguinte bloco

De:
<!-- Space separated list of CIDR blocks allowed to access the status page -->
        <init-param>
            <param-name>AllowedIPs</param-name>
            <param-value>127.0.0.1/32 ::1/128</param-value>
        </init-param>

Para:
       <!-- Space separated list of CIDR blocks allowed to access the status page -->
        <init-param>
            <param-name>AllowedIPs</param-name>
            <param-value>200.130.38.94/32 200.130.77.147/32 200.130.77.77/32 200.133.240.0/24 200.143.192.0/24 200.130.35.0/24 200.130.78.0/25 127.0.0.1/32 ::1/128
            </param-value>
        </init-param>
============================================================================

./install.sh
chown tomcat6:tomcat6 /opt/shibboleth-idp/logs/
chown tomcat6:tomcat6 /opt/shibboleth-idp/metadata/

 

Configuração do Shibboleth-IDP

handler.xml

1. Editar o arquivo /opt/shibboleth-idp/conf/handler.xml, comentar a seção referente a RemoteUser e habilitar a seção do UsernamePassword. O arquivo final deve ter a seguinte configuração:

<!-- Login Handlers -->
    <!--
    <LoginHandler xsi:type="RemoteUser">
        <AuthenticationMethod>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</AuthenticationMethod>
    </LoginHandler>
    -->

    <!--  Username/password login handler -->
    <LoginHandler xsi:type="UsernamePassword"
                  jaasConfigurationLocation="file:///opt/shibboleth-idp/conf/login.config">
        <AuthenticationMethod>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</AuthenticationMethod>
    </LoginHandler>

relying-party.xml

1. Editar /opt/shibboleth-idp/conf/relying-party.xml para substituir o bloco correspondente à tag MetadataProvider id="URLMD" pelo bloco abaixo

<MetadataProvider id="URLMD" xsi:type="FileBackedHTTPMetadataProvider" xmlns="urn:mace:shibboleth:2.0:metadata"
                          metadataURL="https://ds.chimarrao.cafe.rnp.br/metadata/chimarrao-metadata.xml"
                          backingFile="/opt/shibboleth-idp/metadata/chimarrao-metadata.xml">
            <MetadataFilter xsi:type="ChainingFilter" xmlns="urn:mace:shibboleth:2.0:metadata">
<!--
                <MetadataFilter xsi:type="RequiredValidUntil" xmlns="urn:mace:shibboleth:2.0:metadata"
                                maxValidityInterval="604800" />
                <MetadataFilter xsi:type="SignatureValidation" xmlns="urn:mace:shibboleth:2.0:metadata"
                                trustEngineRef="shibboleth.MetadataTrustEngine"
                                requireSignedMetadata="true" />
-->
                    <MetadataFilter xsi:type="EntityRoleWhiteList" xmlns="urn:mace:shibboleth:2.0:metadata">
                    <RetainedRole>samlmd:SPSSODescriptor</RetainedRole>
                </MetadataFilter>
            </MetadataFilter>
        </MetadataProvider>

Configuração de resolução/liberação de atributos

Inicialmente serão fornecidos arquivos de configuração padronizados para a federação.

Busque na página Resolução e liberação de atributos o conteúdo dos arquivos:

Configuração da autenticação LDAP

1. A configuração do acesso ao diretório LDAP para o attribute-resolver.xml foi feito na seção Resolução e liberação de atributos, porém mais um arquivo precisa ser modificado. Substitua os seguintes valores pelos dados de seu servidor:

SUBSTITUIR_SERVIDOR_LDAP: Endereço IP ou nome do host que contém o LDAP - ldap.instituicao.br
SUBSTITUIR_BASE_DN: Ramo da árvore que contém os usuários - "ou=people,dc=instituicao,dc=br"
SUBSTITUIR_USUARIO_LEITOR_SHIB: Usuário que tem direito de leitura na base LDAP - "cn=leitor-shib,dc=instituicao,dc=br"
SUBSTITUIR_SENHA_LEITOR_SHIB: Senha do usuário de leitura

  • /opt/shibboleth-idp/conf/login.config:
ShibUserPassAuth {
   edu.vt.middleware.ldap.jaas.LdapLoginModule required
      host="SUBSTITUIR_SERVIDOR_LDAP:389"
      base="SUBSTITUIR_BASE_DN"
      ssl="false"
      userField="uid"
      serviceUser="SUBSTITUIR_USUARIO_LEITOR_SHIB"
      serviceCredential="SUBSTITUIR_SENHA_LEITOR_SHIB"
      subtreeSearch="false";
};

Chaves e Certificados SSL

A geração de Chaves e Certificados para o Apache e o Shibboleth-IDP é um processo necessário. Para tanto execute o roteiro Geração de Chave e Certificado itens 1, 2.1, 2.3 e 3.

Corrigir o arquivo de metadados local

O arquivo de metadados do servidor Shibboleth-IDP local /opt/shibboleth-idp/metadata/idp-metadata.xml foi gerado utilizando um certificado SSL auto-gerado na instalação do Shibboleth-IDP. Esse certificado precisa ser substituido pelo que foi gerado no passo anterior da instalação.

1. Liste o conteúdo do arquivo do certificado que foi auto-assinado.

cat /opt/shibboleth-idp/credentials/idp.crt

2. Copie o conteúdo entre as linhas BEGIN CERTIFICATE e END CERTIFICATE

3. Edite o arquivo de metadados /opt/shibboleth-idp/metadata/idp-metadata.xml e exclua o certificado incorreto. Há 2 ocorrências desse certificado no arquivo, as duas dentro das seguintes tags xml:

<KeyDescriptor>
            <ds:KeyInfo>
                <ds:X509Data>
                    <ds:X509Certificate>
INSIRA_AQUI_O_CONTEUDO_DO_ARQUIVO_DO_CERTIFICADO
INSIRA_AQUI_O_CONTEUDO_DO_ARQUIVO_DO_CERTIFICADO
INSIRA_AQUI_O_CONTEUDO_DO_ARQUIVO_DO_CERTIFICADO
                    </ds:X509Certificate>
                </ds:X509Data>
            </ds:KeyInfo>
        </KeyDescriptor>

4. Ainda no arquivo de metadados (/opt/shibboleth-idp/metadata/idp-metadata.xml), inclua a identificação da Instituição e contato técnico entre as tags </AttributeAuthorityDescriptor> e </EntityDescriptor> conforme o exemplo abaixo. Lembre-se de fazer as devidas adaptações.

</AttributeAuthorityDescriptor>

    <Organization>
      <OrganizationName xml:lang="en">SIGLA - Nome_da_Instituição</OrganizationName>
      <OrganizationDisplayName xml:lang="en">SIGLA - Nome_da_Instituição</OrganizationDisplayName>
      <OrganizationURL xml:lang="en">http://www.instituicao.br/</OrganizationURL>
    </Organization>

    <ContactPerson contactType="technical">
       <SurName>Nome_do_Contato_Tecnico</SurName>
       <EmailAddress>E-mail_do_Contato_Tecnico</EmailAddress>
    </ContactPerson>

</EntityDescriptor>

Iniciar serviços

1. Reinicie o Apache e o Tomcat para que as configurações sejam recarregadas.

/etc/init.d/apache2 restart
/etc/init.d/tomcat6 restart

Atenção: Os metadados da Federação ainda não estão disponíveis, portanto ocorrerá erro na carga do Shibboleth-IDP.

  • Arquivos de log com informações importantes:

/opt/shibboleth-idp/logs/idp-process.log: apresenta os detalhes da carga das configurações do Shibboleth-IDP. Erros de configuração aparecem em linhas que contém WARN ou ERROR.

tail -f -n3000 /opt/shibboleth-idp/logs/idp-process.log | egrep "(WARN|ERROR)" -A4

/var/log/tomcat6/catalina.<ano><mes><dia>.log e /var/log/tomcat6/localhost.<ano><mes><dia>.log: apresentam as mensagens de erro do Tomcat, quando este não consegue carregar o Shibboleth-IDP

Personalização da página de login

  • PASSO OPCIONAL - Recomendamos fazer essa personalização depois que estiver tudo funcionando e antes de solicitar o ingresso na Federação CAFe. Lembrando que NÃO oferecemos suporte a esta alteração e recomendamos a realização de uma cópia de segurança do diretório /opt/shibboleth

A tela de login é gerada pelo Shibboleth-IDP/Tomcat através dos templates existentes no diretório /src/main/webapp/ da instalação do Shibboleth-IDP.

Para personalizar, edite os arquivos e altere o código HTML que gerará a página, adicione os arquivos CSS e imagens necessárias no diretório /src/main/webapp/images/ e refaça a instalação do Shibboleth-IDP.

./src/main/webapp/login.jsp

Página de login apresentada para o usuário. Não altere o nome das variáveis que são submetidas pelo formulário. Abaixo exemplo da UFRGS, com limitação de 8 caracteres para username e função javascript que completa o UID com zeros.

<%@ page import="edu.internet2.middleware.shibboleth.idp.authn.LoginContext" %>
<%@ page import="edu.internet2.middleware.shibboleth.idp.session.*" %>
<%@ page import="edu.internet2.middleware.shibboleth.idp.util.HttpServletHelper" %>
<%@ page import="org.opensaml.saml2.metadata.*" %>

<%
    LoginContext loginContext = HttpServletHelper.getLoginContext(HttpServletHelper.getStorageService(application),
                                                                  application, request);
    Session userSession = HttpServletHelper.getUserSession(request);
%>

<html>

    <script language="JavaScript" type="text/javascript">
      function myFocus(){
        document.login_form.j_username.focus();
      }
     function formatCodCartao(cartao,tamMascara){
            cartaoNovo = cartao.value;
            zeros = '';
            var i = cartaoNovo.length;
            if(cartaoNovo.length==tamMascara) return;
            else {
                  for(i; i<tamMascara; i++){
                        zeros = zeros + "0";
                }
                cartaoNovo = zeros + cartaoNovo;
            }
          cartao.value = cartaoNovo;
          return;
      }

    </script>
    <head>
        <title>Site de autentição da UFRGS - Universidade Federal do Rio Grande do Sul</title>
    </head>
    <link href="<%= request.getContextPath() %>/images/form_ufrgs.css" rel="stylesheet" type="text/css" />

    <body>
      <div id="top">
        <img src="<%= request.getContextPath() %>/images/logo_ufrgs.gif" />
      </div>
      <div id="geral">
        <div id="txt">

          <p class="azul-negrito">Foi solicitada a autenticação para o seguinte serviço: </p>

          <h3><font color="red"><%= loginContext.getRelyingPartyId() %></font></h3>

          <% if ("true".equals(request.getAttribute("loginFailed"))) { %>
          <p><font color="red">Autenticação falhou. Tente novamente.</font></p>
          <% } %>

          <% if(request.getAttribute("actionUrl") != null){ %>
          <form action="<%=request.getAttribute("actionUrl")%>" method="post" name="login_form" onSubmit=formatCodCartao(this.j_username,8);>
          <% }else{ %>
          <form action="j_security_check" method="post" name="login_form" onSubmit=formatCodCartao(this.j_username,8);>
          <% } %>
            <fieldset>
              <legend>Login</legend>
              <p>
                <label for="username">Número do cartão:</label>
                <input type="text" name="j_username" maxlength="8" autocomplete="off">
              </p>
              <p>
                <label for="password">Senha:</label>
                <input type="password" name="j_password" autocomplete="off">
              <p class="txt-dir"><button type="submit">Login</button></p>
            </fieldset>
          </form>

          <div id="quadrocinza">
            <p class="azul-negrito"> ATENÇÃO:</p>
            <p class="azul-negrito"> Por questão de segurança, feche seu navegador web quando acabar de usar o serviço que requisitou
autenticação, principalmente se estiver utilizando um computador compartilhado.</p>
            <p>Tenha cuidado com qualquer programa ou página web que solicite a sua senha.</p>
            <p>Somente insira o seu número de cartão e/ou sua senha em sites que contenham o sufixo <strong>ufrgs.br</strong>
no seu endereço.</p>
            <p>Nunca forneça seu número de cartão ou senha através de email ou um formulário fora dos servidores da Universidade.</p>
          </div>
        </div>
        <script language="JavaScript" type="text/javascript">
         myFocus();
        </script>
      </div>
    </body>
  </html>

./src/main/webapp/error.jsp

Mensagem que informa que há um problema com a configuração do shibboleth. Segue exemplo de página de erro traduzida.

<%@page import="edu.internet2.middleware.shibboleth.common.profile.AbstractErrorHandler"%>

<html>

<body>
        <!-- <img src="<%= request.getContextPath() %>/images/logo.jpg" /> -->
        <h3>ERRO</h3>
        <p>
            Ocorreu um erro ao acessar o site de autenticação.
        </p>
        <p>
           Este serviço utiliza cookies. Verifique que eles estão habilitados
           em seu navegador e tente acessar o serviço novamente.
        </p>
        <%
       Throwable error = (Throwable) request.getAttribute(AbstractErrorHandler.ERROR_KEY);
           if(error != null){
        %>
        <strong>Mensagem de erro: <%= error.getMessage() %></strong>
        <% } %>

</body>

</html>

./src/main/webapp/login-error.jsp

Informa que houve um erro no Shibboleth-IDP depois de uma autenticação bem sucedida. Página original não foi modificada.

./src/main/webapp/error-404.jsp

Página incorreta acessada no Shibboleth-IDP.

<html>

<body>
        <img src="<%= request.getContextPath() %>/images/logo_ufrgs.gif" />
        <h3>ERRO</h3>
        <p>
            Ocorreu um erro na sua requisição. Favor entrar em contato com a Central de Atendimento (3308 5333)
            para informar a mensagem de erro abaixo:
        </p>
        <p>
            <strong>Mensagem de erro: URL de IDP inválida (HTTP 404)</strong>
        </p>
</body>

</html>

Ao rodar novamente o script de instalação, certifique-se de não sobrescrever os arquivos de configuração já existentes (responda a pergunta com "no" ou não responda nada e pressione enter).

root@cafe:~/shibboleth-identityprovider-2.1.5# ./install.sh
Buildfile: src/installer/resources/build.xml

install:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Be sure you have read the installation/upgrade instructions on the Shibboleth website before proceeding.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
skipping input as property idp.home.input has already been set.
The directory '/opt/shibboleth-idp' already exists.  Would you like to overwrite this Shibboleth configuration? (yes, [no])
no
Updating property file: /root/shibboleth-identityprovider-2.1.5/src/installer/resources/install.properties
Copying 49 files to /opt/shibboleth-idp/lib
Copying 5 files to /opt/shibboleth-idp/lib/endorsed
Copying 1 file to /root/shibboleth-identityprovider-2.1.5/src/installer
Building war: /root/shibboleth-identityprovider-2.1.5/src/installer/idp.war
Copying 1 file to /opt/shibboleth-idp/war
Deleting: /root/shibboleth-identityprovider-2.1.5/src/installer/web.xml
Deleting: /root/shibboleth-identityprovider-2.1.5/src/installer/idp.war

BUILD SUCCESSFUL
Total time: 11 seconds
root@cafe:~/shibboleth-identityprovider-2.1.5#

A nova página de login estará imediatamente disponível via web. Não é necessário reiniciar o Tomcat.

Instalação uApprove

O uApprove que é complemento para o Shibboleth IdP cujo objetivo é gerir a liberação de atributos. A instalação de tal complemento é FACULTATIVA. Para instala-lo, deve-se executar o roteiro Instalação uApprove após a instalação completa do Shibboleth IDP.

FAQ

A seção de FAQ está disponível aqui

  • No labels