es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Servidor HTTPS en C# en Ubuntu

Estoy tratando de establecer una conexión HTTPS en Ubuntu desde mi servidor HTTP de C#. He habilitado HTTPS en mi HTTPListener como lo haría en Windows, sin embargo, no puedo establecer una conexión.

Según la documentación:

Si creas un HttpListener usando https, debes seleccionar un Certificado del Servidor para ese listener. De lo contrario, una solicitud HttpWebRequest de este HttpListener fallará con un cierre inesperado de la conexión.

Esto es exactamente lo que me está sucediendo. La documentación sugiere:

Puedes configurar Certificados de Servidor y otras opciones del listener usando Network Shell (netsh.exe). Consulta Network Shell (Netsh) para obtener más detalles. Este ejecutable comenzó a enviarse con Windows Server 2008 y Windows Vista.

Dado que estoy en Ubuntu y mi servidor se está ejecutando en Ubuntu Server, no tengo acceso a esta herramienta. ¿Cómo puedo lograr el mismo efecto en Ubuntu?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para habilitar HTTPS en Ubuntu, deberás generar un certificado SSL y configurar tu servidor HTTP para usarlo. Aquí tienes los pasos que puedes seguir:

    1. Instalar el certificado SSL

    Puedes generar un certificado SSL autofirmado utilizando la herramienta de línea de comandos OpenSSL. Aquí tienes un ejemplo:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/server.key -out /etc/ssl/certs/server.crt
    

    Este comando generará un certificado SSL válido por 365 días, con una clave RSA de 2048 bits. La clave privada se guardará en /etc/ssl/private/server.key, y la clave pública (o certificado) se guardará en /etc/ssl/certs/server.crt.

    1. Configurar tu servidor HTTP

    Para habilitar HTTPS en tu servidor HTTP en C# que se ejecuta en Ubuntu, debes modificar tu código para utilizar el certificado SSL que acabas de generar. Aquí tienes un ejemplo:

    using System;
    using System.Net;
    using System.Security.Authentication;
    using System.Security.Cryptography.X509Certificates;
    
    class HttpsServer {
      static void Main(string[] args) {
        var listener = new HttpListener();
        listener.Prefixes.Add("https://*:8080/");
        listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
        listener.Start();
        Console.WriteLine("Escuchando...");
    
        while (true) {
          var context = listener.GetContext();
          Console.WriteLine("Solicitud recibida de {0}", context.Request.RemoteEndPoint);
    
          var request = context.Request;
          var response = context.Response;
    
          response.ContentType = "text/plain";
          response.ContentLength64 = 13;
          response.StatusCode = 200;
          response.OutputStream.Write(System.Text.Encoding.UTF8.GetBytes("¡Hola, mundo!"));
          response.Close();
        }
      }
    }
    

    Observa que agregamos el prefijo https://` al escuchador HTTP y añadimos el esquemaAuthenticationSchemes.Anonymous` para permitir solicitudes no autenticadas. También necesitamos especificar el certificado SSL que generamos anteriormente:

    listener.Prefixes.Add("https://*:8080/");
    listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
    listener.Start();
    
    listener.Prefixes.Add("https://*:8080/");
    listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
    listener.Start();
    
    var sslConfig = new Mono.Security.Protocol.Tls.SslServerStream.Configuration(new X509Certificate2("/etc/ssl/certs/server.crt"), true, false);
    var sslListener = new HttpsListener(listener, sslConfig);
    sslListener.Start();
    

    Aquí creamos un objeto sslConfig que especifica el certificado SSL a utilizar (server.crt), junto con algunas otras opciones. Luego, creamos un nuevo objeto HttpsListener que envuelve nuestro HttpListener original y comienza a escuchar solicitudes HTTPS.

    ¡Eso debería ser todo! Ahora puedes probar tu servidor HTTPS accediendo a él mediante un navegador web o curl, y deberías ver “¡Hola, mundo!” en texto plano.

    Ten en cuenta que este código de ejemplo utiliza la implementación de Mono para SSL/TLS. Si estás usando la implementación de .NET Core, deberías consultar su documentación sobre cómo configurar HTTPS.

Comments are closed.