Uso de SSL en apps web Standalone

Sigue estos pasos para desplegar apps web standalone que obtengan los beneficios de las conexiones SSL (usando para ello el prefijo HTTPS). Para ello tendrás que utilizar Xojo 2014r3 o posterior.

Las apps web standalone seguras utilizan TLS v1.2 por defecto, lo cual puede que no esté soportado por algunas versiones antiguas de Internet Explorer (IE 10 y anteriores) excepto que se active TLS 1.2 en sus Ajustes de Seguridad.

Configurar el Certificado SSL

En primer lugar necesitas un certificado SSL que puede obtenerse en múltiples fuentes. Si estás realizando pruebas locales, entonces puedes utilizar un certificado autofirmado. Si tu app web estará disponible en Internet, entonces has de comprar un certificado SSL real dado que añade protección adicional para determinados tipos de ataques Internet. Por lo general, un certificado autofirmado tendrá dos componentes (el certificado y el archivo clave), mientras que un certificado comprado tendrá probablemente tres o más de estos componentes (el certificado, la clave, cABundle o intermediarios).

Una vez que tengas un certificado y lo hayas descargado junto con la clave privada a tu ordenador, tendrás que crear un único archivo que combine todas las piezas. Crea un archivo de texto que tenga el mismo nombre que tu aplicación y en el que se utilice la extensión crt, pegando a continuación los contenidos de los certificados en él, uno tras el otro en este orden:

  • Certificado
  • CABundle
  • Clave Privada

Asegúrate de incluir todos los contenidos del certificado primario, el bundle del certificado intermedio (en caso de que sea preciso) y la clave privada.

Cada archivo debe comenar con una nueva línea (no concatenes la última línea de un archivo con la primera línea de otro en la misma línea). Como se ha indicado, el nombre de ester achivo debe de corresponderse con el nombre de la app, de modo que si tu app web se llama MiMejorApp o MiMejorApp.exe, entonces el archivo del certificado debe de tener como nombre MiMejorApp.crt.

Si estás trabajando en modo de depuración, entonces el nombre de la app compilada será MiMejorApp.Debug, aunque el certificado continuará llamándose MiMejorApp.crt.

Ahora que ya tienes un archivo de certificado correctamente formateado y con el nombre correcto tendrás que asegurarte de que está junto con la aplicación compilada cuando se ejecute. Para ello puedes utilizar la característica de paso de scripts de compilación Copy Files, de modo que se garantice la correcta ubicación del archivo de certificado cada vez que se compile la aplicación.

Un archivo de ejemplo tendrá un aspecto como el siguiente:

