TsgcHTTPServer › Propiedades › SSLOptions
Contiene rutas de certificados, selección de versión TLS y configuración de OpenSSL para el listener TLS.
property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;
Version=tlsUndefined, VerifyCertificate=False
Proporcione el material del certificado antes de activar el servidor cuando SSL es True: RootCertFile, CertFile y KeyFile apuntan a archivos PEM (utilice la misma ruta para los tres cuando el archivo contiene la cadena completa), y Password solo es necesaria si la clave privada está cifrada. Password también la lee el listener HTTP/3 que se habilita mediante HTTP3Options, de modo que el mismo archivo de clave cifrada sirve para ambos listeners. Establezca VerifyCertificate en True para solicitar y validar certificados de cliente (las sub-opciones FailIfNoCertificate y VerifyClientOnce refinan la comprobación) con VerifyDepth controlando la longitud de la cadena. Version selecciona una versión TLS específica (tls1_0, tls1_1, tls1_2, tls1_3) o deja la negociación abierta (tlsUndefined). Con iohNativeTLS es en cambio la versión mínima permitida, vea más abajo. OpenSSL_Options expone controles de bajo nivel: APIVersion (oslAPI_1_0/oslAPI_1_1/oslAPI_3_0), LibPath/LibPathCustom para localizar los binarios de OpenSSL, UnixSymLinks, ECDHE, CipherList, CurveList, VersionMin y X509Checks para la validación de nombre de host/IP.
IOHandler selecciona el motor TLS. iohOpenSSL es el predeterminado e iohSChannel utiliza el proveedor de Windows. iohNativeTLS selecciona el motor TLS escrito en Object Pascal puro del paquete sgcCrypto, que habla TLS 1.3 y TLS 1.2: no se carga ninguna biblioteca OpenSSL, y en TLS 1.3 los grupos híbridos de intercambio de claves poscuántico de RFC 10024 se ofrecen con X25519MLKEM768 en primer lugar. Sus dos listas de preferencia son NativeTLS_Options.Groups y NativeTLS_Options.CipherSuites, separadas por dos puntos al estilo de OpenSSL, y una lista vacía conserva los valores predeterminados del motor. El motor funciona igualmente con el motor clásico de un hilo por conexión y con los motores IOCP y EPOLL. iohAppleTLS e iohAndroidTLS son manejadores solo para cliente: un servidor con alguno de ellos genera una excepción al establecer Active en True, a menos que OnSSLGetHandler proporcione su propio manejador. Use en su lugar iohNativeTLS, iohOpenSSL o, en Windows, iohSChannel.
Para el motor nativo, Version es la versión mínima permitida, no una versión exacta como con iohOpenSSL. tlsUndefined (el valor predeterminado) y tls1_2 aceptan TLS 1.3 y TLS 1.2, tls1_3 acepta únicamente TLS 1.3, y tls1_0 o tls1_1 generan un error de configuración al arrancar el servidor, porque el motor solo admite TLS 1.2 y TLS 1.3. Para aceptar solo TLS 1.2, indique únicamente conjuntos de cifrado TLS 1.2, como TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, en NativeTLS_Options.CipherSuites. El motor valida los certificados de cliente frente a las raíces de RootCertFile, además de las raíces en las que confía el sistema operativo cuando NativeTLS_Options.UseSystemRoots es True (False de forma predeterminada). Con iohNativeTLS, CertFile también puede ser un archivo .pfx o .p12 que contenga el certificado, la cadena y la clave, abierto con Password. El motor reanuda sesiones con tickets de sesión de TLS 1.3 y TLS 1.2: NativeTLS_Options.SessionTickets (True de forma predeterminada) los activa y NativeTLS_Options.TicketLifetime (7200 segundos de forma predeterminada) establece cuánto tiempo puede usarse un ticket. La reanudación en TLS 1.2 requiere que el cliente admita el extended master secret. No acepta 0-RTT y no genera OnSSLVerifyPeer, que pertenece al IOHandler de OpenSSL. VerifyCertificate pide un certificado al cliente y lo valida, VerifyCertificate_Options.FailIfNoCertificate rechaza a un cliente que no envía ninguno, y VerifyClientOnce no tiene efecto porque el motor nunca renegocia. Consulte TLS nativo.
AllowPlainText (False de forma predeterminada) permite que el listener TLS acepte también conexiones HTTP y WebSocket sin cifrar en el mismo puerto. El servidor examina el primer byte de cada nueva conexión: $16 (registro de handshake TLS) significa TLS, cualquier otro valor se atiende como texto sin cifrar, y cuando no llega ningún byte dentro de PlainTextTimeout (milisegundos, 5000 de forma predeterminada) la conexión se trata como TLS. PlainTextPolicy decide qué ocurre con una conexión sin cifrar: ptpServe (el valor predeterminado) atiende la petición con normalidad, ptpRedirect responde 308 Permanent Redirect a https://<Host><path>, conservando el método y el cuerpo (400 Bad Request cuando la petición no tiene cabecera Host), y ptpReject responde 400 Bad Request y cierra la conexión. La propiedad de conexión TLS de TsgcWSConnectionServer indica si una conexión utiliza TLS. Estas opciones funcionan con el IOHandler Indy predeterminado y con los IOHandlers IOCP y EPOLL. Dentro de OnCommandGet, el método del servidor IsTLS(AContext) indica si la petición utiliza TLS. Véase TLS y HTTP sin cifrar en el mismo puerto.
oServer := TsgcHTTPServer.Create(nil);
oServer.SSL := true;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.Version := tls1_3;
oServer.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Active := true;