Thursday, March 12, 2015

Autenticazione Apache con la carta sanitaria Regione Toscana

E' stata una tribolazione: andare a tentoni richiede del tempo.

Utilizzare questo script https://gist.github.com/3v1n0/e371f58162795e0635f2 che fa quanto scritto nei commenti:
Get Italian government Certification Authority certificates from used by
by various National Service SmartCards (Carta Nazionale dei Servizi- CNS) 

mkdir /var/tmp/certs
./parse-gov-certs.py --output-folder /var/tmp/certs

Qui ci saranno vari certificati di Certification Authority di vari enti italiani usati per firmare i certificati di varie smart card, fra cui quelli utili al nostro scopo.

cd /var/tmp/certs
cat Regione_Toscana_-_CA_Cittadini_Servizi_di_Certificazione_* >> /etc/pki/tls/certs/ca-CNS-bundle.crt

In Apache, aprire il file ssl.conf (per esempio) e nel virtualhost opportuno mettere:

<VirtualHost _default_:443>
...

SSLCACertificateFile /etc/pki/tls/certs/ca-CNS-bundle.crt
...

</VirtualHost>

Non sono riuscito a far funzionare la direttiva SSLCACertificatePath, ovvero indicare una directory dove mettere i certificati scaricati con lo script Python.

E per richiedere la verifica del certificato del client (quindi il browser chiede il PIN della carta e passa il cerificato al server), mettere sempre all'interno della definizione del virtual host, o in qualche direttiva Location o Directory:

SSLVerifyClient require
SSLOptions +ExportCertData +StdEnvVars
SSLVerifyDepth 4


Questa è certamente una configurazione di base.
Il client viene autorizzato semplicemente se il certificato che presenta è stato firmato da una di queste CA. 
E' possibile autorizzare le carte in base a specifici attributi definiti con le direttive SSLRequire, e probabilmente configurare una CRL (Certificate Revocation List).

6 comments:

  1. Ottimo, funziona. Ma se volessi avere sul server il codice fiscale del proprietario della tessera?

    ReplyDelete
    Replies
    1. Credo tu debba conoscere i codici fiscali a priori. Magari in un database.
      Oppure utilizzare un servizio di autenticazione e autorizzazione della Regione, tipo http://www.regione.toscana.it/-/arpa-infrastruttura-per-l-autenticazione-autorizzazione-e-accesso-ai-servizi

      Delete
  2. io ho risolto con:
    Scaricate tutti i certificati che devono avere l'estensione .pem in una cartella tipo: "PATH_TO_DIR/CAcerts"

    eseguire il comando c_rehash PATH_TO_DIR/CAcerts/
    che crea i link simbolici con il nome in hash dei file del certificato

    definire nel file conf:
    SSLCACertificatePath "PATH_TO_DIR/CAcerts"
    SSLCADNRequestPath "PATH_TO_DIR/CAcerts"

    NOTE: motico del c_rehash è dovuto alla definizione di SSLCACertificatePath. Come da guida apache:
    The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you can't just place the Certificate files there: you also have to create symbolic links named hash-value.N. And you should always make sure this directory contains the appropriate symbolic links.


    ReplyDelete
  3. Mi unisco a RedFox: OTTIMO, funziona!

    ReplyDelete
  4. TUTORIAL per:
    - Apache 2.4.6
    - Red Hat Enterprise Linux 7
    - Kernel 3.10.0-514
    - CNS rilasciata dalla Regione Lazio
    - CNS prodotta da Actalis modello AC 2014
    - Card reader marca Ewent modello EW1052

    I driver Windows 7 per la CNS sono disponibili qui:
    ftp://ftp.finanze.it/pub/sanita/IDP_6.26.14_Windows.zip
    Il card reader è supportato nativamente da S.O.

    # wget https://gist.github.com/3v1n0/e371f58162795e0635f2/raw/6c8bf242cc26b36db5e4c861dc36b26917566865/parse-gov-certs.py
    # nano parse-gov-certs.py
    modificare:
    DEFAULT_XML_URI = "https://applicazioni.cnipa.gov.it/TSL/IT_TSL_CNS.xml"
    DEFAULT_XML_URI = "https://applicazioni.cnipa.gov.it/TSL/_IT_TSL_CNS.xml"
    # chmox +x parse-gov-certs.py
    # ./parse-gov-certs.py --output-folder /var/tmp/certs
    # cat /var/tmp/certs/*Lazio* >> /etc/pki/tls/certs/ca-CNS-bundle.crt
    # mkdir /var/www/html/CNS
    # nano /etc/httpd/conf.d/ssl.conf
    Nella "stanza" aggiungere:
    SSLCACertificateFile /etc/pki/tls/certs/ca-CNS-bundle.crt

    SSLVerifyClient require
    SSLOptions +ExportCertData +StdEnvVars
    SSLVerifyDepth 4

    # apachectl restart

    ReplyDelete
  5. Blogspot ha tagliato alcune parti del mio commento scambiandole per un tentativo di cross site scripting... Falso positivo!

    ReplyDelete