-----BEGIN CERTIFICATE-----
MIICuzCCAiQCCQD+1X0TfzZ2qDANBgkqhkiG9w0BAQUFADCBoTELMAkGA1UEBhMC
VUsxDzANBgNVBAgMBkxvbmRvbjEPMA0GA1UEBwwGTG9uZG9uMRkwFwYDVQQKDBBG
YWtlIENvbXBhbnkgTExDMQ0wCwYDVQQLDARGYWtlMR0wGwYDVQQDDBRmYWtlZG9t
YWluLmxvY2FsLmNvbTEnMCUGCSqGSIb3DQEJARYYZmFrZWFkbWluQGZha2Vkb21h
aW4uY29tMB4XDTE0MDExNDE5MTk1NloXDTE1MDExNDE5MTk1NlowgaExCzAJBgNV
BAYTAlVLMQ8wDQYDVQQIDAZMb25kb24xDzANBgNVBAcMBkxvbmRvbjEZMBcGA1UE
CgwQRmFrZSBDb21wYW55IExMQzENMAsGA1UECwwERmFrZTEdMBsGA1UEAwwUZmFr
ZWRvbWFpbi5sb2NhbC5jb20xJzAlBgkqhkiG9w0BCQEWGGZha2VhZG1pbkBmYWtl
ZG9tYWluLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA8GJcPMzT/O+v
8x4hoAikz7wQGhLqeNaeu6u0vDaC0lJ25HJ4sTUqNatYzPlBc6cXrDXY1bCpBtSb
nKOdAbQgPpz6aHDyDT8P3dDn/U6QxNaQAm15hjvgtsF2AuXV3f/6xVxE2RAs9/eh
3WRAH1G8fcrP86vKwbJnA5bAIEKoFfUCAwEAATANBgkqhkiG9w0BAQUFAAOBgQAd
1/lv9aRGpqOMrNVgBLTWBjznV56n1CyBx/3a2Yk6y9iLtexRyc57MfmmGwpnZ4mt
qWvdVK/FJkn9SYsefoUxt59yMBaxHNQMgih+EwoMbWrPCOZI3P997HQHRH4qO6Sp
SM3wtzL5PwJ7lczNIdhKdeVZ1ayDG04skIIhqx9J3Q==
-----END CERTIFICATE-----

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDwYlw8zNP876/zHiGgCKTPvBAaEup41p67q7S8NoLSUnbkcnix
NSo1q1jM+UFzpxesNdjVsKkG1Juco50BtCA+nPpocPINPw/d0Of9TpDE1pACbXmG
O+C2wXYC5dXd//rFXETZECz396HdZEAfUbx9ys/zq8rBsmcDlsAgQqgV9QIDAQAB
AoGAWRf7m8VG5L5pdjA6wjex7hSD20YbhUH2fxQ63m9NuWo7CpyqwvMze8TQGthf
O+A4U+l5PmpFm3R9YGb7sD/0mshrMCn0+Oiwn14cHh3LRrANljeHZCCgF386Sye3
GeQkfOF27N+SKkwydLE1utQQWPoSiCmcBH2+IhVdkGYLTEECQQD6FUpcDSIFoEGO
fk7LqyIBI352cUTeu7C8aFDiABBiDtBz4ypeK9K+tRkFcng1Pk6JPtPJZEER1a9S
24ktdGu5AkEA9hJTNXLf0wp5eNJ7dbVMNSOaBcU1M4h4oaYcZhR5X6Feo3+nFKmg
2EAU34auPPENW3Tl1ROpkH/LJ2tekzvyHQJBAJ/j7tftuZvZOzDMhrpm3uXVeKxn
fP3fCH9dPqFQIyleiV4ell8BK8usY6P87Og1vua22ZeAVq39bgvOuuTp81kCQQCb
utU2SlEkushNksfXorlsF+/uHvSgfIn7o6jtYZ++yd2fE7al+QR2V3feTtoOb2/I
pZ6ezybM8FOdyvG7tIBxAkAEYS5tAgRSJhy/h4vq5ZpHWaIZ0dMEXxmbq7eAALv5
aCT4ePXIx7xrlKbiWZB0wUBMUBrANhmwCcpM9eE0bKYb
-----END RSA PRIVATE KEY-----

Servir en SSL

La última pieza del puzzle consiste en indicar a la app web que quieres que escuche en un puerto seguro. No puedes definir el Puerto Seguro en los Ajustes de Compilación Compartidos (Shared Build Settings), de modo que tendrás que utilizar algunos parámetros de la línea de comandos para ellos. Estos son los parámetros en los que estarás interesado:

ParámetroDescripción
–SecurePortPermite indicar el número de puerto para las conexiones seguras.
–MaxSecureSocketsPermite definir la máxima cantidad de puertos seguros (por omisión, 200).
–certificateLa ruta al certificado SSL en el caso de que no se haya copiado junto con el ejecutable (disponible en 2015r2). –certificate=/ruta/completa/al/archivo
–sslTypePermite indicar el tipo de seguridad empleada. Pueden utilizarse estos valores enteros: 0 (SSLv2), 1 (SSLv23), 2 (SSLv3), 3 (TLSv1), 4 (TLSv11), 5 (TLSv12, por omisión).
–SetureNetworkInterfaceIndexEl valor índice (de NetworkInterfaces) a usar como NIC para las conexiones seguras.

El puerto seguro debe ser distinto que el puerto seleccionado en el IDE (o indicado mediante la propiedad —port de la línea de comandos). Por ejemplo, si compilas tu app web usando el puerto 8080 como puerto de escucha, puedes usar:

MyBestApp --secureport=8081

Al igua que ocurre con la versión no sssl, también puedes aumentar el número máximo de sockets conectados permitidos en caso de que sea necesario, lo cual resulta de utilidad en el caso de que adviertas de que tu app empieza a denegar conexiones en aquellos casos en los que hay varios usuarios conectados al mismo tiempo.

MyBestApp --secureport=8081 --maxsecuresockets=400

