Il nostro amato Lazarus permette, attraverso il pacchetto fpWeb, di creare delle applicazioni web con un server http embedded.
Ovviamente sappiamo che il protocollo http viaggia in chiaro e se vogliamo cifrare il traffico di rete è bene adottare il protocollo HTTPS. Quindi questa guida insegna solo come attivare il protocollo HTTPS, non ha la pretesa di insegnare l’utilizzo di fpWeb.
Proviamo a creare un semplice “Hello World”. Per prima cosa apriamo Lazarus e creiamo un nuovo progetto “Applicazione HTTP server”.
Ovviamente diamogli un nome, ad esempio laz_http_server.lpi e salviamo tutte le unit che ci propone di salvare.
A questo punto nella unit1 troviamo il componente FPWebModule1, attraverso l’ispettore oggetti andiamo nella proprietà action e aggiungiamo la voce index
Selezioniamo l’action appena creata e impostiamo i valori come nell’immagine sottostante
Poi andiamo nella sezione eventi e clicchiamo sulla voce OnRequest, come da immagine sottostante
Fino a far comparire la voce indexRequest come da immagine sottostante
Da editor sorgente andiamo a modificare la procedura indexRequest da così
procedure TFPWebModule1.indexRequest(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
begin
end;
a così
procedure TFPWebModule1.indexRequest(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
begin
AResponse.Contents.Text:=’Hello world’;
Handled := true;
end;
Poi andiamo nel file con estensione .lpr (nel nostro caso laz_http_server.lpr) e compiliamolo come nel codice qui sotto
program laz_http_server;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
opensslsockets,
fphttpapp, sysutils,unit1;
var
application_path : string;
begin
application_path := ExtractFilePath(paramStr(0));
Application.Title :=’laz_http_server’;
Application.Port := 8080;
Application.Threaded := True;
Application.UseSSL := True;
Application.LegacyRouting := True;
Application.HTTPhandler.HTTPServer.CertificateData.Certificate.FileName := application_path + ‘certificate.crt’;
Application.HTTPhandler.HTTPServer.CertificateData.PrivateKey.FileName := application_path + ‘privateKey.key’;
writeln(‘https://localhost:’, Application.Port, ‘/TFPWebModule1/index’);
Application.Initialize;
Application.Run;
end.
Dal codice potete notare che l’eseguibile attiva il protocollo SSL e per fare questo necessita del programma openssl o installato o inserendo gli eseguibili nella stessa cartella dove verrà localizzato il file eseguibile generato dal progetto lazarus. L’immagine che segue è un esempio di come dovrebbe risultare su windows
Ovviamente avrete notato che cerca anche i file certificate.crt e privateKey.key nella stessa cartella, per generare questi file bisogna usare sempre OpenSSL. Su linux/mac è semplice e basta lanciare il seguente comando dalla console (e dopo esserci posizionati nella cartella dove risiede l’eseguibile laz_http_server
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
Mentre su windows bisogna lanciare il seguente comando (sempre dalla cartella in cui risiede l’eseguibile laz_http_server.exe)
openssl.exe req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt -config .\openssl.cnf
A questo punto il nostro esempio dovrebbe essere funzionante e dovrebbe bastare lanciare l’eseguibile creato, ottenendo un risultato simile all’immagine seguente
Ovviamente è l’url che bisogna copiare e incollare nel browser.
Il browser vi segnalerà che esiste un potenziale rischio per la sicurezza, questo perchè si tratta di un certificato autofirmato (non distribuito da un ente certificatore, se ve ne serve uno potete adottare l’ottimo LetsEncrypt). Voi comunque accettate il rischio e continuate. Otterrete un’immagine simile a quella seguente
Ovviamente l’esempio è davvero minimale, ma questo apre la strada alla realizzazione di servizi ben più complessi.
Nel mio esempio ho usato la versione openssl-1.0.2o-x64-VC2017.zip di openssl che potete trovare al seguente indirizzo url: https://indy.fulgan.com/SSL/Archive/
EDIT: l’utente DragoRosso del forum https://www.lazaruspascal.it/ segnala anche un altro repository (quello di Indy – con binari testati e funzionanti), la 1.0.2u è l’ultima versione della release 1.0, supporta fino a TLS 1.2