Tomcat SSL client certificate

Martin Kuba makub na ics.muni.cz
Čtvrtek Leden 5 15:25:56 CET 2006


Martin Bednář wrote:
> Pouzivate nekdo klientske certifikaty v tomcatu ?
> Snazil jsem se najit neco na internetu, ale nejak jsem neuspel.
> 
> Jsem schopen dostat tomcata do stavu kdy mi funguje pres https s 
> clientAuth="false", postupoval jsem podle howto na jakarta.apache.org .
> Nejak ale nechapu co vsechno musim udelat abych mohl pouzivat klientske 
> certifikaty, clientAuth="true".
> Zkousel jsem pomoci openssl zalozit vlastni CA s touto CA vygenerovat 
> servrovy a klientsky certifikat, do keystoru pro tomcat jsem nahral ca, 
> server a klient certifikat. Do browseru nainstaloval CA a klientsky 
> certifikat, ale jeste zjevne neco delam blbe.
> Respektive nechapu na zaklade ceho tomcat povoluje pristup k danemu 
> serveru, to ze je server i klientsky certifikat podepsany stejnou 
> autoritou je trochu malo ne ?
> Predpokladam ze potrebuju ten klientsky certifikat podepsat tim 
> servrovym - jak ?

Podepsat klientsky certifikat tim serverom nemusite a nemuzete,
drzitel serverove certifikatu neni certifikacni autorita, nemuze
nikoho podepisovat, a v serverovem certifikatu je priznak, ktery
to znemoznuje.

Pokud mohu doporucit, pro autentizaci klientskym certifikatem je lepsi
dat pred TomCat jeste Apache s mod_ssl a mod_jk, protoze v Apachovi
muzete veci kolem SSL nastavovat velice jemne a pekne.
Pokud si pamatuji, tak v TomCatu samotnem musite
pro serverovy certifikat pouzit alias "tomcat"
a heslo "changeit", coz je dost des a hruza.
A ze zbezneho pohedu do dokumentace mam pocit,
ze vyber akceptovatelnych klientskych certifikatu
pak musite delat az aplikacni urovni.

Treba ja to mam v Apachovi nastavene takto:

<IfDefine SSL>
LoadModule ssl_module         libexec/libssl.so
</IfDefine>

...
<IfModule mod_ssl.c>
    SSLPassPhraseDialog  builtin
    SSLSessionCache        shm:/var/tmp/ssl_scache-1.3.33(512000)
    SSLSessionCacheTimeout  300
    SSLMutex  sem
    SSLRandomSeed connect builtin
    SSLRandomSeed startup file:/dev/urandom 512
    SSLCACertificatePath /etc/grid-security/certificates
</IfModule>
...
<VirtualHost _default_:443>
...
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXP56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    SSLCertificateFile /etc/httpd/ssl/metacert.pem
    SSLCertificateKeyFile /etc/httpd/ssl/metakey.pem
    SSLCertificateChainFile /etc/httpd/ssl/cesnetnewca.pem
    JkMount /osobni/* t5
    <Location "/osobni/chranene_klientskym_certifikatem/*">
         SSLRequireSSL
         SSLVerifyClient require
         SSLOptions +ExportCertData +StdEnvVars
    </Location>
    JkEnvVar SSL_CLIENT_S_DN "-"
</VirtualHost>

Tohle nastaveni zpusobuje, ze server predklada svuj certifikat
spolecne s retezem certifikatu CA, ktere ho overily,
specifikovanym direktivou SSLCertificateChainFile.

Naproti tomu direktiva SSLCACertificatePath specifikuje adresar
s certifikaty certifikacnich autorit, ktere jsou povolene
pro podepsani *klientskych* certifikatu. Vsimnete si,
ze server muze byt podepsan autoritou, kterou neakceptuje
pro klientske certifikaty.

Vsechny pozadavky zacinajici /osobni jsou pres mod_jk poslany
na TomCat dohromady s klientskym certifikatem, a ten se
da na v servletu ziskat jako atribut requestu
jmenem "javax.servlet.request.X509Certificate"
a muzu si s nim na aplikacni urovni delat, co chci.

Abych to mel jednodussi, pomoci JkEnvVar SSL_CLIENT_S_DN
si posilam i Distinguished Name z certifikatu, tak jak ho vidi Apache,
ziskam ho opet jako atribut requestu jmenem "SSL_CLIENT_S_DN".
Totez sice muzu teoreticky vytahnout primo z certifikatu,
ale kdyz to zkusite, tak zjistite, ze DN neni retezec, ale struktura,
kterou lze do retezce prevest vice zpusoby.

A kdybyste chtel delat omezeni certifikatu primo na strane Apache, tak 
existuje direktiva SSLRequire, kterou muzete zadat libovolne slozite
pravdivostni vyrazy pro specifikaci akceptovatelnych certifikatu, napr.:

  SSLRequire %{SSL_CLIENT_S_DN} in \
       { "/O=CESNET/O=Masaryk University/CN=Martin Kuba", \
         "/DC=cz/DC=cesnet-ca/O=Masaryk University/CN=Martin Kuba" \
       }

vyjmenovava vsechny povolene, ale muzete treba rict
    %{SSL_CLIENT_S_O} == "CESNET"

a pusti to jenom certifikaty, ktere zacinaji /O=CESNET.
Vice viz dokumentace s mod_ssl.

Makub
-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Supercomputing Center Brno             Martin Kuba
Institute of Computer Science    email: makub na ics.muni.cz
Masaryk University             http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ     mobil: +420-603-533775
--------------------------------------------------------------
------------- další část ---------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 2819 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://amaio.cz/pipermail/konference/attachments/20060105/c7320cb5/attachment.bin>


Další informace o konferenci Konference