Recuerda, con la opción maxsecuresocketsel número de sockets abiertos no representa la cantidad de usuarios simultáneos. En función de la construcción de tu app y de como la usen tus usuarios, un navegador podría tener cero conexiones abiertas (como entre pulsaciones de teclas o clics del ratón) o bien múltiples conexiones abiertas (en el caso de que el usuario esté haciendo clic rápidamente sobre un control). Dicho esto, tampoco deberías de definir un valor demasiado alto. Cuanto más conexiones abiertas también se consumirá más memoria y CPU, de modo que tendrás que experimentar con este valor para encontrar el límite que mejor se adecue a la combinación de app/servidor.

Una vez que hayas ejecutado tu app, utiliza el navegador para conectarte a ella:

https://127.0.0.1:8081/

Tu app debería mostrar ahora el indicador “seguro” correspondiente en el área de dirección del navegador.

Si también quieres evitar accesos inseguros a la app web, puedes definir el número de sockets no seguros a 0:

MiAppWeb --secureport=8081 --maxsockets=0

Por omisión, las apps web standalone SSL utilizan TLSv12 para el tipo de conexión. Este es el método más seguro y también es el recomendado. Pero si precisas elegir una versión más antigua por temas de compatibilidad con navegadores web más antiguos, entonces puedes hacerlo utilizando opciones de línea de comandos como las siguientes:

MiaAppWeb --secureport=8081 --ssltype=3

También puedes definir el tipo de conexión cambiando la propiedad WebApplication.Security.ConnectionType:

`Self.Security.ConnectionType = WebAppSecurityOptions.ConnectionTypes.TLSv1

Generar la Petición de Firmado de Certificado

Estos son algunos comandos de ejemplo que puedes ejecutar desde el Terminal para Linux/Apache:

Generar la clave privada de 2048 bits

openssl genrsa -out server.key 2048

Genera el CSR

openssl req -new -key server.key -out server.csr

Eliminar la contraseña de la clave (de modo que no tengas que escribirla para reiniciar Apache)

cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

Generar una clave pública autofirmada (sólo para pruebas)

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

5 comentarios en “Uso de SSL en apps web Standalone

  1. mauricio

    Hola he intentado aplicarlo pero no he podido, por la clave primaria, tengo un archivo PFX de la exportación pero no se como incoporarlo.

    1. Javier Rodriguez

      Hola Mauricio,
      El PFX es el archivo de exportación (copia de seguridad) de un certificado. Recuerda que has de trabajar tanto con el certificado como con la clave privada para generar el CRT tal y como se indica en el artículo (el orden en el que se incluyen los datos también importa).
      Puedes extraer la clave privada del PFX desde OpenSSL mediante la siguiente línea (asegúrate de descargar e instalar en tu equipo OpenSSL):

      openssl pkcs12 -in certificado.pfx -out claveprivada.pem -nocerts -nodes

      Siguiendo los pasos expuestos en el artículo debería funcionar.

  2. mauricio

    Bárbaro lo pruebo, gracias! Consulta en el proyecto Xojo tengo que cambiar algo? por ejemplo el puerto si estaba usando el 9090 por ejemplo a 443 o no es necesario?.

  3. mauricio

    Lo que indicas:
    MyBestApp –secureport=9090
    Donde lo pongo?, yo tengo mi app Standalone como servicio en windows, intente ahi agregarlo como “Parametro de inicio” pero no me esta funcionando.

    1. Javier Rodriguez

      Hola Mauricio,

      Esa línea es la que debes de ejecutar desde la línea de comando para indicar el puerto definido de escucha (entre otros posibles ajustes, tal y como se indica en el artículo). Observa el puerto elegido, así como la configuración de tu servidor (por ejemplo Firewall). También has de comprobar el tipo de conexión SSL para ajustarla a la configuración del servidor utilizado.

      Por supuesto, todo ello dando por hecho que tu equipo Windows cumpla con los requerimientos mínimos indicados y esté correctamente configurado como servidor Web (ya sea usando IIS —preferiblemente configurado como proxy inverso- o Apache). Puedes encontrar información adicional de configuración IIS en https://docs.xojo.com/UserGuide:Deploy_Web_App_to_IIS

      Recisa los log del servidor para ver la información adicional que te pueda estar arrojando.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *