{"id":13650441,"url":"https://github.com/italia/cie-cns-apache-docker","last_synced_at":"2026-04-08T01:32:06.522Z","repository":{"id":34614634,"uuid":"161830083","full_name":"italia/cie-cns-apache-docker","owner":"italia","description":"Template di sistema di autenticazione tramite la Smart Card TS-CNS (o CNS) e la CIE (Carta d'Identità Elettronica) basato su Apache HTTP.","archived":false,"fork":false,"pushed_at":"2025-04-18T10:11:08.000Z","size":25386,"stargazers_count":58,"open_issues_count":0,"forks_count":13,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-18T22:59:51.301Z","etag":null,"topics":["apache2","cns","smartcard","ssl","tls","ts-cns","vetinfo"],"latest_commit_sha":null,"homepage":"http://bit.ly/3aJ5Gbl","language":"Hack","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/italia.png","metadata":{"files":{"readme":"README.markdown","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-12-14T19:15:11.000Z","updated_at":"2025-04-18T10:11:11.000Z","dependencies_parsed_at":"2024-11-10T01:30:54.666Z","dependency_job_id":"acd1160a-0eb7-4243-8859-74506d6fe477","html_url":"https://github.com/italia/cie-cns-apache-docker","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/italia/cie-cns-apache-docker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/italia%2Fcie-cns-apache-docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/italia%2Fcie-cns-apache-docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/italia%2Fcie-cns-apache-docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/italia%2Fcie-cns-apache-docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/italia","download_url":"https://codeload.github.com/italia/cie-cns-apache-docker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/italia%2Fcie-cns-apache-docker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31536467,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache2","cns","smartcard","ssl","tls","ts-cns","vetinfo"],"created_at":"2024-08-02T02:00:36.804Z","updated_at":"2026-04-08T01:32:06.509Z","avatar_url":"https://github.com/italia.png","language":"Hack","funding_links":[],"categories":["🎭 Electronic identity card (CIE)"],"sub_categories":[],"readme":"# Apache HTTP 2.4 per Smart Card TS-CNS (Tessera Sanitaria - Carta Nazionale Servizi) e CIE (Carta d'Identità Elettronica)\n[![Antonio Musarra's Blog](https://img.shields.io/badge/maintainer-Antonio_Musarra's_Blog-purple.svg?colorB=6e60cc)](https://www.dontesta.it) [![Twitter Follow](https://img.shields.io/twitter/follow/antonio_musarra.svg?style=social\u0026label=%40antonio_musarra%20on%20Twitter\u0026style=plastic)](https://twitter.com/antonio_musarra) \n[![Twitter Follow](https://img.shields.io/twitter/follow/developersITA.svg?style=social\u0026label=%40developersITA%20on%20Twitter\u0026style=plastic)](https://twitter.com/developersITA) [![Join the #design channel](https://img.shields.io/badge/Slack%20Channell-%23cie-green)](https://developersitalia.slack.com/archives/C75U26411)\n\n[![Tag](https://img.shields.io/github/tag/italia/cie-cns-apache-docker.svg)](https://github.com/italia/cie-cns-apache-docker/releases)\n\n\nL'obiettivo di questo progetto è quello di fornire un **template** pronto all'uso\nche realizza un sistema di autenticazione tramite la Smart Card **TS-CNS** (o CNS)\ne la **CIE** (Carta d'Identità Elettronica) basato su [Apache HTTP](http://httpd.apache.org/docs/2.4/). \n**Ognuno può poi modificare o specializzare questo progetto sulla base delle proprie esigenze**\n\nSi tratta di un progetto [docker](https://www.docker.com/) per la creazione di \nun container che implementa un sistema di **mutua autenticazione o autenticazione bilaterale SSL/TLS**.\nQuesto meccanismo di autenticazione richiede anche il certificato digitale \nda parte del client, certificato che in questo caso risiede all'interno della TS-CNS\no della CIE.\n\nLa particolarità del sistema implementato (attraverso questo container) è quella \ndi consentire l'autenticazione tramite:\n\n1. La **TS-CNS (Tessera Sanitaria - Carta Nazionale Servizi)**, rilasciata dalla \nregione di appartenenza;\n2. La **CIE (Carta d'Identità Elettronica)**, rilasciata dal comune di residenza.\n\nPer la Regione Lazio il portale di riferimento per la TS-CNS è https://cns.regione.lazio.it/. \nOgni regione ha il proprio portale dedicato alla TS-CNS dov'è possibile trovare \ntutte le informazioni utili.\n\nLa maggior parte dei comuni d'Italia è abilitato al rilascio della CIE.\nLa pagina [La Carta d'identità elettronica nei Comuni d’Italia](https://www.cartaidentita.interno.gov.it/la-carta-identita-nei-comuni-ditalia/)\ndel Ministero dell'Interno mostra il dettaglio di quali sono i comuni abilitati. \n\nSul sito dell'Agenzia per l'Italia digitale (AgID) nella sezione [Piattaforme/Carta Nazionale Servizi](https://www.agid.gov.it/it/piattaforme/carta-nazionale-servizi), sono disponibili\ntutti i documenti tecnici da consultare per eventuali approfondimenti.\n\nSul sito del Ministero dell'Interno dedicato alla CIE, il documento [Carta d'Identità Elettronica CIE 3.0](https://www.cartaidentita.interno.gov.it/wp-content/uploads/2016/07/cie_3.0_-_specifiche_chip.pdf) descrive\nla CIE dal punto di vista prettamente tecnico e in modo approfondito.\n\nSe vuoi conoscere di più sul progetto, invito a leggere l'articolo \n[Cos’è il progetto CIE/CNS Apache Docker](http://bit.ly/3aJ5Gbl)\n\nSei impaziente? Bene, allora potresti provare con Play-With-Docker ;-)\n\n[![Try in PWD](https://raw.githubusercontent.com/play-with-docker/stacks/master/assets/images/button.png)](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/italia/cie-cns-apache-docker/master/docker-compose-play-with-docker.yml) \n\n## 1 - Overview\nQuesto container parte dall'immagine base di [*ubuntu:22.04*](https://hub.docker.com/_/ubuntu), \npoi specializzato al fine di soddisfare i requisiti minimi per un sistema di \nautenticazione basato sulla TS-CNS.\n\nIl software di base installato è:\n\n* Apache HTTP 2.4 (2.4.51)\n* PHP 8 (8.0.8)\n* Modulo PHP per Apache\n\n_L'installazione di PHP e del modulo per Apache è del tutto opzionale_. I due \nmoduli sono stati installati esclusivamente per costruire la pagina di atterraggio\ndell'utente dopo la fase di autenticazione. Questa pagina mostra le informazioni\nestratte dal certificato digitale.\n\n## 2 - Struttura del Docker File\nCerchiamo di capire quali sono le sezioni più significative del Dockefile. \nLa prima riga del file (come anticipato in precedenza) fa in modo che il \ncontainer parta dall'immagine docker *ubuntu:22.04*.\n\n```docker\nFROM ubuntu:22.04\n```\n\nA seguire c'è la sezione delle variabili di ambiente che sono prettamente \nspecifiche di Apache HTTP. I valori di queste variabili d'ambiente possono\nessere modificate in base alle proprie esigenze.\n\n```docker\n# Apache ENVs\nENV APACHE_SERVER_NAME entra-cns-cie.dontesta.it\nENV APACHE_SERVER_ADMIN entra-cns-cie@dontesta.it\nENV APACHE_SSL_CERTS entra-cns-cie.dontesta.it_crt.pem\nENV APACHE_SSL_PRIVATE entra-cns-cie.dontesta.it_key.pem\nENV APACHE_SSL_PORT 10443\nENV APACHE_LOG_LEVEL info\nENV APACHE_SSL_LOG_LEVEL info\nENV APACHE_SSL_VERIFY_CLIENT optional\nENV APPLICATION_URL https://${APACHE_SERVER_NAME}:${APACHE_SSL_PORT}\nENV CLIENT_VERIFY_LANDING_PAGE /error.php\n```\n\nLe prime due variabili sono molto esplicative, la prima in particolare,\nimposta il server name, che in questo caso è: entra-cns-cie.dontesta.it.\n\nLe due variabili `APACHE_SSL_CERTS` e `APACHE_SSL_PRIVATE` impostano:\n\n1. il nome del file che contiene il certificato pubblico del server in formato PEM;\n2. il nome del file che contiene la chiave privata (in formato PEM) del certificato pubblico.\n\nIl certificato utilizzato in questo progetto è stato rilasciato da \nZeroSSL RSA Domain Secure Site CA e richiesto tramite il servizio offerto da \n[ZeroSSL](https://zerossl.com).\n\nIl CN di questo specifico certificato è impostato a *entra-cns-cie.dontesta.it*. La \nscadenza prevista per questo certificato è il 03 novembre 2021.\n\nDi default la porta *HTTPS* è impostata a **10443** dalla variabile `APACHE_SSL_PORT`.\nLa variabile `APPLICATION_URL` definisce il path di redirect qualora si accedesse \nvia protocollo HTTP e non HTTPS.\n\nLe variabili `APACHE_LOG_LEVEL`e `APACHE_SSL_LOG_LEVEL`, consentono di modificare\nil livello log generale e quello specifico per il modulo SSL. Il valore di default\nè impostato a INFO. Per maggiori informazioni potete consultare la documentazione su\n[LogLevel Directive](https://httpd.apache.org/docs/2.4/mod/core.html#loglevel).\n\nLa variabile `APACHE_SSL_VERIFY_CLIENT` agisce sulla configurazione del processo\ndi verifica del certificato lato client. Il valore di default è impostato a **optional**.\nRendere opzionale la verifica, consente una gestione più flessibile dell'errore \nin caso che la validazione fallisse.\n\nNel caso in cui il valore della direttiva di Apache **SSLVerifyClient** sia \noptional o optional_no_ca, in caso di errore viene visualizzata una specifica\npagina di errore definita dalla variabile `CLIENT_VERIFY_LANDING_PAGE`.\n\nA seguire c'è la sezione delle variabili di ambiente che sono prettamente \nspecifiche per lo script di download dei certificati pubblici degli enti. Questi enti,\nsono autorizzati dallo stato Italiano al rilascio di certificati digitali \nper il cittadino e le aziende.\n\nLa variabile d'ambiente `GOV_TRUST_CERTS_SERVICE_TYPE_IDENTIFIER` applica il filtro\nsul **Service Type Identifier**, il cui valore assunto nel caso della CNS e CIE è\nhttp://uri.etsi.org/TrstSvc/Svctype/IdV\n\n```docker\n# Env for Trusted CA certificate\nENV GOV_TRUST_CERTS_OUTPUT_PATH /tmp/gov/trust/certs\nENV GOV_TRUST_CERTS_SERVICE_TYPE_IDENTIFIER http://uri.etsi.org/TrstSvc/Svctype/IdV\n```\n\nA seguire un estratto dalla **Trust Service Status List** dov'è riportato il valore\ndell'elemento _ServiceTypeIdentifier_.\n\n```xml\n\u003cServiceInformation\u003e\n\u003cServiceTypeIdentifier\u003ehttp://uri.etsi.org/TrstSvc/Svctype/IdV\u003c/ServiceTypeIdentifier\u003e\n\u003cServiceName\u003e\n\u003cName xml:lang=\"en\"\u003eCN=Provincia autonoma Bolzano - CA Cittadini, OU=Servizi di Certificazione, O=Actalis S.p.A., C=IT\u003c/Name\u003e\n\u003c/ServiceName\u003e\n\u003cServiceDigitalIdentity\u003e\n\u003cDigitalId\u003e\n\u003cX509Certificate\u003e...\u003c/X509Certificate\u003e\n\u003c/DigitalId\u003e\n\u003c/ServiceDigitalIdentity\u003e\n\u003cServiceStatus\u003ehttp://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/recognisedatnationallevel\u003c/ServiceStatus\u003e\n\u003cStatusStartingTime\u003e2016-06-30T22:00:00Z\u003c/StatusStartingTime\u003e\n\u003c/ServiceInformation\u003e\n```\n\nLa sezione a seguire del Dockerfile, contiene tutte le direttive necessarie per \nl'installazione del software indicato in precedenza. Dato che la \ndistribuzione scelta è [**Ubuntu**](https://www.ubuntu.com/), il comando *apt* è\nresponsabile della gestione dei package, quindi dell'installazione.\n\n```docker\n# Install services, packages and do cleanup\nRUN apt update \\\n    \u0026\u0026 apt install -y apache2 \\\n    \u0026\u0026 apt install -y ca-certificates \\\n    \u0026\u0026 apt install -y php libapache2-mod-php \\\n    \u0026\u0026 apt install -y python3 \\\n    \u0026\u0026 apt install -y cron \\\n    \u0026\u0026 apt install -y pip \\\n    \u0026\u0026 pip install lxml \\\n    \u0026\u0026 pip install cryptography \\\n    \u0026\u0026 rm -rf /var/lib/apt/lists/*\n```\n\nL'installazione di Python è necessaria per eseguire lo script `parse-gov-certs.py`\nresponsabile del download di tutti i certificati pubblici degli enti che sono \nautorizzati dallo stato Italiano al rilascio di certificati digitali per \nil cittadino e le aziende.\n\nIl punto di distribuzione dei certificati (chiamato [Trust Service Status List](http://uri.etsi.org/02231/v3.1.2/)) \nè gestito dall'[Agenzia per l'Italia Digitale o AgID](https://www.agid.gov.it/) e \nraggiungibile al seguente URL https://eidas.agid.gov.it/TL/TSL-IT.xml\n\n\n```docker\n# Download Trusted CA certificate and copy to ssl system path\nRUN /usr/local/bin/parse-gov-certs.py \\\n        --output-folder ${GOV_TRUST_CERTS_OUTPUT_PATH} \\\n        --service-type-identifier ${GOV_TRUST_CERTS_SERVICE_TYPE_IDENTIFIER} \\\n    \u0026\u0026 cp ${GOV_TRUST_CERTS_OUTPUT_PATH}/*.pem /etc/ssl/certs/\n```\n\n\u003e Attenzione: dalla release 2.3.0 del progetto, è stata introdotta sullo script `parse-gov-certs.py` la funzionalità di\n\u003e controllo scadenza validità dei certificati. Per impostazione predefinita, lo script non salva i certificati\n\u003e scaduti e scrive un messaggio del tipo `Skipping expired certificate`. Qualora si vogliano salvare i certificati\n\u003e scaduti, è possibile utilizzare l'opzione `--save-expired-certs` e in questo caso lo script salverà i certificati\n\u003e scaduti con il suffisso `_expired` e scriverà un messaggio del tipo `Added certificate: expired...`.\n \nLa sezione a seguire del Dockerfile, anch'essa esplicativa, copia le \nconfigurazioni di Apache opportunamente modificate al fine di abilitare \nla mutua autenticazione.\n\n\n```docker\n# Copy Apache configuration file\nCOPY configs/httpd/default-ssl.conf /etc/apache2/sites-available/\nCOPY configs/httpd/ssl-params.conf /etc/apache2/conf-available/\nCOPY configs/httpd/dir.conf /etc/apache2/mods-enabled/\nCOPY configs/httpd/ports.conf /etc/apache2/\n```\n\nLa sezione a seguire del Dockerfile, copia il certificato pubblico e la relativa \nchiave privata.\n\n```docker\n# Copy Server (pub and key) entra-cns-cie.dontesta.it\nCOPY configs/certs/*_crt.pem /etc/ssl/certs/\nCOPY configs/certs/*_ca_bundle.pem /etc/ssl/certs/\nCOPY configs/certs/*_key.pem /etc/ssl/private/\n``` \n\nLa sezione a seguire del Dockerfile, copia una semplice applicazione a scopo \ndi test sulla *document root* standard di Apache.\n\n```docker\n# Copy php samples script and other\nCOPY configs/www/*.php /var/www/html/\nCOPY configs/www/bootstrap-italia /var/www/html/bootstrap-italia\nCOPY configs/www/css /var/www/html/css\nCOPY configs/www/img /var/www/html/img\nCOPY configs/www/js /var/www/html/js\nCOPY configs/www/secure /var/www/html/secure\n```\n\nLa sezione a seguire del Dockerfile, copia gli script necessari attivare il cron\ne consentire l'aggiornamento dei certificati della CNS una volta al giorno.\n\n```docker\n# Copy auto-update-gov-certificates scripts and entrypoint\nCOPY scripts/auto-update-gov-certificates /auto-update-gov-certificates\nCOPY scripts/entrypoint /entrypoint\n```\n\nLa sezione a seguire del Dockerfile, esegue una serie di comandi con l'obiettivo\nfinale di abilitare l'aggiornamento dei certificati della CNS e CIE.\n\n```docker\n# Set execute flag for entrypoint and crontab entry\n# Add Cron entry auto-update-gov-certificates\n# Create Project ENV for crontab\nRUN chmod +x /entrypoint \\\n    \u0026\u0026 chmod +x /auto-update-gov-certificates \\\n    \u0026\u0026 echo \"30 23 * * * root . /project_env.sh; /auto-update-gov-certificates \u003e\u003e /var/log/cron.log 2\u003e\u00261\" \u003e /etc/cron.d/auto-update-gov-certificates \\\n    \u0026\u0026 printenv | sed 's/^\\(.*\\)$/export \\1/g' | grep -E \"APACHE_|APPLICATION_URL|GOV_\" \u003e /project_env.sh \\\n    \u0026\u0026 chmod +x /project_env.sh\n```\nL'aggiornamento dei certificati avviene una volta al giorno alle ore 23:30. L'esecuzione\ndello script di aggiornamento produce i due file di log cron.log e auto-update-gov-certificates.log.\nEntrambe i file di log risiedono all'interno del folder /var/log.\n\nLa sezione a seguire del Dockerfile esegue le seguenti attività:\n\n1. abilita il modulo SSL\n2. abilita il modulo headers\n3. abilita il site ssl di default con la configurazione per la TS-CNS e CIE\n4. abilita delle opzioni di configurazione al fine di rafforzare la sicurezza SSL/TLS\n5. esegue il re-hash dei certificati. Operazione necessaria affinché Apache sia in grado di leggere i nuovi certificati\n\n\n```docker\nRUN a2enmod ssl \\\n    \u0026\u0026 a2enmod headers \\\n    \u0026\u0026 a2enmod rewrite \\\n    \u0026\u0026 a2ensite default-ssl \\\n    \u0026\u0026 a2enconf ssl-params \\\n    \u0026\u0026 c_rehash /etc/ssl/certs/\n```\n\nLe due ultime direttive indicate sul Dockerfile, dichiarano la porta HTTPS \n(`APACHE_SSL_PORT`) che deve essere pubblicata e il comando da eseguire per mettere \nin listen (o ascolto) il nuovo servizio Apache HTTP.\n\n## 3 - Qualche nota su OCSP\nIl protocollo **OCSP (Online Certificate Status Protocol)** definito dall'[RFC 2560](https://www.ietf.org/rfc/rfc2560.txt) \nè un meccanismo per determinare se un certificato del server è stato revocato o meno. \nQuesto protocollo è stato creato in alternativa al **CRL (Certificate Revocation List)** \n\nL'**OCSP Stapling** è una \"forma speciale\" di protocollo, in cui il server, \nmantiene le risposte OCSP correnti per i suoi certificati e li invia ai client \nche comunicano con il server.\n\nLa maggior parte dei certificati contiene l'indirizzo di un risponditore OCSP \ngestito dall'autorità di certificazione emittente, **mod_ssl** può comunicare con \ntale risponditore per ottenere una risposta firmata che può essere inviata ai \nclient che comunicano con il server.\n\nPoiché il client può ottenere lo stato di revoca del certificato dal server, \nsenza richiedere una connessione aggiuntiva dal client all'autorità di certificazione, \nil metodo OCSP Stapling, è il modo preferito per ottenere lo stato di revoca. \n\nAltri vantaggi dell'eliminazione della comunicazione tra i client e l'autorità \ndi certificazione sono che la cronologia di navigazione del client non è esposta \nall'autorità di certificazione e lo stato di ottenimento è più affidabile \nnon dipendendo da server di autorità di certificazione potenzialmente \npesantemente caricati.\n\nPoiché la risposta ottenuta dal server può essere riutilizzata per tutti i \nclient che utilizzano lo stesso certificato durante il tempo in cui la \nrisposta è valida, il sovraccarico per il server è minimo.\n\nUna volta che il supporto SSL è stato configurato correttamente, abilitare \nl'OCSP Stapling generalmente richiede solo modifiche molto minori alla \nconfigurazione httpd.\n\nA seguire la configurazione dell'OCSP Stapling applicata in questo progetto.\n\n```\nSSLUseStapling on\nSSLStaplingCache \"shmcb:logs/stapling-cache(150000)\"\n```\n\nÈ possibile utilizzare due metodi per verificare se l'OCSP Stapling funziona: \nutilizzando il comando `openssl` e il test [SSL su Qualys](https://www.ssllabs.com/ssltest/).\n\n```bash\necho QUIT | openssl s_client -connect entra-cns-cie.dontesta.it:443 -status 2\u003e /dev/null | grep -A 17 'OCSP response:' | grep -B 17 'Next Update'\n```\nRisposta OCSP per il certificato del server entra-cns-cie.dontesta.it\n\n```\nOCSP response:\n======================================\nOCSP Response Data:\n    OCSP Response Status: successful (0x0)\n    Response Type: Basic OCSP Response\n    Version: 1 (0x0)\n    Responder Id: C8D97868A2D91968D53D72DE5F0A3EDCB58686A6\n    Produced At: Aug  7 05:34:48 2021 GMT\n    Responses:\n    Certificate ID:\n      Hash Algorithm: sha1\n      Issuer Name Hash: 082E3FF9058CFE8A7C18BD13EFDF1D1660707A6B\n      Issuer Key Hash: C8D97868A2D91968D53D72DE5F0A3EDCB58686A6\n      Serial Number: 42F5FA2D3D023DEDD74CC743E7657B69\n    Cert Status: good\n    This Update: Aug  7 05:34:48 2021 GMT\n    Next Update: Aug 14 05:34:48 2021 GMT\n```\n\nA seguire l'estratto del test eseguito su https://entra-cns-cie.dontesta.it tramite\n[SSL Labs Qualys](https://www.ssllabs.com/ssltest/analyze.html?d=entra-cns-cie.dontesta.it) dove si evidenzia\nl'abilitazione dell'OCSP Stapling.\n\n![SSL Labs Qualys](images/SSLLABS_CNS_DONTESTA_IT.png)\n\n**Evidenza dell'abilitazione dell'OCSP Stapling**\n\nIl protocollo CRL richiede al browser di scaricare quantità potenzialmente elevate \ndi'informazioni di revoca del certificato SSL: numeri di serie del certificato e \nstato dell'ultima data di pubblicazione di ciascun certificato. Il problema con \nil protocollo CRL è che può aumentare il tempo impiegato per completare la \nnegoziazione SSL.\n\n### - Vantaggi\n\nOCSP ha alcuni vantaggi rispetto alle CRL:\n\n1. Elimina la necessità per i client di scaricare e analizzare le liste di revoca.\n2. Provvede a un migliore utilizzo della banda: dal momento che un messaggio OCSP ha una dimensione trascurabile rispetto alle CRL.\n3. Supporta una catena fidata di OCSP richiesta tra i vari responder. Questo permette ai clienti di comunicare con un responder fidato per interrogare un altro responder.\n4. OCSP è più efficiente delle CRL e quindi scala in modo migliore.\n\n### - Svantaggi\nOCSP ha anche alcuni punti sfavorevoli rispetto alle CRL:\n\n1. Per ogni revoca è necessario fare una richiesta al responder, se il responder non risponde entro un timeout OCSP verrà ignorato silenziosamente.\n2. Ogni richiesta deve essere analizzata dal responder, di fatto si passa la cronologia di navigazione al responder, questo è un evidente problema di privacy.\n\nConsiglio la lettura della documentazione su [OCSP Stapling](http://httpd.apache.org/docs/2.4/ssl/ssl_howto.html#ocspstapling) per maggiori \ninformazioni sulla configurazione e le pratiche migliori d'utilizzo.\n\n## 4 - Organizzazione\nIn termini di directory e file, il progetto è organizzato così come mostrato a \nseguire. Il cuore di tutto è il folder **configs**.\n\n```\n├── Dockerfile\n├── configs\n│    ├── certs\n│    │   ├── entra-cns-cie.dontesta.it_crt.pem\n│    │   └── entra-cns-cie.dontesta.it_key.pem\n│    ├── httpd\n│    │   ├── 000-default.conf\n│    │   ├── default-ssl.conf\n│    │   ├── dir.conf\n│    │   ├── ports.conf\n│    │   └── ssl-params.conf\n│    └── wwww\n└── scripts\n    ├── auto-update-gov-certificates\n    ├── parse-gov-certs.py\n    └── entrypoint\n```\n\nIl folder *configs* contiene al suo interno altri folder e file, in particolare:\n\n1. **certs**\n    * contiene il certificato del server (chiave pubblica e chiave privata);\n2. **httpd**: contiene tutte le configurazioni di Apache necessarie per attivare l'autenticazione tramite la Smart Card TS-CNS e CIE;\n3. **www**: contiene la piccolissima applicazione di test;\n4. **scripts**: contiene gli scripts di aggiornamento certificati e abiliatazione del servizio cron\n\n## 5 - Quickstart\nL'immagine di questo progetto docker è disponibile sull'account docker hub\n[italia/cie-cns-apache-docker](https://hub.docker.com/r/italia/cie-cns-apache-docker).\n\nA seguire il comando per il pull dell'immagine docker su docker hub. Il primo comando \nesegue il pull dell'ultima versione (tag latest), mentre il secondo comando esegue \nil pull della specifica versione dell'immagine, in questo caso la versione 2.1.0.\n\n```bash\ndocker pull italia/cie-cns-apache-docker\ndocker pull italia/cie-cns-apache-docker:2.1.0\n```\nUna volta eseguito il pull dell'immagine docker (versione 2.1.0) è possibile creare il nuovo\ncontainer tramite il comando a seguire. È possibile utilizzare la porta HTTPS \nstandard (443) se libera e se in ogni caso le policy del sistema operativo ne \nconsentano l'uso.\n\n```bash\n# Run del container per l'ultima versione dell'immagine\ndocker run -i -t -d -p 443:10443 --name=cie-cns italia/cie-cns-apache-docker\n\n# Run del container per l'immagine versione 2.1.0\ndocker run -i -t -d -p 10443:10443 --name=cie-cns italia/cie-cns-apache-docker:2.1.0\n\n# Per usare la porta standard HTTPS fare il mount della directory locale dove\n# risiedono le pagine dell'applicazione d'esempio.\ndocker run -i -t -d -p 443:10443 --name=cie-cns --mount type=bind,source=\"$(pwd)\"/configs/www,destination=/var/www/html,consistency=cached italia/cie-cns-apache-docker:2.1.0\n```\n\nUtilizzando il comando `docker ps` dovremmo poter vedere in lista il nuovo\ncontainer, così come indicato a seguire.\n\n```bash\nCONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                      NAMES\nbb707fb00e89        italia/cie-cns-apache-docker:2.1.0   \"/usr/sbin/apache2ct…\"   6 seconds ago       Up 4 seconds        0.0.0.0:10443-\u003e10443/tcp   cie-cns\n```\n\nNel caso in cui vogliate apportare delle modifiche, dovreste poi procedere con \nla build della nuova immagine e al termine di questa lanciare l'immagine ottenuta. \nA seguire sono indicati i comandi *docker* da eseguire dal proprio terminale.\n\n_I comandi docker di build e run devono essere lanciati dalla root della directory \ndi progetto dopo aver fatto il clone di questo repository._\n\n```bash\ndocker build -t cie-cns-apache-docker .\ndocker run -i -t -d -p 10443:10443 --name=cie-cns cie-cns-apache-docker:latest\n```\n\nA questo punto sul nostro sistema dovremmo avere la nuova immagine con il \nnome **cie-cns-apache-docker** e in esecuzione il nuovo container chiamato\n**cie-cns**. \n\nUtilizzando il comando `docker images` dovremmo poter vedere in lista la nuova\nimmagine, così come indicato a seguire.\n\n```\nREPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE\ncie-cns-apache-docker                           latest              1a145475d1f1        30 minutes ago      208MB\n```\n\nUtilizzando il comando `docker ps` dovremmo poter vedere in lista il nuovo\ncontainer con le modifiche apportate, così come indicato a seguire.\n\n```\nCONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                      NAMES\n65c874216624        cie-cns-apache-docker:latest   \"/usr/sbin/apache2ct…\"   36 minutes ago      Up 36 minutes       0.0.0.0:10443-\u003e10443/tcp   cie-cns\n```\n\nDa questo momento è possibile raggiungere il servizio di autenticazione basato\nsulla TS-CNS e CIE utilizzando il browser. \n\nPer evitare l'errore `SSL_ERROR_BAD_CERT_DOMAIN` da parte del browser, raggiungendo \nil servizio tramite la URL https://127.0.0.1:10443/, bisogna aggiungere al proprio\nfile di _hosts_ la riga a seguire.\n\n```\n##\n# Servizio di autenticazione via TS-CNS\n##\n127.0.0.1       entra-cns-cie.dontesta.it\n```\n\nIn ambiente di collaudo e/o produzione il nome del servizio o FQDN sarà registrato \nsu un DNS.\n\nLato **server-side** è tutto pronto, non resta fare altro che un test. \nNel caso disponiate di una vostra Smart Card TS-CNS o CIE e il vostro PC già \nconfigurato per l'utilizzo, potreste eseguire da subito un test puntando il \nvostro browser alla URL https://entra-cns-cie.dontesta.it:10443/.\n\nRiguardo il lettore di Smart Card, personalmente utilizzo due modelli prodotti\nda Bit4id per i quali non ho riscontrato problemi di compatibilità con i più\ndiffusi sistemi operativi.\n\n1. [miniLector CIE](https://shop.bit4id.com/prodotto/minilector-cie/?utm_source=ref_blog\u0026utm_medium=post\u0026utm_campaign=ref_dontesta\u0026utm_content=v1)\n2. [miniLector CIE Datasheet](https://www.bit4id.com/wp-content/uploads/2019/05/minilector_cie.pdf?utm_source=blog\u0026utm_medium=post\u0026utm_campaign=ref_dontesta\u0026utm_content=v1)\n3. [miniLector EVO](https://shop.bit4id.com/prodotto/minilector-evo/?utm_source=ref_blog\u0026utm_medium=post\u0026utm_campaign=ref_dontesta\u0026utm_content=v1)\n4. [miniLector EVO Datasheet](https://support.bit4id.com/files/downloads/documents/datasheet/ds_minilector_evo_it.pdf?utm_source=blog\u0026utm_medium=post\u0026utm_campaign=ref_dontesta\u0026utm_content=v1)\n\nPuntando all'indirizzo https://entra-cns-cie.dontesta.it:10443/ dovrebbe accadere quanto \nsegue:\n\n1. Richiesta del PIN CODE della vostra TS-CNS o CIE;\n2. Richiesta di selezione del vostro certificato digitale;\n3. Visualizzazione della pagina di benvenuto.\n\nOltre a verificare che il certificato digitale sulla CNS e CIE sia valido, è anche\neseguito il controllo per cui tra le **Certificate Policies (Object ID: 2.5.29.32)** \nci sia quella specifica della CNS e CIE. Certification Policies:\n\n1. CNS identificata dall'OID [1.3.76.16.2.1](http://oid-info.com/cgi-bin/display?oid=1.3.76.16.2.1\u0026action=display);\n2. CIE identificata dall'OID [1.3.76.47.4](http://oid-info.com/cgi-bin/display?oid=1.3.76.47\u0026action=display)\n\nQuesto check è demandato allo script PHP `configs/www/secure/certificate_policy_check.php` \nmostrato di seguito.\n\n```php\n\u003c?php\n$cnsCertificatePolicies = 'Policy: 1.3.76.16.2.1';\n$cieCertificatePolicies = 'Policy: 1.3.76.47.4';\n\n$ssl = openssl_x509_parse(getenv('SSL_CLIENT_CERT'));\n\nif((preg_match(\"/$cnsCertificatePolicies$/m\", $ssl['extensions']['certificatePolicies']) == 0) \u0026\u0026 \n    (preg_match(\"/$cieCertificatePolicies$/m\", $ssl['extensions']['certificatePolicies']) == 0)) {\n    \n    die(\"Il certificato è valido ma non dispone della Certification Policy \n        che dovrebbe avere una CNS - Carta Nazionale Servizi o la CIE - Carta d'Identità Elettronica. \n        \u003cbr\u003eLa Certification Policy per la CNS è definita dall'OID 1.3.76.16.2.1 mentre per la CIE\n        è definita dall'OID 1.3.76.47.4.\n\n        \u003cul\u003e\n            \u003cli\u003eOID 1.3.76.16.2.1 =\u003e \u003ca href='http://oid-info.com/cgi-bin/display?oid=1.3.76.16.2.1\u0026action=display'\n                \u003e{iso(1) identified-organization(3) uninfo(76) agid(16) authentication(2) cns(1)}\n                \u003c/a\u003e\n            \u003c/li\u003e\n            \u003cli\u003eOID 1.3.76.47.4 =\u003e \u003ca href='http://oid-info.com/get/1.3.76.47'\n                \u003e{iso(1) identified-organization(3) uninfo(76) 47}\n                \u003c/a\u003e\n            \u003c/li\u003e\n        \u003c/ul\u003e\");\n}\n?\u003e\n```\n\nPurtroppo la funzione [PeerExtList(object-ID)](https://httpd.apache.org/docs/2.4/mod/mod_ssl.html) \ndel modulo *mod_ssl* non permette il check dell'estensione *CertificatePolicies*\nperché strutturata.\n\nA seguire una serie di screenshot che mostrano l'esecuzione del test di autenticazione, \nutilizzando la TS-CNS. L'esecuzione del test di autenticazione con la CIE è esattamente \nidentico a quello della TS-CNS.\n\n\n![Inserimento PIN TS-CNS](images/TS-CNS_InserimentoPINCODE.png)\n\n**Figura 1 - Inserimento del PIN della TS-CNS**\n\n\n![Selezione del certificato digitale](images/TS-CNS_SelezioneCertificato.png)\n\n**Figura 2 - Selezione del certificato digitale**\n\n\n![WelcomePage](images/TS-CNS_WelcomePage_1.png)\n\n**Figura 3 - Pagina di benvenuto dopo l'autenticazione**\n\n![WelcomePage](images/TS-CNS_WelcomePage_2.png)\n\n**Figura 4 - Visualizzazione del certificato pubblico in formato strutturato**\n\n\n![WelcomePage](images/TS-CNS_WelcomePage_3.png)\n\n**Figura 5 - Visualizzazione del certificato pubblico in formato x509 PEM**\n\n\n![ErrorPage](images/TS-CNS_CertificationPolicyFailed.png)\n\n**Figura 6 - Notifica di errore per check Policy fallito**\n\n![ErrorPage](images/TS-CNS_SSL_VERIFIY_Failed.png)\n\n**Figura 7 - Pagina di errore in caso di errore validazione certificato**\n\n![Richiesta PIN CIE](images/accesso_via_cie_docker_1_2.png)\n\n**Figura 8 - Richiesta PIN della CIE**\n\n![Accesso tramite CIE](images/accesso_via_cie_docker_1_4.png)\n\n**Figura 9 - Pagina di benvenuto dopo autenticazione via CIE**\n\nAccedendo agli access log di Apache è possibile notare queste due informazioni \nutili al tracciamento delle operazioni eseguite dall'utente:\n\n* Il protocollo SSL\n* Il SSL_CLIENT_S_DN_CN\n\n```log\n172.17.0.1 TLSv1.2 - MSRNTN77H15C351X/6120016461039008.i1ZpZfaCX/eKyikBfnF8to+M2T8= [18/Dec/2018:17:48:53 +0000] \"GET / HTTP/1.1\" 200 2787 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OSX 10.14; rv:64.0) Gecko/20100101 Firefox/64.0\"\n```\n\nIl valore di `SSL_CLIENT_S_DN_CN` è inoltre impostato come **SSLUserName**, questo\nfa in modo che la variabile `REMOTE_USER` sia impostata con il CN del certificato digitale \nche identifica univocamente l'utente.\n\n```\n...\nSSLVerifyClient ${APACHE_SSL_VERIFY_CLIENT}\nSSLVerifyDepth  5\n\nSSLUserName SSL_CLIENT_S_DN_CN\n...\n```\n\n## 6 - Build, Run e Push docker image via Makefile\nAl fine di semplificare le operazioni di build, run e push dell'immagine docker, \nè stato introdotto il [Makefile](https://github.com/italia/apache-httpd-ts-cns-docker/blob/develop/Makefile) sulla versione [1.2.3](https://github.com/italia/apache-httpd-ts-cns-docker/tree/v1.2.3) del progetto.\n\nPer utilizzare il Makefile, occorre che sulla propria macchina siano installati\ncorrettamente i tools di build.\n\nI target disponibili sono i seguenti:\n\n1. **build**: Target di _default_ che esegue il build dell'immagine;\n2. **debug**: Esegue la build dell'immagine e successivamente apre un shell bash sul container; \n3. **run**: Esegue la build dell'immagine e successivamente crea il container lanciando l'applicazione (Apache HTTPD 2.4);\n4. **clean**: Esegue un prune delle immagini;\n5. **remove**: Rimuove l'ultima immagine creata;\n6. **release**: Esegue la build dell'imaggine e successivamente effettua il push su dockerhub.\n\nÉ possibile eseguire il target _release_ solo sul branch master, inoltre, il push \ndell'immagine su DockerHub richiede l'accesso (via username e password) tramite \nil comando `docker login`.\n\n## 7 - Conclusioni\nLo stimolo iniziale che ha poi scatenato la nascita di questo progetto, arriva\ndalle difficoltà incontrate cercando di accedere ai servizi del \n[Sistema Informativo Veterinario](https://www.vetinfo.it/) utilizzando la mia TS-CNS su Mac OS.\n\nCredo che questo progetto possa essere utile a coloro che hanno la necessità di\nrealizzare un servizio di autenticazione basato sulla TS-CNS o CIE e non sanno magari\nda dove iniziare. **Questo progetto potrebbe essere quindi un buon punto di partenza.**\n\nOgni suggerimento e/o segnalazione di bug è gradito; consiglio eventualmente di \naprire una [issue](https://github.com/italia/apache-httpd-ts-cns-docker/issues)\n\nHo descritto la mia esperienza con il Sistema Informativo Veterinario sull'articolo\n[Come accedere al portale VETINFO tramite TS-CNS e Mac OS](https://www.dontesta.it/2019/01/04/come-accedere-vetinfo-tramite-ts-cns-e-mac-os/)\npubblicato recentemente su [Antonio Musarra's Blog](https://www.dontesta.it).\n\n## Project License\nThe MIT License (MIT)\n\nCopyright \u0026copy; 2024 Antonio Musarra's Blog - [https://www.dontesta.it](https://www.dontesta.it \"Antonio Musarra's Blog\"), \n[antonio.musarra@gmail.com](mailto:antonio.musarra@gmail.com \"Antonio Musarra Email\")\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fitalia%2Fcie-cns-apache-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fitalia%2Fcie-cns-apache-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fitalia%2Fcie-cns-apache-docker/lists"}