<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jndi - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/tag/jndi/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Thu, 02 Feb 2012 10:49:39 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://blog.infine.com/wp-content/uploads/2021/03/cropped-vignette-32x32.png</url>
	<title>jndi - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Tomcat 6 &#8211; JNDI &#8211; password crypté et pool de connexion V7</title>
		<link>https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7</link>
					<comments>https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275#respond</comments>
		
		<dc:creator><![CDATA[Christian Nguyen Van Than]]></dc:creator>
		<pubDate>Thu, 02 Feb 2012 09:00:11 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jndi]]></category>
		<category><![CDATA[pool]]></category>
		<category><![CDATA[tomcat]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1275</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span> Cet article est destiné à ceux qui ont la &#8216;chance&#8217; d&#8217;avoir Tomcat 6 comme serveur pour leurs applications et qui doivent paramétrer le pool de connexions par JNDI. Voici un petit article issu d&#8217;une demande d&#8217;un client. Le client : C&#8217;est bien la configuration par JNDI, ça serait mieux si on ne voyait pas le &#8230;</p>
<p>The post <a href="https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275">Tomcat 6 – JNDI – password crypté et pool de connexion V7</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">3</span> <span class="rt-label rt-postfix">min.</span></span><p>Cet article est destiné à ceux qui ont la &#8216;chance&#8217; d&#8217;avoir Tomcat 6 comme serveur pour leurs applications et qui doivent paramétrer le pool de connexions par JNDI.</p>
<p>Voici un petit article issu d&#8217;une demande d&#8217;un client.</p>
<p><strong><em>Le client</em></strong> : <em>C&#8217;est bien la configuration par JNDI, ça serait mieux si on ne voyait pas le mot de passe en clair <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f641.png" alt="🙁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> &#8230;</em></p>
<p><em><strong>Moi</strong>: No problem, everything is possible (enfin je crois) &#8230;</em></p>
<p>Effectivement c&#8217;est possible. D&#8217;après la documentation, il suffit d&#8217;implémenter une classe de type &#8216;factory&#8217; pour instancier les connexions avec la base de données.</p>
<p>Dans cet article, vous verrez comment crypter facilement un mot de passe ou autre mais aussi comment remplacer le pool de connexion DBCP  par le pool de connexion de Tomcat 7 (plus performant à  mon goût).</p>
<p>Tout ceci se fait en 3 étapes :</p>
<ul>
<li>Codage d&#8217;une classe &#8216;Factory&#8217;</li>
<li>Configuration de la ressource JNDI</li>
<li>Copier les jar dans le répertoire lib de Tomcat</li>
</ul>
<p><span id="more-1275"></span></p>
<p>Le processus de cryptage ne sera pas détaillé ici.<br />
Pour plus d&#8217;information, vous avez une classe &#8220;EncryptHelper&#8221; dans les sources (voir à la fin).</p>
<ul></ul>
<h2>1° La classe Factory</h2>
<p>Ici j&#8217;utilise le pool de connexion de Tomcat 7 :</p>
<pre class="brush: java; title: ; notranslate">
public class Tomcat7EncryptedFactory extends org.apache.tomcat.jdbc.pool.DataSourceFactory implements SecuredFactory{

	@SuppressWarnings(&quot;rawtypes&quot;)
	@Override
	public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {
		Object o = super.getObjectInstance(obj, name, nameCtx, environment);
		if (o != null &amp;&amp; o instanceof org.apache.tomcat.jdbc.pool.DataSource) {
			org.apache.tomcat.jdbc.pool.DataSource ds = (org.apache.tomcat.jdbc.pool.DataSource) o;
			// recuperation du login et mot de passe cryptes
			String cryptedUsername = ds.getUsername();
			String cryptedPassword = ds.getDbProperties().getProperty(&quot;password&quot;);
			// on decrypte le password
			if (cryptedPassword != null &amp;&amp; cryptedPassword.length() &gt; 0) {
				String pwd = EncryptHelper.decryptData(secretKeyPassword, cryptedPassword);
				ds.setPassword(pwd);
			}
			// on decrypte le login
			if (cryptedUsername != null &amp;&amp; cryptedUsername.length() &gt; 0) {
				String username = EncryptHelper.decryptData(secretKeyUser, cryptedUsername);
				ds.setUsername(username);
			}
			// on set la taille initiale avec le minimum idle
			// on doit laisser le initialSize a 0 car il ne faut pas cree de connexion tout de suite car on a les identifiants cryptes.
			int minIdleSize = ds.getMinIdle();
			ds.setInitialSize(minIdleSize);
			ds.setConnectionProperties(ds.getConnectionProperties());

			// on ferme le pool deja parametre
			ds.close();
			// on recree le pool avec les nouveaux parametres
			ds.createPool();
			System.out.println(&quot;Initialisation de la datasource JNDI : OK&quot;);
			return ds;
		} else {
			System.out.println(&quot;Initialisation de la datasource JNDI : KO&quot;);
			return null;
		}
	}
}
</pre>
<p>Juste que la rien de difficile ^_^</p>
<h2 style="font-size: 1.5em">2° Configuration JNDI</h2>
<p>Extrait du fichier de configuration des ressources de Tomcat 6 (conf/context.xml)</p>
<div><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace;line-height: 18px">&lt;Resource name=&#8221;jdbc/mydatabase&#8221;</span></div>
<pre>    auth="Container" type="javax.sql.DataSource"
    factory="fr.cnvt.tomcat.Tomcat7EncryptedFactory"
    username="sD20tsCeFQPP3HuQV17yXw=="
    password="LoPCUiDWD47S6wIOTZWvBX7X9XTLt2vS9Sv52csoEGo="
    driverClassName="my.driver.class"
    url="my.jdbc.url"
    initialSize="0" maxActive="20" minIdle="5" maxIdle="10"
    validationQuery="SELECT 1 FROM Dual" validationQueryTimeout="300"
    maxWait="30000"
    removeAbandoned="true" removeAbandonedTimeout="600" logAbandoned="true"
    timeBetweenEvictionRunsMillis="20000"
    testWhileIdle="true"
    connectionProperties="CHARSET=utf8;" /&gt;</pre>
<p>Comme vous pouvez le voir, le login (username) et le mot de passe (password) sont cryptés.</p>
<p>Vous pouvez avoir le même login et mot de passe (c&#8217;est bizarre comme c&#8217;est fréquent&#8230;) , les 2 chaines cryptés seront différentes (normal j&#8217;utilise 2 clés de cryptage différentes ^_^)</p>
<h2>3° Librairies dans Tomcat</h2>
<p>Dernières étapes, il suffit de copier les fichiers tomcat-datasource-factory-1.0.0.jar et tomcat-jdbc-7.0.22.jar(dans le répertoire lib du zip) dans le répertoire &#8220;lib&#8221; de Tomcat 6.</p>
<p>Voila en 3 copié-collé, vous avez un pool de connexion sans mot de passe en clair ^_^</p>
<p>Pour générer vos propres login et password cryptés, il suffit d&#8217;utiliser la classe EncryptHelper comme ceci:</p>
<pre class="brush: java; title: ; notranslate">
	@Test
	public void generateEncryptedValues(){
		String login = &quot;monsupertest&quot;;
		String password = &quot;monsupertestaussi&quot;;
		String cryptedLogin = EncryptHelper.encryptData(SecuredFactory.secretKeyUser, login);
		String cryptedPassword = EncryptHelper.encryptData(SecuredFactory.secretKeyPassword, password);
		String decryptedLogin = EncryptHelper.decryptData(SecuredFactory.secretKeyUser, cryptedLogin);
		String decryptedPassword = EncryptHelper.decryptData(SecuredFactory.secretKeyPassword, cryptedPassword);
		assertEquals(login, decryptedLogin);
		assertEquals(password, decryptedPassword);
		System.out.println(&quot;Login crypte : &quot; + cryptedLogin);
		System.out.println(&quot;Mot de passe crypte : &quot; + cryptedPassword);
	}
</pre>
<p>Pour les curieux, le fichier zip contient également un pool DBCP et C3P0 qui gèrent aussi le login et mot de passe cryptés. Les clés de cryptages sont dans l&#8217;interface SecuredFactory.</p>
<p>Enjoy <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Les sources sont disponibles <a href="https://github.com/nguyenvanthan/Tomcat-Datasource-Factory" target="_blank">ici</a></p><p>The post <a href="https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275">Tomcat 6 – JNDI – password crypté et pool de connexion V7</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/tomcat-6-jndi-password-crypte-et-pool-de-connexion-v7-1275/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
