Newsgroup: it.comp.os.linux.iniziare
Titolo: apache&https: ad ogni virtualhost il suo certificato

Salve. Mi sto impiccando sul far leggere il certificato ssl giusto al
browser in relazione al virtualhost chiamato.
Ho qualcosa tipo (ridotto all'osso):
...
Listen 80
ServerName 
www.miodominio.it
...
<IfDefine SSL>
        Listen 443
        NameVirtualHost 
webmail.miodominio.it
        NameVirtualHost *:443
        <VirtualHost *:443>
                ServerName 
www.miodominio.it
                SSLEngine on
                SSLCertificateFile /etc/apache/www-cert.crt
                SSLCertificateKeyFile /etc/apache/www-cert.key
        </VirtualHost>
        <VirtualHost *:443>
                ServerName 
webmail.miodominio.it
                DocumentRoot "/var/www/webmail"
                SSLEngine on
                SSLCertificateFile /etc/apache/webmail-cert.crt
                SSLCertificateKeyFile /etc/apache/webmail-cert.key
        </VirtualHost>
</IfDefine>
I virtual host funzionano bene, nel senso che se sul browser digito
https://webmail.miodominio.it
 viene fuori il webmail e qualsiasi altra
cosa digito, invece, viene 
www.miodominio.it
Quello che non funziona, è che il browser mi mostra come certificato
sempre www-cert, anche quando digito 
webmail.miodominio.it
Cosa ho sbagliato?
Grazie,
Matteo


E se io ho un solo IP? (con il quale riesco a far funzionare già
tranquillamente tanti virtualhost in http)
Mi sembra strano che non si può fare.
Per ora sto provando anche la configurazione
http://www.apache-ssl.org/httpd.conf.example
ma ancora non ho terminato.
Matteo


Ho capito.
Allora devo cercare di inventarmi qualcosa, visto che di ip ne ho solo
uno.
Grazie.
Matteo

 Funziona solo se hai diversi IP, uno per ogni SSL-VHost.
...oppure porte TCP diverse, ma chiaramente dovrai indicare la porta
nell'URL:
https://www.xxx.xx:444
https://www.yyy.yy:445
https://www.zzz.zz:446
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it


No, non posso mettermi a presentarmi con porte diverse all'esterno, non
mi pare il caso.
Semmai (ma non lo farò)
https://www1.pippo.it
 --> modproxy --> 
https://localhost:444
https://www2.pippo.it
 --> modproxy --> 
https://localhost:445
...
...
Piuttosto stavo leggendo in giro che forse può farcela apache-ssl
Matteo


:) E' la mia indole ;-)
Ho trovato questi:
http://groups.google.it/group/it.comp.os.linux.sys/msg/cae6af94843be0bd?dmode=source&hl=it&output=gplain
http://wiki.cacert.org/wiki/VhostTaskForce
e gli sto dando una occhiata
Matteo


L'ho provato ed effettivamente nel error_log compare
[Thu Jan 18 16:04:17 2007] [error] [client 127.0.0.1] Invalid method in
request \\x16\\x03\\x01 / HTTP/1.1
Ora mi viene un dubbio.
Così com'è, se io al browser scrivo 
http://www1.miodomio.it:443
, i
dati arrivano (non protetti, ovviamente), tuttavia 
127.0.0.1:444
 è
configurato SSLEngine on (e l'ho richiamato redirigendo con https://
Mi chiedo, la comunicazione tra reverse proxy e 
127.0.0.1:444
 è
avvenuta in ssl o in chiaro? (con localhost non ha senso, ma se fosse
una macchina interna alla rete ha molto senso).
Se qualsiasi richiesta (anche e soprattutto del nome) avviene solo dopo
lo scambio di certificati, per cui, virtualhost a parte, anche il
reverse proxy (o solo il reverse proxy?) deve andare in https.
Supponendo che 192.168.0.2 è un server dentro la rete locale, dove
risiedono le pagine, mentre il reverse proxy/router/firewall connesso
ad internet è 192.168.0.1(int)/
1.1.1.1
(ext),
scrivo le varie combinazioni:
1)
- rev.proxy
Listen 443
SSLEngine on
SSLCertificateFile ...
SSLCertificateKeyFile ...
ProxyRequests Off
ProxyPass / 
http://192.168.0.2:80/
ProxyPassReverse / 
http://192.168.0.2:80/
- server
Listen 80
ssl non installato
con questa soluzione il browser richiama il sito con 
https://1.1.1.1
 e
