Su macOS è possibile hostare i propri siti web in locale sfruttando la directory ~/Sites come alternativa a /Library/WebServer/Documents.
Abilitazione della configurazione per-utente
Per farlo è sufficiente creare un file /etc/apache2/other/00-enable_userdir.conf contenente:
LoadModule userdir_module libexec/apache2/mod_userdir.so
Include /private/etc/apache2/extra/httpd-userdir.conf
Questo abiliterà il file /private/etc/apache2/extra/httpd-userdir.conf; dal file sarà dunque necessario decommentare la riga Include /private/etc/apache2/users/*.conf:
$ sed -i '.bak' 's%#\(Include /private/etc/apache2/users/*.conf\)%\1%' /etc/apache2/extra/httpd-userdir.conf
Procedere quindi con la generazione della configurazione per-utente:
<Directory "/Users/<username>/Sites/">
AddLanguage en .en
AddLanguage it .it
Options Indexes MultiViews FollowSymLinks ExecCGI
AllowOverride All
Require host localhost
</Directory>
Controllare la configurazione di Apache
$ apachectl configtest
Configurazione dei permessi
$ chmod +a “_www allow execute” ~
Avviare Apache
$ sudo apachectl start
PHP
Per eseguire codice PHP tramite Apache, è sufficiente creare un file /etc/apache2/other/00-php.conf contenente:
Come si può notare è presente il campo Nome: da macOS Monterey, è necessario firmare moduli esterni. Per farlo, seguirà una guida apposita.
Lanciare dunque: $ apachectl restart
Utilizzo
Ora è possibile lanciare i propri siti nella propria cartella utente. Per visualizzarli è sufficiente usare come URL: localhost/~<username>/<nome-sito>
Da macOS Monterey è diventato necessario firmare anche eventuali moduli Apache che si intendono usare, come libphp.so.
Dopo aver provato più guide, mi sono imbattuto in due guide12 che mi hanno aiutato a risolvere.
Riassumo dunque in questo post i passaggi necessari per poter firmare i propri moduli in autonomia.
Creazione di una Authority (CA)
Una Certificate Authority è un ente terzo di fiducia abilitato ad emettere un certificato digitale. Con questa procedura andremo a creare un’authority locale: di fatto ci auto-autenticheremo.
Recarsi in Accesso Portachiavi -> Assistente Certificato -> Crea un’autorità di certificazione.
In Crea la tua Certificate Authority:
a. Inserisci il nome della CA;
b. Seleziona come Tipo identità: CA principale autofirmannte;
c. Certificato utente: Firma codice;
d. Spuntare Lascia che sia io a sovrascrivere i default;
e. Spuntare Rendi CA di default;
f. Inserire l’indirizzo e-mail;
g. Proseguire (se compare un errore, ignoratelo).
Accettate i default per Informazioni del certificato e clicca continua (ignorare possibili avvisi);
Inserire i campi richiesti circa le informazioni del certificatore;
Accettare i default per Informazioni coppia di chiavi per questa CA e cliccare continua;
Accettare i default per Specifica dati coppia di chiavi degli utenti della CA e cliccare continua;
Accettare i default per Estensione utilizzo chiave per questa CA e cliccare continua;
Accettare i default per Estensione utilizzo chiave per utentidi questa CA e cliccare continua;
Nella maschera Estensione utilizzo chiave esteso per questa CA selezionare Includi estensione utilizzo chiave esteso, dunque selezionare Firma codice e continuare;
Nella maschera Estensione utilizzo chiave esteso per utenti di questa CA accettare i valori di default e continuare;
In Estensione limiti di base per questa CA, accettare dunque i valori predefiniti e procedere;
Accettare i valori predefiniti anche per le successive 3 maschere (Estensione limiti di base per gli utenti di questa CA, Estensione nome soggetto alternativo per questa CA e Nome soggetto alternativo per gli utenti di questa CA);
Selezionare il portachiavi login e selezionare la spunta;
Premere dunque (finalmente) su “Crea”.
E così abbiamo creato l’autorità che genererà il certificato: dunque non è finita.
Creazizone di un certificato
Aprire Accesso Portachiavi.app;
Recarsi in Accesso Portachiavi -> Assistente Certificato -> Crea un certificato.
Nella maschera appena comparsa specificare:
a. Il nome del certificato;
b. Tipo identità: Leaf;
c. Tipo certificato: Firma codice;
Selezionare CA or issuer dalla lista e premere Crea, premendo dunque Fatto.
Firma
Supponiamo di dover firmare libmodulo.so e che il certificato si chiami Alessandro.
Avevo necessità di inviare un file attraverso seriale, ed ho scoperto serio. Avevo già provato ad inviare un file con metodi alternativi:
sz: non sono però mai riuscito ad impiegarlo, nonostante picocom lo impieghi di default per l’invio dei file;
Convertire un file in base64, copiarlo e incollarlo.
Sono quindi incappato in questo script Python che lato end-device ha un solo requisito: echo deve avere il supporto a questi due flag: -e e -n.
Modifiche necessarie
Quello linkato è già un fork del progetto principale, con un branch dedicato al porting da Python 2 a Python3 (branch: python3). Sarà plausibilmente necessario modificare l’hashbang da #!/usr/bin/env python a #!/usr/bin/env python3.
Installazione
L’installazione richiede unicamente il clone del repository (o banalmente scaricarsi il file serio.py):
$ git clone -b python3 https://github.com/mattmart3/serio
Richiederà inoltre di installare come dipendenza pyserial: consiglio dunque l’uso di un virtualenv apposito se non si vuole sporcare il sistema:
Stamattina ho rimosso l’ambiente 5.12.4. “Poco male, avvio Maintenance tool e lo reinstallo”: sorpresa! Lo hanno rimosso.
Le strade sono dunque due:
Usare l’offline installer, dove al termine dell’installazione mi sono però ritrovato con un Maintenance Tool non aggiornato e privo di repository Qt (addio aggiornamenti);
Non essendo riuscito ad ottenere ciò che volevo col metodo 1, ho provato ad ingannare il secondo.
Usare l’offline installer
Banalmente, scaricare l’installer opportuno per il proprio SO da qui per la 5.12.4 o da qui per la 5.9.9.
Ingannare il Qt Online Installer
I punti esplicitati nella guida sono:
Installare un proxy HTTP che intercetti le richieste/risposte e ne permetta la modifica;
a. Predisporre l’ambiente a catturare unicamente la regex che ci interessa.
Configurare Qt Installer (dal pulsante impostazioni del tool stesso) affinché venga usato il proxy;
Lanciarlo
Attendere la GET e catturarne la risposta. La risposta è un JSON: modificarlo aggiungendoci, per ogni versione di Qt che vogliamo aggiungere, 2 entry: toolchain e documentazione.
Procedere all’installazione da GUI di Qt.
Guida pratica (qualora andasse offline)
Installazione del proxy
Installare e lanciare il proxy:
$ apt install mitmproxy && mitmweb
Si aprirà una pagina sul browser web. Andare nelle impostazioni del browser e configurare come HTTP e HTTPS proxy: 127.0.0.1:8080
Impostare dunque come regex: iapi\.qt\.io\/api\/v2\/repositories.+
Premere dunque nella pagina web di mitmproxy il pulsante blu “mitmproxy” -> Install certificates. Questo aprirà una pagina con alcune instruzioni da seguire per installare i certificati, che riassumo in:
scaricare un file .pem;
spostarlo in /usr/local/share/ca-certificates/;
$ sudo update-ca-certificates.
Installazione
Avviare il Qt online installer e configurarlo (da pulsante in basso a sx) affinché usi come proxy 127.0.0.1:8080 (potrebbe essere necessario impostarlo anche per server FTP). Inserire le credenziali e proseguire.
A questo punto dovrebbe bloccarsi a “Fetching […]”.
Andare sull’interfaccia del proxy: vi sarà una entry in arancione in sospeso. Cliccandoci sopra si aprirà la sezione “Flow” in alto nell’applicativo: premere su Resume.
Ora sarà arrivata la risposta da parte del server: nel riquadro a destra cliccare sulla scheda (tab) Response. Premere “Edit flow” (icona matita), copiare il JSON in un editor (o un beautifier) e aggiungere
Inserire quindi il nuovo JSON come Response e proseguire premendo Resume.
Una volta giunti alla schermata “Welcome” dell’installer, disattivare il proxy e continuare l’installazione normalmente dal Qt installer.
Posuere cubilia Curae; Ut et est. Donec semper nulla in ipsum. Integer elit. In
pharetra lorem vel ante.
Sed sed justo. Curabitur consectetuer arcu. Etiam placerat est eget odio. Nulla
facilisi. Nulla facilisi. Mauris non neque. Suspendisse et diam. Sed vestibulum
malesuada ipsum. Cras id magna. Nunc pharetra velit vitae eros. Vivamus ac
risus. Mauris ac pede laoreet felis pharetra ultricies. Proin et neque. Aliquam
dignissim placerat felis. Mauris porta ante sagittis purus.
Pellentesque quis leo eget ante tempor cursus. Pellentesque sagittis, diam ut
dictum accumsan, magna est viverra erat, vitae imperdiet neque mauris aliquam
nisl. Suspendisse blandit quam quis felis. Praesent turpis.
Fermentum quis, feugiat imperdiet, imperdiet id, sapien. Phasellus auctor nunc.
Vivamus eget augue quis neque vestibulum placerat. Duis placerat. Maecenas
accumsan rutrum lacus. Vestibulum lacinia semper nibh. Aenean diam odio,
scelerisque at, ullamcorper nec, tincidunt dapibus, quam. Duis vel ante nec
tortor porta mollis. Praesent orci. Cras dignissim vulputate metus.
Phasellus eu quam. Quisque interdum cursus purus. In orci. Maecenas vehicula.
Sed et mauris. Praesent feugiat viverra lacus. Suspendisse pulvinar lacus ut
nunc. Quisque nisi. Suspendisse id risus nec nisi ultrices ornare. Donec eget
tellus. Nullam molestie placerat felis. Aenean facilisis. Nunc erat. Integer in
tellus. Mauris volutpat, neque vel ornare porttitor.