Error al realizar conexiones SSL, TLS y HTTPS en Mono


Mono, la implementación libre de .NET Framwork, no permite por defecto realizar conexiones que requieran el uso de SSL o TLS. Esto impide, por ejemplo, comunicarse con direcciones https vía código; lanzando una excepción como esta:

Security.Protocol.Tls.TlsException: Invalid certificate received form server.

Este comportamiento no es un bug, es un sistema de seguridad.

Las conexiones seguras, para que realmente lo sean para los usuarios, necesitan que el cliente pueda verificar la legitimidad del servidor remoto. Para ello existen entidades que expiden certificados para asegurar que el interlocutores quien dice ser.

Mensaje de Firefox indicando una conexion segura

Los navegadores web suelen incluir los certificados de varias entidades de confianza. Sin embargo, Mono no lo hace. Prefiere que cada usuario decida en quien quiere confiar.

Para resolver este problema existen dos soluciones sencillas y seguras:

Importar los certificados de Firefox

Este método tiene la ventaja de instalar los certificados de todas las entidades de confianza mas habituales sin tener que buscar la concreta necesaria:

mozroots --import --ask-remove

Importar un certificado concreto

Si no tenemos Firefox, el que necesitamos no viene incluido o solo queremos uno concreto; existe la posibilidad de importar un fichero de certificado:

Como ejemplo, vamos a instalar un certificado de GoDaddy.

  1. Descargamos el archivo gd-class2-root.crt desde https://certs.godaddy.com/anonymous/repository.seam a una carpeta de nuestro ordenador (p. ej.: /home/usuario)
  2. Ejecutamos el siguiente comando en nuestra terminal
certmgr -add -c Trust /home/usuario/gd-class2-root.crt

Una vez completado alguno de los dos métodos podremos escribir código en Mono que se comunique vía SSL o TLS.

Para mas información, se puede consultar http://www.mono-project.com/FAQ:_Security

Anuncios

Visual Studio 2010. F#, un nuevo lenguaje para .NET


Tras hablaros el otro día sobre lo nuevo en C# 4.0 hoy quiero hablaros de otra de las interesantes incorporaciones en .NET Framework 4:  F#, un nuevo lenguaje de programación.

F#, a diferencia de los otros lenguajes para .NET, es un lenguaje funcional. Este paradigma, muy utilizado con propósitos académicos, es muy diferente al orientado a objetos y es quizás la causa de que no se usen este tipo de lenguajes en el ámbito comercial.

Sin embargo en F#, que lleva desarrollandose en Microsoft Research desde hace bastantes años, se ha sabido crear una estupenda interoperabilidad con los otros lenguajes del .NET (C#, VB.NET y C++/CLR).

Esta fuerte influencia nos permite utilizar todas las clases del framework y trabajar con ellas como si lo hiciéramos en C# o VB.NET con absoluta transparencia. De hecho, incluso se pueden crear  aplicaciones de Silverlight usando este estupendo lenguaje

En el ejemplo siguiente se puede ver como podemos crear un formulario de Windows Forms usando F#:
#light
open System.Drawing
open System.Windows.Forms
let form = new Form(BackColor = Color.Purple, Text = "Introducing WinForms")
Application.Run(form)

Otra función que se incluye es la consola interactiva de F# (fsi.exe), un interprete en el que podemos programar de forma dinámica, es decir, conforme vamos programando ir obteniendo los resultados.

Un ejemplo que ilustra bastante bien la utilidad del intérprete de F# es crear un formulario al cual podemos cambiar las propiedades cuando queramos.

> #light
open System.Drawing
open System.Windows.Forms
let form = new Form(BackColor=Color.Purple, Text="Introducing WinForms", Visible=true);;

Con este código crearíamos un formulario, pero si quisiéramos modificar por ejemplo el título pondríamos lo siguiente:

> form.Text <- "Un nuevo título!";;

También se podría, por poner otro ejemplo, modificar el color de fondo:

> form.BackColor <- Color.Red;;

Si estáis interesados en utilizar este F#  hay dos opciones: usando Visual Studio o si no tenéis acceso a él, (no sirven las versiones express) podeis descargar el compilador y el intérprte desde la web de Microsoft Research: research.microsoft.com/en-us/um/cambridge/projects/fsharp/release.aspx. También se puede descargar desde ese mismo sitio una versión para Mac y Linux a través de Mono, la implementación libre de .NET Framework.

Si no conocéis el lenguaje, que es lo más seguro, (yo estoy intentando todavía aprenderlo…) existe un tutorial de básico en español que podéis consultar en esta web o descargaros un libro en inglés y mucho mas completo tiutlado “Foundations of F#” desde aqui.

Portabilidad, la gran ventaja de .NET Framework y Mono


.NET y MonoDesde los inicios de la informática, uno de los grandes problemas ha sido la interoperabilidad entre los sistemas operativos y las diferentes arquitecturas de hardware. Esto quiere decir que un programa diseñado para un sistema operativo y un procesador concretos no puede ser ejecutado en nigún otro.

Los programas, independientemente del lenguaje en el que han sido escritos, son compilados en código máquina (código binario), el único lenguaje que es capaz de interpretar el hardware y que es específico para cada tipo de procesador. Además, debido a la complejidad de los sistemas actuales, los programas no pueden comunicarse directamente con la máquina y deben hacerlo a través de las librerías que proporcionan los sistemas operativos. Tomando en cuenta estos dos factores el software resultante solo puede ser ejecutado en máquinas determinadas.

Entonces, ¿Como podríamos construir software que fuera útil en cualquier plataforma? Muy simple, utilizando un lenguaje intermedio común a todos los sistemas operativos que sea convertido a cada arquitectura cuando sea necesario.

.NET Framework y Mono, la versión opensource de .NET Framework, hacen precisamente eso: al compilar un programa que hayamos escrito, no lo hacemos en código máquina, sino en un lenguaje intermedio conocido como CIL (Common Intermediate Language). Este lenguaje universal, al no ser cercano a la máquina, es independiente de ella y se puede utilizar en cualquier ordenador.

Pero, ¿No hemos dicho que los ordenadores solo entienden el código máquina? .NET Framework y Mono son máquinas virtuales cuya función es “traducir” el programa al lenguaje que cada ordenador entiende conforme se va ejecutando. De esta forma, lo único que dependerá de cada plataforma será la máquina virtual pues los programas serán interpretados al vuelo (a esto se le llama compilación Just-In-Time).

Esquema del funcionamiento de un programa en .NET Framework

¿Que ventajas aporta el tener un lenguaje único?

Como dice el título, la Portabilidad. Si yo compilo un programa en CIL podré ejecutarlo en cualquier plataforma que tenga alguna de estas dos máquinas virtuales.

Actualmente existen versiones para cualquier sistema operativo: Windows, GNU/Linux, Mac OS  y para móviles con Windows Mobile o iPhone OS (este último gracias a la plataforma Mono)

Como ejemplo de programa portable tenemos TomBoy, la conocida aplicación de notas para Gnome en GNU/Linux, que al estar escrita en C# podemos instalar no solo en Linux, sino en Windows o Mac OS sin hacer modificaciones en el código fuente. Para utilizarla además necesitamos GTK#, una versión en CIL de las librerías gráficas de Gnome, y que por tanto nos permitiría ejecutar cualquier programa que las utilice en cualquier sistema operativo.


Enlaces: