<?xml version="1.0" encoding="utf-8"?>
<entry title="Apache et le module GnuTLS">
<date>2008-04-07</date>
<update_date>2008-12-04</update_date>
<content>
<p>Pour faire du <wikipedia name="Transport Layer Security">TLS</wikipedia> sur un serveur
<wikipedia name="Hypertext Transfer Protocol">HTTP</wikipedia> <wikipedia name="Apache HTTP Server">Apache</wikipedia>, la solution
la plus connue est le module <computer><link
url="http://www.modssl.org/">mod_ssl</link></computer>. Mais il en
existe une autre, le <link
url="http://www.outoforder.cc/projects/apache/mod_gnutls/">module
GnuTLS</link>.</p>
<p><wikipedia>GnuTLS</wikipedia> est une mise en &#x153;uvre libre du
protocole <wikipedia name="Transport Layer Security">TLS</wikipedia> (ex-SSL, protocole normalisé dans
le <rfc num="5246" local="true"/>). Étant sous licence <wikipedia name="Licence publique générale GNU">GPL</wikipedia>,
il peut être utilisé par des programmes GPL (alors que
<wikipedia>OpenSSL</wikipedia> a une licence incompatible avec la GPL,
ce qui a entrainé des problèmes pour plusieurs projets). GnuTLS offre
également des possibilités qui sont absentes d'OpenSSL, comme la
possibilité d'utiliser des clés <wikipedia name="Pretty Good Privacy">PGP</wikipedia> (<rfc
num="5081" local="true"/>) en sus des
certificats <wikipedia>X.509</wikipedia>.</p>
<p>Sur une machine <wikipedia>Debian</wikipedia>, où tout est déjà
compilé et empaqueté, l'installation du module
<computer>mod_gnutls</computer> d'Apache est triviale. Un coup de
<wikipedia name="Aptitude (logiciel)">aptitude install</wikipedia>,
puis <computer>ln -s ../mods-available/gnutls.load
/etc/apache2/mods-enabled</computer> (Sébastien Tanguy me fait
remarquer à juste titre qu'il existe une méthode de plus haut niveau,
la commande <computer>a2enmod</computer>) et recharger Apache. Sa
configuration peut être aussi courte que<!-- http://www.outoforder.cc/projects/apache/mod_gnutls/docs/ --> :
<code>
    GnuTLSEnable  on
    GnuTLSCertificateFile /etc/ssl/certs/ssl-cert-Example.pem
    GnuTLSKeyFile /etc/ssl/private/ssl-cert-Example.key
    GnuTLSPriorities NORMAL
</code>
Et hop, ça marche avec des clients HTTP utilisant GnuTLS comme avec
ceux utilisant OpenSSL comme <wikipedia>Konqueror</wikipedia>.</p>
<p>Une des forces de GnuTLS est qu'il permet l'utilisation de
l'extension de TLS SNI (<foreign><link url="http://www.gnu.org/software/gnutls/manual/html_node/Core-functions.html#gnutls_005fserver_005fname_005fget">Server Name Indication</link></foreign>) qui
permet de mettre plusieurs <link local="auth-x509-plusieurs-noms">certificats différents</link> à des
<foreign>Virtual Host</foreign> Apache se partageant une seule adresse
IP. Il suffit de mettre une directive
<computer>GnuTLSCertificateFile</computer> différente par
<foreign>Virtual Host</foreign> :
<code>
<![CDATA[
<VirtualHost _default_:443>
        # Site par défaut. Son certificat sera envoyé aux clients
	# non-SNI 
        ...
        GnuTLSCertificateFile /etc/ssl/certs/ssl-cert-DEFAULT.example.net.pem
...
<VirtualHost *:443>
        ...
        ServerName svn.example.net
        GnuTLSCertificateFile	/etc/ssl/certs/ssl-cert-svn.example.net.pem
...
<VirtualHost *:443>
        ...
        ServerName viewvc.example.net
        GnuTLSCertificateFile	/etc/ssl/certs/ssl-cert-viewvc.example.net.pem
...
]]>
</code>
</p>
</content>
</entry>