Artículo
· 25 nov, 2024 Lectura de 3 min

Configurando programáticamente conexiones SSL con el Superserver

¡Saludos estimados miembros de la comunidad!

Recientemente he estado desplegando una imagen de IRIS for Health en un Docker con una imagen de Webgateway preconfigurado y me he dado de morros con el problema de las configuraciones SSL que nos permitan conectarnos a la instancia de IRIS mediante HTTPS y pasando por nuestro Webgateway.

Hasta ahora siempre había desplegado IRIS for Health con licencia Community, que cuenta aún con el Private Web Server instalado, por lo que sólo necesitaba configurar la conexión de Webgateway con la instancia de IRIS desplegada:

Acceder al portal de gestión usando la url que proporcionaba el PWS y habilitaba el acceso al Superserver desde la pantalla de configuración del mismo:

Seleccionando el puerto 1972 podíamos ver la información de seguridad y sólo necesitábamos habilitar las conexiones SSL con la configuración de la SSL/TLS %SuperServer previamente creada:

Pues bien, con las versiones que no son Community el último paso de la configuración no es factible, ya que no disponemos de acceso vía web a nuestra instancia de IRIS, por lo tanto, deberemos hacerlo programáticamente para que al desplegar nuestro Docker no sólo cree la configuración SSL/TLS sino para que nos habilite las conexiones SSL con el superserver que usará el webgateway para la conexión.

Para ello debemos hacer uso de la clase Security.Servers que nos permite realizar esa misma configuración, a continuación podéis ver un método de clase que nos creará la conexión SSL %SuperServer y a continuación habilitará dichas conexiones con el puerto 1972:

Method EnableSSLSuperServer(password="")
{
    New $NAMESPACE
    zn "%SYS"

    set certdir=..SSLDirectory
    set CAfile = ..SSLCertAuth
    set certfile = ..SSLCertificate
    set keyfile = ..SSLKey

    set sslconfig = ##class(Security.SSLConfigs).%New()
    do sslconfig.CAFileSet(certdir_CAfile)
    do sslconfig.CertificateFileSet(certdir_certfile)
    do sslconfig.PrivateKeyFileSet(certdir_keyfile)
    if password'="" do sslconfig.PrivateKeyPasswordSet(password)
    do sslconfig.DescriptionSet("SuperServer configuration")
    do sslconfig.EnabledSet(1)
    do sslconfig.TypeSet(1)
    do sslconfig.NameSet("%SuperServer")
    set sc=sslconfig.%Save()
    If (sc'=1) {
        Write !, "WARNING: Creating and saving the %SuperServer SSL configuration failed!"
        Write !, $system.Status.GetErrorText(sc)
    }

    If (sc'=1) {
        Write !, "WARNING: Getting the system security settings failed!"
        Write !, $system.Status.GetErrorText(sc)
    }
    set sc = ##class(Security.Servers).Get("1972",,.propsSuperServer)
    set propsSuperServer("Enabled") = 1
    set propsSuperServer("SSLSupportLevel") = 1
    set propsSuperServer("SSLConfig") = "%SuperServer"
    set sc = ##class(Security.Servers).Modify("1972",,.propsSuperServer)

    If (sc'=1) {
        Write !, "WARNING: Modifying the system's SSLSuperServer property failed!"
        Write !, $system.Status.GetErrorText(sc)    
    }
    Write !, "Done enabling SSL for the SuperServer"
}

Más en detalle, este será el fragmento de código que habilita el SSL para el 1972:

set sc = ##class(Security.Servers).Get("1972",,.propsSuperServer)
    set propsSuperServer("Enabled") = 1
    set propsSuperServer("SSLSupportLevel") = 1
    set propsSuperServer("SSLConfig") = "%SuperServer"
    set sc = ##class(Security.Servers).Modify("1972",,.propsSuperServer)

¡Espero que os sea de utilidad!

Comentarios (2)2
Inicie sesión o regístrese para continuar

Como bien comenta @Alexander Koblov también se puede utilizar el mecanismo de cpf merge:

Other possibility -- use CPF Merge

Define an SSL configuration with CreateSSLConfig, then modify superserver with ModifyServer to assign this SSL configuration
https://docs.intersystems.com/iris20242/csp/docbook/DocBook.UI.Page.cls?... 

https://community.intersystems.com/post/programmatic-configuration-ssl-c...