i dati passano su internet protetti, ma all'interno della lan viaggiano
in chiaro.
2)
- rev.proxy
Listen 80
ssl non installato
ProxyRequests Off
ProxyPass / 
https://192.168.0.2:443/
ProxyPassReverse / 
https://192.168.0.2:443/
- server
Listen 443
SSLEngine on
SSLCertificateFile ...
SSLCertificateKeyFile ...
con questa soluzione il browser richiama il sito con 
http://1.1.1.1
 e i
dati passano in chiaro su internet mentre su lan passano criptati (?)
(utilità nulla :-)
3)
- rev.proxy
Listen 443
SSLEngine on
SSLCertificateFile ...
SSLCertificateKeyFile ...
ProxyRequests Off
ProxyPass / 
https://192.168.0.2:443/
ProxyPassReverse / 
https://192.168.0.2:443/
- server
Listen 443
SSLEngine on
SSLCertificateFile ...
SSLCertificateKeyFile ...
con questa soluzione il browser richiama il sito con 
https://1.1.1.1
 e
i dati passano criptati sia su internet che su intranet
4)
- rev.proxy
Listen 80
nossl
ProxyRequests Off
ProxyPass / 
http://192.168.0.2:80/
ProxyPassReverse / 
http://192.168.0.2:80/
- server
Listen 80
nossl
con questa soluzione il browser richiama il sito con 
http://1.1.1.1
 e i
dati passano in chiaro sia in internet che su lan
---
E' chiaro che la soluzione 3 è la più utile e sensata... ma quali
certificati metto ai due server? Il browser dovrebbe vedere il
certificato del rev. proxy, ma il certificato del server?
Nella soluzione 2, anche se inutile, i dati in lan passano veramente
criptati?
---
Per quanto riguarda i virtual host  devo vedere se riesco a fare i
certificati multi-CommonName. Essendo uno apache dovrebbe caricarlo
tranquillamente, ma non tutti i browser lo digeriscono, però.
Matteo


