Hola, chicos,
¡Buenas noches!

En este post comentaré algunas dificultades que enfrenté en un proyecto del sector BI en la empresa donde trabajo, donde decidimos implementar el recientemente lanzado Microsoft Reporting Services 2016 (que incorporaba Datazen, adquirido por Microsoft) para brindar informes, cuadros de mando, KPIs y cuadros de mando de Ventas y Facturación vía internet, sin necesidad de conectarse a una VPN, pero usando autenticación de Active Directory.

Una de las mayores ganancias que traerá este proyecto a la empresa es la posibilidad de visualizar esta información en dispositivos Web (Chrome, Firefox, Internet Explorer y cualquier otro navegador), Tablets y dispositivos móviles (iOS y Android).

Para implementar la estructura necesaria, el DBA Tiago Neves Realicé la instalación y configuración de SQL Server 2016 + Reporting Services y puse el entorno a disposición del equipo de BI. Sin embargo, al intentar publicar cualquier informe utilizando SQL Server Mobile Report Publisher, se generó el siguiente mensaje de error:

Não foi possível salvar o relatório. Algo deu errado. Tente novamente mais tarde
No se pudo guardar el informe. Algo salió mal. Vuelve a intentarlo más tarde

No se pudo guardar el informe. Algo salió mal. Vuelve a intentarlo más tarde

Como puede ver, este mensaje de error es muy genérico y no ayuda mucho a identificar y resolver el problema. Por lo tanto, Tiago, DBA Caroline y yo comenzamos a analizar los archivos de registro de Reporting Services, que generalmente se encuentran en “C:\Program Files\Microsoft SQL Server\MSRS13.Su_instancia\Reporting Services\LogFiles”, encontramos el siguiente mensaje de error:

System.Reflection.TargetInvocationException El objetivo de una invocación ha lanzado una excepción. — System.InvalidOperationException Esta implementación no forma parte de los algoritmos criptográficos validados FIPS de la plataforma Windows.

Con este mensaje pudimos entender lo que realmente estaba sucediendo: el servidor tenía habilitada la configuración de cifrado de datos FIPS y Reporting Services de forma predeterminada no admite esta configuración, como podemos leer en un blog de Microsoft: “Esto sucede porque FIPS está habilitado en el servidor de Reporting Services y el Administrador de informes no admite la política de seguridad local ‘Criptografía del sistema: use algoritmos compatibles con FIPS para cifrado, hash y firma'” (fuente aquí).

Hablamos con el analista de seguridad de la empresa y nos recomendó no desactivar esta configuración en el servidor debido a la política de seguridad de la empresa.

Deshabilitar FIPS

Solo con fines de prueba y en el entorno de desarrollo, desactivamos FIPS y Reporting Services se comportó normalmente, permitiéndonos guardar y publicar informes sin ningún problema.

Para deshabilitar esta configuración, simplemente acceda al registro de Windows, busque la configuración "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\fipsalgorithmpolicy" y cambie el valor de la clave "Enabled" a 0.

SQL Server Reporting Services 2016 - Disable FIPS
SQL Server Reporting Services 2016: deshabilitar FIPS

Después de eso, reinicie el servicio Reporting Services y SQL Server Mobile Report Publisher funcionará normalmente.

Resolviendo el problema sin deshabilitar FIPS

Como no pudimos cambiar esta configuración en los servidores, necesitábamos buscar otra solución para solucionar este problema. Después de mucha investigación, Tiago encontró una solución en Foro Technet, donde es necesario cambiar el archivo máquina.config del Microsoft .NET Framework del servidor (generalmente ubicado en C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config) y agregue la siguiente configuración al final del archivo:

<mscorlib>
    <cryptographySettings>
        <cryptoNameMapping>   
            <cryptoClasses>
                <cryptoClass
                    SHA256CSP="System.Security.Cryptography.SHA256CryptoServiceProvider, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
            </cryptoClasses>            
            <!-- name mappings -->           
            <nameEntry
                name="SHA256"
                class="SHA256CSP" />
            <nameEntry
                name="SHA256CryptoServiceProvider"
                class="SHA256CSP" />
            <nameEntry
                name="System.Security.Cryptography.SHA256CryptoServiceProvider"
                class="SHA256CSP" /> 
            <nameEntry
                name="System.Security.Cryptography.SHA256"
                class="SHA256CSP"/>      
        </cryptoNameMapping>          
    </cryptographySettings>
</mscorlib>

Esta configuración básicamente obliga a .NET Framework, utilizado por la herramienta SQL Server Mobile Report Publisher, a utilizar el algoritmo de cifrado SHA256 en lugar de FIPS, que es incompatible con Reporting Services desde la versión 2005.

Recomiendo crear una copia de seguridad de este archivo antes de editarlo. Después de editar el archivo, simplemente reinicie el servicio Reporting Services para que SQL Server Mobile Report Publisher funcione normalmente, sin tener que deshabilitar el FIPS de la instancia.

Otra solución a este problema es seguir los pasos del post. SQL Server: cómo cifrar y descifrar contraseñas (con Salt) usando CLR (C#), donde me encontré con este mensaje de error al usar algoritmos que no son compatibles con los estándares FIPS en SQL Server, usando CLR (C#).

Espero que hayas disfrutado de esta publicación que hice junto con Tiago Neves ¡Y nos vemos en el próximo post!
¡Abrazo!

System.InvalidOperationException: esta implementación no forma parte de los algoritmos criptográficos validados por FIPS de la plataforma Windows.

System.InvalidOperationException: esta implementación no forma parte de los algoritmos criptográficos validados por FIPS de la plataforma Windows.