La differenza è che una CA la posso inserire io nei browser o mettere
un link con le istruzioni per farlo (i 'clienti' sono tutti conosciuti
e registrati e archiviati), e così scompare la schermata. Nel caso di
un CN non corrispondente invece il certificato compare sempre e con la
dicitura che questo non è valido.
Bisogna entrare nella psicologia dell'utente. Quanti sono quelli che
danno ok solamente dopo essersi letto tutto il papier del certificato e
della certification authority ("che sarà mai la CA?")! soprattutto se
poi c'è la possibilità di dire "accetta questo certificato per
sempre" che toglie qualche scocciatura.
Fooorse una piccola guardata gliela danno quando si tratta del
certificato della propria banca online.
Diverso è quando il certificato viene presentato come "NON VALIDO"
"non associato al dominio" "probabilmente qualcuno ha camuffato il
certificato allo scopo di farsi passare per quello buono....."; si sa
che l'utente legge le prime due/tre righe.
Comunque al di là della psicologia, se non faccio un multiCN, mi
rimane l'ultima possibilità di fare un solo host https
'
secure.miodominio.it
' (e quindi un unico certificato) che uso per far
passare password e dati sensibili, e tutto il resto lo mando in diversi
VHost http (ma anche quì compare il messaggio "si sta uscendo da una
connessione protetta per passare ad una non protetta"). Però la gente
non vedrebbe il lucchettino e la barra degli indirizzi gialla.

Sfruttando lo script presentato quì
http://wiki.cacert.org/wiki/VhostTaskForce
Sono riuscito a fare una CSR multi CommonName.
L'ho data in pasto a 
cacert.org
 che mi ha restituito un buon
certificato.
seguendo le istruzioni presentate quì
http://wiki.cacert.org/wiki/VhostsApache
L'ho messo su apache ed ha funzionato... sia firefox che internet
explorer non si sono arrabbiati per il multicertificato.
Ora devo fare una CA mia che riesca a firmare certificati del genere.
I certificati classici me li consegna tranquillamente e funzionano
senza storie.
Quelli creati con quello script invece no; i browser non riconoscono
che si tratta di multi CN.
Dalle informazioni che vedo nel certificato che ho firmato con la mia
CA ci mancano parecchia roba che invece c'è in quello firmato da
cacert.
Che parametri devo mettere per apportare una corretta firma?
Matteo
se può servire:
Ecco la sintassi che uso per firmare:
# openssl ca -config 
config.ca
 -out cert.crt -infiles cert.csr
il 
config.ca
:
[ ca ]
default_ca              = CA_own
[ CA_own ]
dir                     = db/
certs                   = $dir/
new_certs_dir           = $dir/certs
database                = $dir/index
serial                  = $dir/serial
RANDFILE                = $dir/rand
certificate             = key/ca.crt
private_key             = key/ca.key
default_days            = 1850
default_crl_days        = 30
default_md              = md5
preserve                = no
policy                  = policy_anything
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
(l'ho preso da un tutorial ed ho personalizzato solo i path)
le info sulla mia CA: ca.crt
# openssl x509 -text -in ca.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            ea:90:d5:ec:9b:7e:57:d0
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=IT, ST=Italy, L=Rome, O=Tesys S.p.A.,
OU=Certification Unit, CN=Tesys RootCA/emailAddress=
in...@miodominio.it
        Validity
            Not Before: Jan 17 14:05:53 2007 GMT
            Not After : Jan 14 14:05:53 2017 GMT
        Subject: C=IT, ST=Italy, L=Rome, O=Tesys S.p.A.,
OU=Certification Unit, CN=Tesys RootCA/emailAddress=
in...@miodominio.it
info sulla csr generata con lo script
# openssl req -text -in cert.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: CN=
miodominio.it
        Requested Extensions:
            X509v3 Subject Alternative Name:
                DNS:
pub68.miodominio.it
, DNS:
fw.miodominio.it
il certificato firmato da cacert
# openssl x509 -text -in cert.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 204876 (0x3204c)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: O=Root CA, OU=
http://www.cacert.org
, CN=CA Cert Signing
Authority/emailAddress=
sup...@cacert.org
        Validity
            Not Before: Jan 19 09:28:33 2007 GMT
            Not After : Jul 18 09:28:33 2007 GMT
        Subject: CN=
miodominio.it
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Extended Key Usage:
                TLS Web Client Authentication, TLS Web Server
Authentication, Netscape Server Gated Crypto, Microsoft Server Gated
Crypto
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            Authority Information Access:
                OCSP - URI:
http://ocsp.cacert.org
            X509v3 Subject Alternative Name:
                DNS:
tesys-spa.it
, othername:<unsupported>,
DNS:
pub68.miodominio.it
, othername:<unsupported>, DNS:
miodominio.it
,
othername:<uunsupported>
Il certificato firmato dalla mia CA
# openssl x509 -text -in cert2.crt
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 10 (0xa)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=IT, ST=Italy, L=Rome, O=Tesys S.p.A.,
OU=Certification Unit, CN=Tesys RootCA/emailAddress=
in...@miodominio.it
        Validity
            Not Before: Jan 19 14:36:20 2007 GMT
            Not After : Feb 12 14:36:20 2012 GMT
        Subject: CN=
miodominio.it