@ -0,0 +1,10 @@ |
|||||
|
@ECHO OFF |
||||
|
|
||||
|
sc stop rhcsproxy |
||||
|
|
||||
|
sleep 1 |
||||
|
|
||||
|
copy rhcsproxy.exe c:\AEP |
||||
|
copy messages.dll c:\AEP |
||||
|
|
||||
|
sc start rhcsproxy |
||||
@ -0,0 +1,17 @@ |
|||||
|
@ECHO OFF |
||||
|
|
||||
|
rem Some information about the service |
||||
|
regedit /S register.reg |
||||
|
|
||||
|
rem Stop and unregister existing service |
||||
|
sc stop rhcsproxy |
||||
|
sc delete rhcsproxy |
||||
|
|
||||
|
rem Register the service |
||||
|
sc create rhcsproxy start= demand type= own error= normal binPath= "C:\AEP\rhcsproxy.exe -s" DisplayName= "Red Hat Auto Enrollment Proxy" |
||||
|
|
||||
|
rem Event log configuration |
||||
|
regedit /S service.reg |
||||
|
|
||||
|
rem AEP Configuration |
||||
|
regedit /S config_aep.reg |
||||
@ -0,0 +1,11 @@ |
|||||
|
Windows Registry Editor Version 5.00 |
||||
|
|
||||
|
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rhcsproxy] |
||||
|
"Description"="Forwards Certificate Requests from the domain to a Red Hat Certicate Authority" |
||||
|
|
||||
|
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application] |
||||
|
@="RHCSProxy" |
||||
|
|
||||
|
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\RHCSProxy] |
||||
|
"EventMessageFile"="C:\\AEP\\messages.dll" |
||||
|
"TypesSupported"=dword:0000000f |
||||
@ -0,0 +1,20 @@ |
|||||
|
[Version] |
||||
|
Signature="$Windows NT$" |
||||
|
[NewRequest] |
||||
|
Subject = "CN=systemx.test-aep3.idealx.com" |
||||
|
KeySpec = 1 |
||||
|
KeyLength = 1024 |
||||
|
Exportable = TRUE |
||||
|
MachineKeySet = TRUE |
||||
|
SMIME = False |
||||
|
PrivateKeyArchive = FALSE |
||||
|
UserProtected = FALSE |
||||
|
UseExistingKeySet = FALSE |
||||
|
ProviderName = "Microsoft RSA SChannel Cryptographic Provider" |
||||
|
ProviderType = 12 |
||||
|
RequestType = PKCS10 |
||||
|
KeyUsage = 0xa0 |
||||
|
[EnhancedKeyUsageExtension] |
||||
|
OID=1.3.6.1.5.5.7.3.1 |
||||
|
[RequestAttributes] |
||||
|
CertificateTemplate = DomainController |
||||
@ -0,0 +1,76 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project name="Connecteur CMC" company="IdealX" webLink="http://www.ird.idealx.com" view-date="2007-03-12" view-index="0" gantt-divider-location="423" resource-divider-location="-1" version="2.0"> |
||||
|
<description/> |
||||
|
<view zooming-state="default:4"/> |
||||
|
<!-- --> |
||||
|
<calendars> |
||||
|
<day-types> |
||||
|
<day-type id="0"/> |
||||
|
<day-type id="1"/> |
||||
|
<calendar id="1" name="default"> |
||||
|
<default-week sun="1" mon="0" tue="0" wed="0" thu="0" fri="0" sat="1"/> |
||||
|
<overriden-day-types/> |
||||
|
<days/> |
||||
|
</calendar> |
||||
|
</day-types> |
||||
|
</calendars> |
||||
|
<tasks color="#8cb6ce"> |
||||
|
<taskproperties> |
||||
|
<taskproperty id="tpd0" name="type" type="default" valuetype="icon"/> |
||||
|
<taskproperty id="tpd1" name="priority" type="default" valuetype="icon"/> |
||||
|
<taskproperty id="tpd2" name="info" type="default" valuetype="icon"/> |
||||
|
<taskproperty id="tpd3" name="name" type="default" valuetype="text"/> |
||||
|
<taskproperty id="tpd4" name="begindate" type="default" valuetype="date"/> |
||||
|
<taskproperty id="tpd5" name="enddate" type="default" valuetype="date"/> |
||||
|
<taskproperty id="tpd6" name="duration" type="default" valuetype="int"/> |
||||
|
<taskproperty id="tpd7" name="completion" type="default" valuetype="int"/> |
||||
|
<taskproperty id="tpd8" name="coordinator" type="default" valuetype="text"/> |
||||
|
<taskproperty id="tpd9" name="predecessorsr" type="default" valuetype="text"/> |
||||
|
</taskproperties> |
||||
|
<task id="0" name="Étude" meeting="false" start="2007-03-15" duration="7" complete="100" priority="1" expand="true"> |
||||
|
<depend id="1" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="1" name="Preuve du concept" meeting="false" start="2007-03-26" duration="7" complete="100" priority="1" expand="true"> |
||||
|
<depend id="3" type="2" difference="0" hardness="Strong"/> |
||||
|
<depend id="8" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="3" name="Adaptation d'AEP pour la démo" meeting="false" start="2007-04-04" duration="17" complete="100" priority="1" expand="true"> |
||||
|
<depend id="2" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="2" name="Démo" meeting="true" start="2007-04-27" duration="1" complete="0" priority="1" expand="true"> |
||||
|
<depend id="4" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="4" name="Documentation" meeting="false" start="2007-04-30" duration="26" complete="0" priority="1" expand="true"> |
||||
|
<depend id="11" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="8" name="Etude et tests d'un connecteur SOAP coté PKI" color="#8cb6ce" meeting="false" start="2007-04-04" duration="20" complete="86" priority="1" expand="true"> |
||||
|
<depend id="10" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="10" name="Code SOAP coté client" color="#8cb6ce" meeting="false" start="2007-05-02" duration="10" complete="0" priority="1" expand="true"> |
||||
|
<depend id="5" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="9" name="Développement de l'autofill coté PKI" color="#8cb6ce" meeting="false" start="2007-04-25" duration="20" complete="11" priority="1" expand="true"> |
||||
|
<depend id="5" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="5" name="Tests" meeting="false" start="2007-05-23" duration="5" complete="0" priority="1" expand="true"> |
||||
|
<depend id="12" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="12" name="Mise en place de la Démo V1" color="#8cb6ce" meeting="false" start="2007-05-30" duration="4" complete="0" priority="1" expand="true"> |
||||
|
<depend id="11" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="11" name="Release V1" color="#8cb6ce" meeting="true" start="2007-06-05" duration="1" complete="0" priority="1" expand="true"> |
||||
|
<depend id="6" type="2" difference="0" hardness="Strong"/> |
||||
|
</task> |
||||
|
<task id="6" name="Préparation de la V2" meeting="false" start="2007-06-06" duration="2" complete="0" priority="1" expand="true"/> |
||||
|
</tasks> |
||||
|
<resources/> |
||||
|
<allocations/> |
||||
|
<vacations/> |
||||
|
<taskdisplaycolumns> |
||||
|
<displaycolumn property-id="tpd3" order="0" width="261"/> |
||||
|
<displaycolumn property-id="tpd4" order="1" width="21"/> |
||||
|
<displaycolumn property-id="tpd5" order="2" width="21"/> |
||||
|
</taskdisplaycolumns> |
||||
|
<previous/> |
||||
|
<roles roleset-name="Default"/> |
||||
|
</project> |
||||
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 19 KiB |
@ -0,0 +1,22 @@ |
|||||
|
SUBDIRS := $(wildcard doc-*) |
||||
|
|
||||
|
help: |
||||
|
@echo "Usages: make <target>" |
||||
|
@echo " all : build all documentations" |
||||
|
@echo " new-doc : create a new documentation from a template" |
||||
|
@echo " clean : clean all documentations" |
||||
|
|
||||
|
all: $(SUBDIRS) |
||||
|
|
||||
|
$(SUBDIRS): |
||||
|
make -C $@ all |
||||
|
|
||||
|
clean: |
||||
|
@for i in $(SUBDIRS); do make -C "$$i" clean || exit 1; done |
||||
|
|
||||
|
new-doc: template |
||||
|
@echo "Enter the name of your documentation (no space, special chars, etc.): " |
||||
|
@echo -n "name> " ; read name ; echo "Creating doc-$$name..." ; cp -r template "doc-$$name" |
||||
|
|
||||
|
.PHONY: $(SUBDIRS) new-doc all help clean |
||||
|
|
||||
@ -0,0 +1 @@ |
|||||
|
../globals/Makefile |
||||
@ -0,0 +1 @@ |
|||||
|
../globals/docbook |
||||
@ -0,0 +1 @@ |
|||||
|
../globals/fop.xconf |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/AEP-Fonct.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/AEP-IDXPKI.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/LRA_routage_aggregation.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/IDX-Enroll.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/PKI_MS-Fonct.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/autoenroll.png |
||||
|
After Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
@ -0,0 +1 @@ |
|||||
|
../../../Gestion de Projet/stage.png |
||||
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 199 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 220 KiB |
@ -0,0 +1,166 @@ |
|||||
|
<appendix id="app_cmc"> |
||||
|
<title>Description du protocole CMC</title> |
||||
|
|
||||
|
<para>CMC signifie "Certificate Management over CMS" et CMS signifie "Cryptographic Message Syntax". C'est un protocole normalisé par l'IETF sous le numéro 2797 qui permet l'enregistrement de certificats (enrollment), tout comme SCEP. Alors que SCEP est principalement utilisé par CISCO, CMC est surtout utilisé par Microsoft.</para> |
||||
|
<para>Il est basé sur les standards PKCS#7, PKCS#10 et CRMF. Une attention particulière a été apportée lors de la conception de ce protocole afin de permettre aux clients de continuer à utiliser des objets PKCS#7 et PKCS#10 lorsque c'est possible.</para> |
||||
|
<para>Le protocole CMC utilise, lorsque c'est possible, un simple aller-retour pour effectuer un enregistrement. Cette particularité implique certaines propriétés telles que l'aggrégation et le routage au niveau des autorités d'enregistrement locales.</para> |
||||
|
<para>Les autorités d'enregistrement locales (LRA, Local Registration Authority) définies dans la norme sont des entités situées entre l'AC et le client. Elles peuvent aggréger les demandes des clients, les aiguiller vers différentes AC, archiver les clés privées ou encore ajouter des extensions aux demandes.</para> |
||||
|
|
||||
|
<figure id="CMC_routage_aggregation.png"> |
||||
|
<title>Deux modes de fonctionnement</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="CMC_routage_aggregation.png" |
||||
|
format="PNG" width="75%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
<para> |
||||
|
Enfin, le protocole propose des services optionnels tels que : l'émission différée, la révocation de certificats ainsi que la récupération de certificats et de listes de révocations. |
||||
|
</para> |
||||
|
|
||||
|
<sect1 renderas="sect2"> |
||||
|
<title>Structure générale du protocole</title> |
||||
|
<para>Dans le cas le plus simple, le client envoie sa CSR (au format PKCS#10) et le serveur retourne le certificat au format PKCS#7. C'est le format simple, il n'y a alors pas de gestion des erreurs, ni de service supplémentaire.</para> |
||||
|
<para>Dans les autres cas, le protocole utilise des messages au format complet avec un module ASN.1 comme "glue" entre les formats PKCS#7, 10 et CRMF. Ces messages peuvent contenir plusieurs demandes de certificats, parfois enveloppées dans des messages CMC (en cas de passage par une LRA).</para> |
||||
|
<para>Il est important de noter que la RFC <emphasis role="strong">n'impose pas de protocole de transport</emphasis> et certains produits pourraient, par exemple, utiliser un protocole propriétaire pour transmettre les messages CMC.</para> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1 renderas="sect2"> |
||||
|
<title>Attributs de contrôle</title> |
||||
|
<para>Un attribut de contrôle est une valeur qui altère la façon dont l'AC (ou une LRA) va traiter la demande de certificat. Inclu dans une réponse de l'AC, il précise l'état de traitement de la requète (OK, erreur, en cours).</para> |
||||
|
<para>Sauf exception, un attribut de contrôle s'applique au message entier, et donc à plusieurs demandes.</para> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1 renderas="sect2"> |
||||
|
<title>Preuve de possession</title> |
||||
|
<para>Les spécifications prévoient l'utilisation de preuves de possession (POP) afin de s'assurer que le client dispose bien de la clé privée. La méthode la plus simple consiste à signer la requète avec la clé privée et pour les clés de chiffrement uniquement, un mécanisme alternatif de type défi-réponse est prévu. Ce mécanisme nécessitant plusieurs échanges, la preuve de possession peut être effectuée par une autorité d'enregistrement locale. </para> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1 renderas="sect2"> |
||||
|
<title>Preuve d'identité</title> |
||||
|
|
||||
|
<para>Au travers du protocole, les clients demandeurs d'un certificat peuvent prouver leur identité au moyen d'un secret partagé avec l'AC. Ce secret partagé peut être généré par un jeton matériel. </para> |
||||
|
<para>La preuve d'identité étant transmise séparément de la preuve de possession, il est nécessaire de lier ces deux informations. La RFC propose deux méthodes : l'une est basée sur un témoin cryptographique (HMAC d'un nombre aléatoire) et l'autre requiert une correspondance entre le secret partagé et le DN de la requète. </para> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1 renderas="sect2"> |
||||
|
<title>Comparaison avec SCEP</title> |
||||
|
|
||||
|
<informaltable> |
||||
|
<tgroup cols='3'> |
||||
|
<colspec colwidth='2*'/> |
||||
|
<colspec colwidth='*'/> |
||||
|
<colspec colwidth='*'/> |
||||
|
<tbody> |
||||
|
<row><entry></entry><entry>SCEP</entry><entry>CMC</entry></row> |
||||
|
<row><entry>Algorithmes supportés</entry><entry>RSA</entry><entry>DSA et DH, RSA en option</entry></row> |
||||
|
<row><entry>Enregistrement de certificat</entry><entry>oui</entry><entry>oui</entry></row> |
||||
|
<row><entry>Emission différée</entry><entry>oui</entry><entry>oui</entry></row> |
||||
|
<row><entry>Récupération d'un certificat</entry><entry>oui</entry><entry></entry></row> |
||||
|
<row><entry>Récupération du certificat racine</entry><entry>oui</entry><entry>facultatif</entry></row> |
||||
|
<row><entry>Récupération de CRL</entry><entry>oui</entry><entry>facultatif</entry></row> |
||||
|
<row><entry>Gestion des LRA</entry><entry></entry><entry>oui</entry></row> |
||||
|
<row><entry>Révocation de certificat</entry><entry></entry><entry>oui</entry></row> |
||||
|
<row><entry>Protocole de transport</entry><entry>HTTP</entry><entry>au choix</entry></row> |
||||
|
<row><entry>Confidentialité</entry><entry>oui</entry><entry>à la carte</entry></row> |
||||
|
<row><entry>Preuve de possession</entry><entry>limitée<footnote><para>Se limite à une signature de la requète, pas de gestion des clés de chiffrement seulement.</para></footnote></entry><entry>complète</entry></row> |
||||
|
<row><entry>Gestion de l'autorité de séquestre</entry><entry></entry><entry>oui</entry></row> |
||||
|
</tbody> |
||||
|
</tgroup> |
||||
|
</informaltable> |
||||
|
|
||||
|
</sect1> |
||||
|
</appendix> |
||||
|
|
||||
|
<appendix id="app_uml"> |
||||
|
<title>Diagramme statique d'AEP</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="statique.png" |
||||
|
format="PNG" width="100%"/></imageobject></mediaobject> |
||||
|
|
||||
|
</appendix> |
||||
|
|
||||
|
<appendix id="app_iface"> |
||||
|
<title>Interface ICertRequestD</title> |
||||
|
|
||||
|
<programlisting>[ |
||||
|
object, |
||||
|
uuid(d99e6e70-fc88-11d0-b498-00a0c90312f3), |
||||
|
dual, |
||||
|
helpstring("Red Hat ICertRequestD Interface"), |
||||
|
pointer_default(unique) |
||||
|
] |
||||
|
interface ICertRequestD: IUnknown |
||||
|
{ |
||||
|
import "oaidl.idl"; |
||||
|
|
||||
|
|
||||
|
HRESULT Request( |
||||
|
[in] DWORD dwFlags, |
||||
|
[unique][string][in] const wchar_t * pwszAuthority, |
||||
|
[ref][out][in] DWORD * pdwRequestId, |
||||
|
[out] DWORD * pdwDisposition, |
||||
|
[unique][string][in] const wchar_t * pwszAttributes, |
||||
|
[ref][in] const CERTTRANSBLOB *pctbRequest, |
||||
|
[ref][out] CERTTRANSBLOB * pctbCertChain, |
||||
|
[ref][out] CERTTRANSBLOB * pctbEncodedCert, |
||||
|
[ref][out] CERTTRANSBLOB * pctbDispositionMessage); |
||||
|
|
||||
|
HRESULT GetCACert( |
||||
|
[in] DWORD fchain, |
||||
|
[unique][string][in] const wchar_t * pwszAuthority, |
||||
|
[ref][out] CERTTRANSBLOB * pctbOut ); |
||||
|
|
||||
|
HRESULT Ping( |
||||
|
[unique][string][in] const wchar_t * pwszAuthority); |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
[ |
||||
|
object, |
||||
|
uuid(5422fd3a-d4b8-4cef-a12e-e87d4ca22e90), |
||||
|
dual, |
||||
|
helpstring("Red Hat ICertRequestD2 Interface"), |
||||
|
pointer_default(unique) |
||||
|
] |
||||
|
interface ICertRequestD2: ICertRequestD |
||||
|
{ |
||||
|
import "oaidl.idl"; |
||||
|
|
||||
|
HRESULT Request2( |
||||
|
[unique][string][in] const wchar_t * pwszAuthority, |
||||
|
[in] DWORD dwFlags, |
||||
|
[unique][string][in] const wchar_t * pwszSerialNumber, |
||||
|
[ref][out][in] DWORD * pdwRequestId, |
||||
|
[out] DWORD * pdwDisposition, |
||||
|
[unique][string][in] const wchar_t * pwszAttributes, |
||||
|
[ref][in] const CERTTRANSBLOB *pctbRequest, |
||||
|
[ref][out] CERTTRANSBLOB * pctbFullResponse, |
||||
|
[ref][out] CERTTRANSBLOB * pctbEncodedCert, |
||||
|
[ref][out] CERTTRANSBLOB * pctbDispositionMessage |
||||
|
); |
||||
|
|
||||
|
|
||||
|
HRESULT GetCAProperty( |
||||
|
[unique][string][in] const wchar_t *pwszAuthority, |
||||
|
[in] LONG PropId, |
||||
|
[in] LONG PropIndex, |
||||
|
[in] LONG PropType, |
||||
|
[ref][out] CERTTRANSBLOB *pctbPropertyValue |
||||
|
); |
||||
|
|
||||
|
|
||||
|
HRESULT GetCAPropertyInfo( |
||||
|
[unique][string][in] const wchar_t *pwszAuthority, |
||||
|
[out] LONG *pcProperty, |
||||
|
[ref][out] CERTTRANSBLOB *pctbPropInfo |
||||
|
); |
||||
|
|
||||
|
|
||||
|
HRESULT Ping2( |
||||
|
[unique][string][in] const wchar_t * pwszAuthority); |
||||
|
|
||||
|
|
||||
|
}; |
||||
|
</programlisting> |
||||
|
</appendix> |
||||
|
|
||||
@ -0,0 +1,47 @@ |
|||||
|
<bibliography> |
||||
|
<title>Bibliographie</title> |
||||
|
<bibliomixed id="Grimes97"> |
||||
|
<surname>GRIMES</surname>, <firstname>Richard</firstname>, |
||||
|
<title><emphasis>Professionnal DCOM Programming</emphasis></title>. |
||||
|
<publishername>WROX Press</publishername>, <date>1997</date>. |
||||
|
565 pages. |
||||
|
<isbn>1-861000-60-X</isbn> |
||||
|
</bibliomixed> |
||||
|
|
||||
|
<bibliomixed id="RFC2797"> |
||||
|
<surname>MYERS</surname>, et al. |
||||
|
<title><emphasis>RFC 2797 : Certificate Management Messages over CMS</emphasis></title>. |
||||
|
<publishername>IETF</publishername>, <date>2000</date>. |
||||
|
47 pages. |
||||
|
</bibliomixed> |
||||
|
|
||||
|
<bibliomixed id="Lowe-Norris00"> |
||||
|
<surname>LOWE-NORRIS</surname>, <firstname>Alistair G.</firstname>, |
||||
|
<title><emphasis>Windows 2000 Active Directory</emphasis></title>. |
||||
|
<publishername>O'Reilly</publishername>, <date>2000</date>. |
||||
|
621 pages. |
||||
|
<isbn>1-56592-638-2</isbn> |
||||
|
</bibliomixed> |
||||
|
|
||||
|
<bibliomixed id="Brown04"> |
||||
|
<surname>KEITH</surname>, <firstname>Brown</firstname>, |
||||
|
<title><emphasis>The .NET Developer's Guide to Windows Security</emphasis></title>. |
||||
|
<publishername>Addison Wesley</publishername>, <date>2004</date>. |
||||
|
379 pages. |
||||
|
<isbn>0-321-22835-9</isbn> |
||||
|
</bibliomixed> |
||||
|
|
||||
|
<bibliomixed id="Gutmann03"> |
||||
|
<surname>GUTMANN</surname>, <firstname>Peter</firstname>, |
||||
|
<title><emphasis>Plug-and-Play PKI: A PKI your Mother can Use</emphasis></title>. |
||||
|
<date>2003</date>. |
||||
|
</bibliomixed> |
||||
|
|
||||
|
<bibliomixed id="MsKb-Q281245"> |
||||
|
<title><emphasis>Guidelines for enabling smart card logon with third-party certification authorities</emphasis></title>. |
||||
|
Microsoft. [en ligne]. |
||||
|
<date>2007</date> [page consultée le 15/06/2007]. |
||||
|
Disponible sur <bibliomisc><uri>http://support.microsoft.com/kb/281245</uri></bibliomisc> |
||||
|
</bibliomixed> |
||||
|
|
||||
|
</bibliography> |
||||
@ -0,0 +1,20 @@ |
|||||
|
<chapter> |
||||
|
<title>Bilan</title> |
||||
|
|
||||
|
<para> |
||||
|
Ce stage chez IDEALX m'a permis d'acquérir de nombreuses connaissances : technologies de sécurité Microsoft, |
||||
|
programmation DCOM, plateforme .NET et surtout l'aspect organisationnel des infrastructures de gestion de clé. |
||||
|
Au delà de ces connaissances, j'ai aussi développé certaines de mes compétences : principalement l'organisation |
||||
|
et la communication. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Durant les huit semaines de ce projet, j'ai procédé à une étude du sujet, défini le cadre technique du projet, mis en place un environnement de test et documenté le projet. Ces actions ont abouti à un prototype fonctionnel et à l'acceptation d'une proposition commerciale par un important client d'IDEALX. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Sur proposition conjointe de Mathias BROSSARD, mon maître de stage et Ayoub OTMANI, mon tuteur ENSICAEN, il m'a été proposé de participer à un autre projet qui permettra de répondre aux exigences du cursus Master Recherche AMI : <emphasis>équilibrage de charge et haute disponibilité d'un serveur d'horodatage</emphasis>. Le projet CMC étant maintenant sur les rails, j'ai saisi cette opportunité. Après transfert de compétences et finalisation des dernières tâches en cours, je prendrai donc part à ce nouveau projet. |
||||
|
</para> |
||||
|
|
||||
|
</chapter> |
||||
|
|
||||
@ -0,0 +1,148 @@ |
|||||
|
<chapter id="ch_existant"> |
||||
|
<title>Étude de l'existant</title> |
||||
|
|
||||
|
<para> |
||||
|
Cette partie présente deux solutions existantes<footnote><para>Il existe également une troisième solution : SCEP. Voir <uri>http://www.ietf.org/internet-drafts/draft-nourse-scep-15.txt</uri>.</para></footnote> permettant l'auto-enrôlement : IDX-Enroll, un logiciel développé par IDEALX, et CMC, un protocole géré nativement par les clients Microsoft. |
||||
|
</para> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>IDX-Enroll</title> |
||||
|
|
||||
|
<para> |
||||
|
Afin de combler le besoin d'enrôlement automatique de ses clients, IDEALX a fait développer le logiciel IDX-Enroll dont le fonctionnement est le suivant : |
||||
|
<itemizedlist> |
||||
|
<listitem> |
||||
|
<para> |
||||
|
la solution se présente sous la forme d'un package MSI que l'on déploie sur les contrôleurs du domaine par une politique de groupe (aussi appelée GPO). |
||||
|
</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para> |
||||
|
le package MSI contient une clé privé et un certificat d'authentification qu'IDX-Enroll utilise pour s'authentifier auprès du connecteur SOAP de la PKI. |
||||
|
</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para> |
||||
|
Toutes les opérations cryptographiques sont effectuées via le connecteur SOAP <emphasis role="strong">sans validation (ni d'un opérateur, ni d'un annuaire d'entreprise)</emphasis>. |
||||
|
</para> |
||||
|
</listitem> |
||||
|
</itemizedlist> |
||||
|
</para> |
||||
|
|
||||
|
<figure id="IDX-Enroll.png"> |
||||
|
|
||||
|
<title>Fonctionnement de l'auto-enrôlement avec IDX-Enroll</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="IDX-Enroll.png" |
||||
|
format="PNG" width="90%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
<para> |
||||
|
Cette solution présente de multiples inconvénients: |
||||
|
|
||||
|
<itemizedlist> |
||||
|
<listitem> |
||||
|
<para> |
||||
|
Elle est intrusive : un logiciel doit être déployé sur tous les contrôleurs de domaine, ce qui implique de tester le logiciel sur les différentes configurations du client. |
||||
|
</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para> |
||||
|
Les informations d'authentification (clé privée et certificat) sont déployées avec le logiciel et par conséquent, sont les mêmes pour tous les contrôleurs de domaine. |
||||
|
</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para> |
||||
|
La validation des informations du certificat est effectuée par IDX-Enroll lui-même. |
||||
|
</para> |
||||
|
</listitem> |
||||
|
</itemizedlist> |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Au vu de ces inconvénients, le développement d'une autre solution s'avère nécessaire. |
||||
|
</para> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>Le protocole CMC</title> |
||||
|
|
||||
|
<para> |
||||
|
CMC est le protocole cryptographique utilisé par les clients Microsoft pour obtenir un certificat lors d'un enrôlement (manuel ou automatique). |
||||
|
Ce protocole standardisé par l'IETF sous le numéro 2797 précise la syntaxe des messages cryptographiques utilisés lors d'un enrôlement. |
||||
|
Une description détaillée du protocole est disponible en <xref linkend="app_cmc"/>. |
||||
|
</para> |
||||
|
|
||||
|
<figure id="PKI_MS-Fonct.png"> |
||||
|
<title>Fonctionnement de l'auto-enrôlement via CMC</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="PKI_MS-Fonct.png" |
||||
|
format="PNG" width="100%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
<para> |
||||
|
À partir de Windows 2003 Server et Windows XP, Microsoft fournit en standard un client d'enrôlement CMC prévu pour s'interfacer avec sa PKI (et uniquement celle-ci). Ce client tire pleinement partie de l'infrastructure de sécurité Microsoft. En effet, il s'interface avec Active Directory pour obtenir sa configuration et utilise les mécanismes d'authentification standards Windows (Kerberos). De cette manière, le processus d'enrôlement est <emphasis role="strong">entièrement automatique et authentifié</emphasis>. De plus, les informations du certificat sont générées par l'AC à partir d'un référentiel de confiance : l'Active Directory. |
||||
|
</para> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>AEP</title> |
||||
|
|
||||
|
<para> |
||||
|
AutoEnrollment Proxy (AEP) est un logiciel Open Source initialement réalisé par Red Hat, et maintenu à présent par le projet Fedora Directory Server. |
||||
|
Après enregistrement dans l'Active Directory, il est vu par les client Windows comme une PKI Microsoft, et ainsi permet d'utiliser le client d'enrôlement |
||||
|
natif sans la PKI Microsoft. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
N'utilisant pas l'autorité de certification Microsoft, AEP n'est pas pour autant une AC ! Il a été conçu pour transmettre les demandes de certificat à une PKI tierce : Red Hat Certificate System, qui est la développée par Red Hat (originellement conçue par Netscape). |
||||
|
</para> |
||||
|
</sect2> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>Comparaison des coûts</title> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Coûts liés à IDX-Enroll</title> |
||||
|
|
||||
|
<para> |
||||
|
De par sa nature, IDX-Enroll implique certains coût pour le client : |
||||
|
<itemizedlist> |
||||
|
<listitem> |
||||
|
<para>le coût de validation du logiciel : il est dû au fait que le client doit tester le logiciel sur ses plateformes de test avant de le déployer en production. Ce coût est estimé à 40-50 jours-homme.</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>le coût de la revue de supportabilité.</para> |
||||
|
<para>La revue de supportabilité s'applique à un projet informatique, qu'il s'agisse d'une première installation, d'une mise à jour ou d'une migration liée aux technologies Microsoft. L'objet de ce service est de procéder à un examen de l'environnement du client et d'émettre une série de recommandations. En exploitant ces recommandations, le client évite d'éventuels problèmes et s'assure ainsi du bon déroulement des différentes phases de son projet.) |
||||
|
</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>le coût de déploiement : il est dû au fait qu'un déploiement n'est en général pas effectué en une seule fois mais progressivement en s'assurant du bon déroulement du processus.</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>le coût de maintenance : à chaque nouvelle version de IDX-Enroll, le client doit re-tester la solution et la déployer.</para> |
||||
|
</listitem> |
||||
|
</itemizedlist> |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Coûts liés à AEP</title> |
||||
|
|
||||
|
<para> |
||||
|
En comparaison, les coûts liés à l'utilisation d'AEP sont bien moindres. Aucune installation, aucun paramètrage sur les contrôleurs de domaine n'étant nécessaire, il n'implique que des coûts de déploiement : enrôler ces machines petit à petit en s'assurant du bon déroulement de la procédure. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Comparaison</title> |
||||
|
|
||||
|
<para> |
||||
|
Il s'avère que cette dernière solution est bien plus avantageuse que IDX-Enroll. L'équipe commerciale/avant vente estime d'ailleurs qu'elle pourrait diviser les coûts d'enrôlement des contrôleurs de domaine par dix. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
</sect1> |
||||
|
|
||||
|
</chapter> |
||||
|
|
||||
@ -0,0 +1,21 @@ |
|||||
|
#!/usr/bin/awk -f |
||||
|
|
||||
|
BEGIN { |
||||
|
print "<informaltable>"; |
||||
|
print "<tgroup cols='2'>"; |
||||
|
print "<colspec colwidth='*'/>"; |
||||
|
print "<colspec colwidth='10*'/>"; |
||||
|
print "<tbody>"; |
||||
|
FS=","; |
||||
|
print "<row><entry>#</entry><entry>Description</entry></row>"; |
||||
|
} |
||||
|
|
||||
|
{ |
||||
|
print "<row><entry>" $1 "</entry><entry>" $2 "</entry></row>"; |
||||
|
} |
||||
|
|
||||
|
END { |
||||
|
print "</tbody>"; |
||||
|
print "</tgroup>"; |
||||
|
print "</informaltable>"; |
||||
|
} |
||||
@ -0,0 +1,36 @@ |
|||||
|
<preface> |
||||
|
<title>Introduction</title> |
||||
|
|
||||
|
<para> |
||||
|
Dans le cadre de mes études à l'ENSICAEN, j'ai été en stage au sein d'IDEALX trois mois durant. |
||||
|
Lors de cette période, j'ai participé à la vie de l'entreprise en joignant une équipe d'intégrateurs pendant cinq semaines, mais j'ai également, pendant huit semaines, réalisé mon projet de fin d'étude : <emphasis>étude et développement d'un connecteur CMC pour le logiciel OpenTrust-PKI</emphasis> -- c'est à dire un connecteur destiné à l'auto-enrôlement des clients Microsoft. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Ce projet a pour objectif de simplifier la phase de déploiement des certificats dans un environnement Microsoft, permettant ainsi de diminuer le TCO<footnote><para><emphasis>Total Cost of Ownership</emphasis> ou <emphasis>Coût total de possession</emphasis>. C'est un coût qui intégre tous les éléments constitutifs d'un produit manufacturé (inventé par le Gartner Group en 1987).</para></footnote> d'OpenTrust-PKI. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Ce présent rapport expose le travail que j'ai réalisé pendant ce stage, le contexte technique nécessaire à sa compréhension et les résultats obtenus. |
||||
|
</para> |
||||
|
|
||||
|
<sect1 renderas="sect2"> |
||||
|
<title>Remerciements</title> |
||||
|
|
||||
|
<para> |
||||
|
Tout au long de mon stage j'ai bénéficié de l'aide de nombreuses personnes et je leur en suis très reconnaissant. |
||||
|
Je remercie tout particulièrement : |
||||
|
<itemizedlist spacing="compact"> |
||||
|
<listitem><para>Mathias BROSSARD, mon maître de stage, pour ses conseils avisés,</para></listitem> |
||||
|
<listitem><para>Ayoub OTMANI, mon tuteur à l'ENSICAEN,</para></listitem> |
||||
|
<listitem><para>David PEPIN, mon binôme, pour son aide tout au long du stage,</para></listitem> |
||||
|
<listitem><para>Fredéric GARZON et Nicolas DELON, pour leurs innombrables explications,</para></listitem> |
||||
|
<listitem><para>Sherley BROTHIER, directeur technique, pour son soutien,</para></listitem> |
||||
|
<listitem><para>Steve PARKINSON, en charge du projet AEP chez Red Hat, pour son aide inestimable,</para></listitem> |
||||
|
<listitem><para>tout le personnel d'IDEALX, pour leur soutien constant.</para></listitem> |
||||
|
</itemizedlist> |
||||
|
</para> |
||||
|
</sect1> |
||||
|
|
||||
|
</preface> |
||||
|
|
||||
@ -0,0 +1,105 @@ |
|||||
|
<chapter> |
||||
|
<title>Présentation de l'entreprise</title> |
||||
|
|
||||
|
<para> |
||||
|
IDEALX a été créée en février 2000 et s'est fixée |
||||
|
comme objectif de devenir le partenaire Open Source de référence des |
||||
|
grands comptes et administrations. Pour atteindre cet objectif, |
||||
|
IDEALX s'est attachée à construire et à proposer des solutions |
||||
|
packagées et des services à haute valeur ajoutée permettant à ses |
||||
|
clients de mettre en oeuvre des projets stratégiques à base de |
||||
|
composants Open Source. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Par le mode de sélection de ses intervenants, à la fois sur des |
||||
|
critères d'excellence technique et d'adhésion au modèle Open Source, |
||||
|
IDEALX a constitué une équipe homogène de haut niveau. L'importance |
||||
|
accordée en interne à la R&D ainsi que la |
||||
|
publication de ses résultats sur le site <uri>http://www.idealx.org</uri> |
||||
|
témoignent de cet engagement fort. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
IDEALX est devenu en 5 ans le leader en France des infrastructures de confiance, sécurité et dématérialisation, |
||||
|
avec plus de 100 références grands comptes et administrations réunis au sein du C3I, le Club des Clients |
||||
|
Contributeurs IDEALX. |
||||
|
</para> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>IDEALX: éditeur de logiciel</title> |
||||
|
|
||||
|
<para> |
||||
|
Tout d'abord intégrateur de briques technologiques Open Source pour les applications de sécurité, IDEALX est maintenant |
||||
|
éditeur de logiciel spécialisé dans les infrastructures de confiance Open Source. En France et parmis les grands comptes, |
||||
|
IDEALX représente 50% de part de marché avec des clients tels que Total, Areva, Gaz de France, La Poste, l'ANPE, le |
||||
|
Ministère des finances, Sanofi-Aventis, AGF, GAN, Thales, et bien d'autres encore. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
IDEALX est profitable depuis 2003 et a génèré un chiffre d'affaire de 10 millions d'euros en 2006. De plus, |
||||
|
elle prévoit une croissance de 40% cette année, compte recruter 15 nouveaux collaborateurs et souhaite se développer à l'international. |
||||
|
</para> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>L'offre OpenTrust</title> |
||||
|
|
||||
|
<para> |
||||
|
L'offre OpenTrust regroupe les produits phares d'IDEALX : OpenTrust PKI, OpenTrust SCM, OpenTrust XCH et OpenTrust SPI. |
||||
|
Elle répond aux problématiques de sécurisation du SI et de dématérialisation des processus et applications. |
||||
|
Au lieu d'adopter une démarche isolée et spécifique pour chaque domaine ou application, cette offre propose |
||||
|
une infrastructure de confiance globale et multi-applicative. |
||||
|
</para> |
||||
|
|
||||
|
<figure id="opentrustnew.png"> |
||||
|
|
||||
|
<title>L'offre OpenTrust</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="opentrustnew.png" |
||||
|
format="PNG" width="75%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>OpenTrust-PKI</title> |
||||
|
|
||||
|
<para> |
||||
|
OpenTrust-PKI est l'infrastructure de gestion de clefs (PKI, en anglais) développée par IDEALX. Elle est simple, |
||||
|
ergonomique, complète et conçue pour pouvoir être déployée largement. Les solutions |
||||
|
concurrentes sont réputées être plus chères et d'administration complexe. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>OpenTrust-SCM</title> |
||||
|
|
||||
|
<para> |
||||
|
OpenTrust-SCM (SCM pour Smart Card Manager) est un gestionnaire de cartes (à puce, sans contact, etc): il gère le cycle de vie |
||||
|
de la carte, est compatible avec plusieurs formats de cartes et d'applications, fournit un client facile à déployer et |
||||
|
peut interagir nativement avec Open-Trust-PKI. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>OpenTrust-XCH</title> |
||||
|
<para> |
||||
|
OpenTrust-XCH (XCH pour Exchanger) est un outil sécurisé d'échange et de mise à disposition de fichiers. Il permet à des |
||||
|
utilisateurs de déposer des fichiers, et de les mettre en accès à d'autres utilisateurs ou à des personnes extérieures, avec |
||||
|
utilisation de droits d'accès (consultation - modification - droit de joindre des fichiers, avec prise en compte de la date). |
||||
|
Il assure la confidentialité des échanges, l'authentification des utilisateurs et la traçabilité des actions. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>OpenTrust-SPI</title> |
||||
|
<para> |
||||
|
OpenTrust-SPI (SPI pour Signature and Proof Infrastructure) est un outil de signature électronique de documents et |
||||
|
de gestion de la preuve. Il est prévu pour la création et la validation de signature, la génération de compléments de preuve |
||||
|
à valeur probante, et l'archivage légal. |
||||
|
Il est par exemple utilisé pour la gestion des contrats de travail au sein de plus de 90% des agences d'interim en France. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
</sect1> |
||||
|
</chapter> |
||||
|
|
||||
@ -0,0 +1,115 @@ |
|||||
|
<chapter> |
||||
|
<title>Présentation du stage</title> |
||||
|
|
||||
|
<para> |
||||
|
Cette partie présente le sujet de mon stage : <emphasis>étude et développement d'un connecteur CMC pour le logiciel OpenTrust-PKI</emphasis> -- c'est à dire un connecteur destiné à l'auto-enrôlement des clients Microsoft -- ainsi que le contexte technique nécessaire à sa compréhension. |
||||
|
</para> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>Origine des besoins</title> |
||||
|
|
||||
|
<para> |
||||
|
Le sujet de ce stage vient d'un besoin assez éloigné : l'ouverture de session par carte à puce. En effet, une grande banque française, important client d'IDEALX, souhaite mettre en place cette solution au sein de leurs agences. Pour cela, les contrôleurs de domaines doivent nécessairement avoir un certificat leur permettant de prouver leur identité (cf. <xref linkend="MsKb-Q281245"/>). |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Avec un nombre assez restreint de contrôleurs, ce prérequis ne serait pas un problème. Cependant, ce client en possède un nombre impressionnant : au minimum un par agence, pour un total de plusieurs centaines de contrôleurs de domaine. |
||||
|
De telles proportions écartent immédiatement toutes intervention manuelle et il est nécessaire de songer à un processus automatique : l'auto-enrôlement. |
||||
|
</para> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>OpenTrust-PKI</title> |
||||
|
|
||||
|
<para> |
||||
|
OpenTrust-PKI est une PKI souple et performante : elle dispose de nombreuses qualités techniques et fonctionnelles. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Elle est dotée de plusieurs modes de fonctionnement : en ligne (pour les AC opérationnelles) ou hors ligne (pour les AC racines), mono machine ou multi machines. Et afin d'accentuer encore la sécurité de l'infrastructure, elle s'interface avec les principaux HSM du marché (Bull, nCipher, NetSafe). |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Interopérable avec les principaux produits du marché, elle supporte les protocoles SCEP (enrôlement de certificat) et OCSP (validation de certificat) et s'interface avec l'autorité d'horodatage développée par IDEALX. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Cependant, le coté fonctionnel n'est pas en reste : tout est fait pour faciliter le déploiement massif de certificats, que ce soit dans le cas d'une installation initiale ou bien dans le cas de la migration d'une PKI existante : |
||||
|
<itemizedlist> |
||||
|
<listitem><para> |
||||
|
Indépendamment de l'AC, les certificats émis sont paramétrés (usages de la clé, identité du sujet, modalités de délivrance, etc.) par des profils intégralement modifiables par l'utilisateur. |
||||
|
</para></listitem> |
||||
|
<listitem> |
||||
|
<para> |
||||
|
Les informations demandées à l'utilisateur se réduisent à leur strict minimum : lorsque c'est possible, elles sont puisées dans des sources d'information existantes : annuaire d'entreprise, certificat utilisateur déjà existant et éventuellement via un plugin spécifique aux besoins du client. |
||||
|
</para> |
||||
|
<para> |
||||
|
Poussée à son paroxysme (toutes les informations sont puisées d'une source fiable), cette fonction autorise la délivrance de certificats sans intervention d'un opérateur de validation. |
||||
|
</para> |
||||
|
</listitem> |
||||
|
|
||||
|
<listitem> |
||||
|
<para> |
||||
|
Afin de s'intégrer au mieux aux processus de l'entreprise, OpenTrust-PKI supporte plusieurs workflows de validation : par un opérateur, par une source externe ou encore au moyen d'une pré-validation. |
||||
|
</para> |
||||
|
<para> |
||||
|
Et éventuellement, si ces workflows ne suffisent pas, les fonctions les plus courantes de la PKI sont accessible au travers d'un connecteur SOAP, ce qui permet de les intégrer aux processus déjà existants au sein de l'entreprise. |
||||
|
</para> |
||||
|
</listitem> |
||||
|
</itemizedlist> |
||||
|
</para> |
||||
|
|
||||
|
</sect1> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>Auto-enrôlement des clients Microsoft</title> |
||||
|
|
||||
|
|
||||
|
<sect2> |
||||
|
<title>Définition de l'auto-enrôlement</title> |
||||
|
|
||||
|
<para> |
||||
|
Dans un article daté de 2003, Peter Gutmann, chercheur en sécurité informatique, a esquissé ce que pourrait être un auto-enrôlement (cf. <xref linkend="Gutmann03" />). |
||||
|
|
||||
|
Il s'agit d'un processus en trois étapes: |
||||
|
<orderedlist> |
||||
|
<listitem> |
||||
|
<para>Le client doit découvrir l'adresse du point d'enrôlement, que ce soit par une adresse connue de tous ou bien par diffusion de message de découverte de service (par exemple, le protocole SLP).</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>Il doit ensuite, <emphasis role="strong">de manière authentifiée</emphasis>, obtenir les certificats de confiance (certificats d'AC) qu'il intègrera à son magasin.</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>Pour finir, il effectue une demande de certificat <emphasis role="strong">authentifiée</emphasis>, via le point d'enrôlement et obtient son certificat qu'il peut intégrer à son magasin de certificat.</para> |
||||
|
</listitem> |
||||
|
</orderedlist> |
||||
|
</para> |
||||
|
|
||||
|
<figure id="autoenroll.png"> |
||||
|
|
||||
|
<title>Processus d'enrôlement automatique</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="autoenroll.png" |
||||
|
format="PNG" width="100%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>L'environnement Microsoft</title> |
||||
|
|
||||
|
<para> |
||||
|
Cette esquisse a été reprise par Microsoft qui, moyennant quelques ajustements (notamment via l'utilisation du protocole CMC), l'a transposée à son environnement technique. Plus de détails sur ce protocole sont disponibles en <xref linkend="app_cmc" />. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>Cahier des charges</title> |
||||
|
|
||||
|
<para> |
||||
|
L'objectif du projet, dans son ensemble, est d'aboutir à un support complet de l'auto-enrôlement des clients Windows dans le logiciel OpenTrust-PKI via un connecteur CMC. |
||||
|
Au vu de l'étendue temporelle de mon stage (huit semaines passées sur ce projet), seul un sous-ensemble des fonctions sera considéré. |
||||
|
</para> |
||||
|
</sect1> |
||||
|
</chapter> |
||||
|
|
||||
@ -0,0 +1,282 @@ |
|||||
|
<chapter> |
||||
|
<title>Travail Personnel</title> |
||||
|
|
||||
|
<para> |
||||
|
Cette partie présente le travail que j'ai effectué lors de mon stage. Je présente tout d'abord une vue d'ensemble de mon stage, j'aborde ensuite les aspects relationnels et organisationnels et je termine par les aspects techniques du projet. |
||||
|
</para> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>Aperçu</title> |
||||
|
|
||||
|
<para> |
||||
|
Le projet d'aménagement d'un connecteur CMC a débuté lors de mon arrivée chez IDEALX et a été mené sur une période de deux mois (8 semaines). David, également stagiaire, a rejoint le projet deux semaines après mon arrivée. |
||||
|
</para> |
||||
|
|
||||
|
<figure id="gantt.png"> |
||||
|
<title>Diagramme de Gantt</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="gantt.png" |
||||
|
format="PNG" width="100%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
<para> |
||||
|
La <xref linkend="gantt.png" /> présente l'organisation temporelle de mon stage. Les tâches bleue sont celles que j'ai réalisées, les vertes sont celles que David, mon collègue, a réalisées et la violette est une tâche commune. La tâche grise correspond aux cinq semaines passées sur l'intégration de la PKI 3.4. La barre noire au centre de chaque tâche représente son état d'avancement. |
||||
|
</para> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Intégration de la PKI 3.4</title> |
||||
|
|
||||
|
<para>Le projet CMC avançant à vive allure, il nous a été proposé (à David et moi-même) de participer à l'intégration d'OpenTrust-PKI 3.4. Durant ces cinq semaines, nous avons intégré l'équipe de test pour procéder aux tests fonctionnels du produit. Cette opportunité m'a permis de mieux connaitre le produit, et plus particulièrement tout le coté organisationnel des infrastructures de gestion de clés.</para> |
||||
|
|
||||
|
<para> |
||||
|
Tout au long de la période d'intégration, j'ai rapporté les dysfonctionnements que je constatais en essayant, lorsque mes connaissances me le permettaient, de proposer des possibilités de correction. J'ai également formulé des propositions d'amélioration lorsque je jugeais que l'implémentation d'une fonctionnalité n'était pas optimale. La liste de mes contributions est disponible en <xref linkend="app_int" />. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Je me suis aussi proposé de créer les fiches de test d'une nouvelle fonctionnalité de la version 3.4 : la gestion des langues associées aux certificats. Ce fût pour moi l'occasion de m'entretenir avec les architectes du produit et d'émettre ainsi des propositions d'amélioration. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Projet CMC</title> |
||||
|
|
||||
|
<para>Ce projet a débuté par l'étude de la RFC 2797 qui a ensuite débouché sur la rédaction d'une synthèse de ce standard. Ce fût une phase importante du projet, car cela m'a permis de mieux cerner l'étendue des fonctionnalités, possibilités et limitations du protocole. Afin qu'elle profite au plus grand nombre, la synthèse a été ajoutée à la documentation interne du produit. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
La seconde étape fût l'étude de l'existant. Avec l'aide de Christophe De Minguine, nous avons évalué l'opportunité du projet AEP. Cette évaluation fût favorable et les choses se sont accélérées : j'ai réalisé une preuve du concept afin de pouvoir apprécier promptement la faisabilité de cette solution. J'ai alors pu rapidement planifier l'organisation du projet. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
J'ai ensuite commencé à adapter AEP pour OpenTrust-PKI et plutôt que de développer un connecteur CMC spécifique, j'ai réutilisé le connecteur SOAP existant. De plus amples détails sur cette contorsion technique sont disponibles en <xref linkend="sect_tech" />. Ce recyclage a stimulé la réalisation d'un prototype qui a tout de suite intéressé le client à qui nous l'avons présenté. Parallèlement, David travaillait sur l'étude et le développement d'un connecteur SOAP spécifique, qui sera utilisé par la suite. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
En prévision des développements futurs, j'ai passé trois jours en autoformation sur le thème de la <emphasis>sécurité sous Windows avec .NET</emphasis><footnote><para>Voir <xref linkend="Brown04" />.</para></footnote>. Cette autoformation a affiné mes connaissances des technologies Microsoft impliquées dans la sécurité. Ceci m'a également fait découvrir de nouveaux horizons concernant les possibilités d'évolution d'AEP. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Parallèlement à la rédaction de ce rapport, je travaille sur l'adaptation d'AEP pour la première version du connecteur CMC. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
</sect1> |
||||
|
|
||||
|
<sect1> |
||||
|
<title>Aspects relationnels</title> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Travail en équipe</title> |
||||
|
|
||||
|
<para> |
||||
|
Lors de l'intégration, j'ai rallié une équipe nouvelle et durant la première semaine, j'ai bénéficié des conseils et explications d'une personne expérimentée. Grâce à cette phase de formation, j'ai pu prendre en main le produit avec diligence et être rapidement opérationnel. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
L'intégration à une équipe est également un moyen d'avancer rapidement sur un projet surtout lors de l'emploi de technologies nouvelles. Il est important, en effet, d'utiliser les compétences locales pour débloquer rapidement les situations difficiles et obtenir un avis extérieur sur les orientations que l'on envisage. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Tout au long de mon stage, j'ai abondamment communiqué sur l'avancement du projet, utilisant les moyens à ma disposition : wiki, listes de diffusion, courriels et réunions d'avancement. De cette manière, j'ai eu un retour rapide quant à l'orientation à donner au projet et c'est ainsi qu'une démonstration a pu être proposée à un important client d'IDEALX. |
||||
|
</para> |
||||
|
|
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Collaboration avec le monde Open Source</title> |
||||
|
|
||||
|
<para> |
||||
|
Travaillant sur un projet Open Source, j'ai eu à correspondre avec le mainteneur du projet AEP pour obtenir l'aide nécessaire à mon autonomie : état d'avancement, configuration nécessaire, orientation à prendre, etc. |
||||
|
Il est envisagé de maintenir une base de code commune, mutualisant ainsi les corrections de bug et les évolutions futures. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
</sect1> |
||||
|
|
||||
|
|
||||
|
<sect1> |
||||
|
<title>Organisation</title> |
||||
|
|
||||
|
<para> |
||||
|
Peu de temps après la preuve du concept, je me suis appliqué à définir, en concertation avec David, une liste précise de tâches et à les échelonner dans le temps en fonction de leurs liens de précédence. Cette approche nous a permis, d'une part, d'évaluer plus précisément le temps nécessaire pour mener à bien le projet. D'autre part, nous avons pu mesurer au fur et à mesure l'avancée du projet, et ainsi éviter l'effet tunnel. |
||||
|
</para> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Documentation</title> |
||||
|
|
||||
|
<para> |
||||
|
Le projet AEP ne disposant pas de documentation technique (pour les développeurs), j'ai réalisé, à partir des sources du programme, un diagramme statique UML<footnote><para>Une copie de ce diagramme est disponible en <xref linkend="app_uml" />.</para></footnote> que j'ai ensuite envoyé à Steve Parkinson, le mainteneur du projet chez Red Hat. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Afin de mieux faire comprendre l'intéret du projet, son organisation et les étapes à venir, j'ai utilisé l'outil interne de documentation <emphasis>Trac</emphasis>. C'est une application web de gestion des sources (SCM) et de gestion de projet intégré. Il est très adapté pour les petits projets (quelques dizaines de personnes) et est utilisé par beaucoup de projets Open Source. Il permet de travailler de manière désynchronisée dans le temps et dans l'espace avec les personnes impliquées dans le projet. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
</sect1> |
||||
|
|
||||
|
<sect1 id="sect_tech"> |
||||
|
<title>Aspects techniques</title> |
||||
|
|
||||
|
<para> |
||||
|
AEP, AutoEnrollment Proxy, est un serveur mandataire authentifiant. Il s'insère à la place d'une PKI<footnote><para>La dénommination officielle de la PKI Microsoft est "Services de certificat".</para></footnote> Microsoft et transmet les demandes de certificat à une PKI tierce : initialement, la PKI Red Hat. |
||||
|
</para> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Services de certificat Microsoft</title> |
||||
|
|
||||
|
<para> |
||||
|
Les services de certificat, disponibles depuis Windows 2000, sont en fait une autorité de certification intégrée à l'environnement Microsoft. |
||||
|
Cette particularité est aussi un inconvénient: sa portée ne peut dépasser les limites de la forêt<footnote><para>Une forêt est un ensemble d'arbres de domaines qui se font confiance les uns les autres : c'est la frontière de l'authentification Windows. Tout utilisateur ou machine en dehors de la forêt ne peut être authentifié. Voir <xref linkend="Lowe-Norris00" />.</para></footnote> dans laquelle elle est installée. |
||||
|
C'est cette limitation qui incite certains clients à migrer vers une PKI plus souple, par exemple OpenTrust-PKI. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Le fonctionnement de la PKI Microsoft est illustré par la <xref linkend="PKI_MS-Fonct.png" />. Il est important de noter ici l'utilisation du protocole DCOM<footnote><para>Pour de plus amples informations, voir <uri>http://en.wikipedia.org/wiki/Distributed_Component_Object_Model</uri></para></footnote> comme protocole de transport. |
||||
|
</para> |
||||
|
|
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>DCOM</title> |
||||
|
|
||||
|
<para> |
||||
|
Distributed Component Object Model est une technologie de composants distribués développée par Microsoft. C'est une extension de COM, aussi appelée par certains <emphasis>COM with a longer wire</emphasis>. Cette appellation a le mérite de montrer le principal avantage de la technologie DCOM : la compatibilité binaire avec les composants déjà écrits. Mais cette compatibilité est aussi une faiblesse : elle limite les possibilités de DCOM et est source d'ennuis pour le programmeur et l'administrateur système. |
||||
|
</para> |
||||
|
|
||||
|
<figure id="ms2.gif"> |
||||
|
<title>Interfaces des services de certificat</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="ms2.gif" |
||||
|
format="GIF" width="85%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
<para> |
||||
|
Les services de certificat Microsoft utilisent DCOM comme protocole de transport entre le client et le point d'enrôlement. La <xref linkend="ms2.gif" /><footnote><para>Source: <uri>http://www.microsoft.com/</uri></para></footnote> présente toutes les interfaces de ces services. La barre verticale symbolise la limite entre le client et le serveur. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Parmi les interfaces des services de certificat, seules trois sont publiées et documentées : ICertRequest, ICertAdmin et ICertView. Ces interfaces sont présentes sur les clients Windows depuis Windows 2000. Malheureusement, les interfaces "serveur" ne sont ni publiées, ni documentées. Elle font de plus l'objet d'une licence aux États-Unis. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Le projet AEP n'aurait jamais vu le jour si Microsoft n'avait pas publié par erreur les informations nécessaires à la reconstitution de l'interface <emphasis role="strong">ICertRequestD</emphasis>. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>AEP</title> |
||||
|
|
||||
|
<para> |
||||
|
AEP, AutoEnrollment Proxy, est un serveur mandataire authentifiant. Il accepte les demandes authentifiées de certificat par l'interface DCOM ICertRequestD, les transmet à une PKI tierce et retourne le certificat généré au client. (voir <xref linkend="AEP-Fonct.png" />). |
||||
|
</para> |
||||
|
|
||||
|
<figure id="AEP-Fonct.png"> |
||||
|
<title>Processus d'enrôlement avec AEP</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="AEP-Fonct.png" |
||||
|
format="PNG" width="100%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
<para> |
||||
|
Ce niveau d'indirection supplémentaire permet de découpler la PKI du domaine de sécurité des clients Windows (l'ensemble des domaines qui composent la forêt), comme illustré par la <xref linkend="AEP-IDXPKI.png" />. |
||||
|
</para> |
||||
|
|
||||
|
<figure id="AEP-IDXPKI.png"> |
||||
|
<title>Intégration d'AEP dans l'infrastructure Microsoft</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="AEP-IDXPKI.png" |
||||
|
format="PNG" width="85%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
<sect3> |
||||
|
<title>Modifications apportées à AEP</title> |
||||
|
|
||||
|
<para> |
||||
|
Les premières actions que j'ai dû entreprendre concernaient la mise en place d'AEP : étudier son fonctionnement, installer un environnement de développement et intégrer AEP au système d'exploitation (enregistrement des classes, création des services, etc.). |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Je me suis ensuite consacré à la création d'un module de communication avec la PKI. Comme il existait un connecteur SOAP sur celle-ci et qu'il était fonctionnellement adapté, je l'ai réutilisé. Afin de développer ce module, j'ai utilisé le SOAP Toolkit de Microsoft et ai finalement réussi à communiquer avec la PKI à partir d'AEP. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
L'étape suivante fût la réalisation d'un module d'auto-remplissage : à partir des informations d'authentification du client et en utilisant l'Active Directory, obtenir le nom commun, le FQDN et le GUID<footnote><para>Le GUID est un identifiant utilisé par les technologies Microsoft.</para></footnote> de la machine. |
||||
|
</para> |
||||
|
</sect3> |
||||
|
|
||||
|
<sect3> |
||||
|
<title>Modifications prévues d'AEP</title> |
||||
|
|
||||
|
<para> |
||||
|
Afin d'améliorer la portabilité, la fiabilité, la sécurité et la maintenabilité du logiciel, j'ai proposé la migration d'AEP en .NET. |
||||
|
Ceci permettrait d'utiliser les classes de ce framework, plus simples et plus fiables que leurs équivalents natifs. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Il est également prévu, à terme, de maintenir une base de code commune avec le projet Fedora. |
||||
|
</para> |
||||
|
</sect3> |
||||
|
</sect2> |
||||
|
|
||||
|
<sect2> |
||||
|
<title>Problèmes rencontrés</title> |
||||
|
|
||||
|
<para> |
||||
|
L'interface d'enrôlement des services de certificat n'étant ni publiée par Microsoft, ni documentée, son utilisation fût difficile. |
||||
|
En effet, le format et la sémantique des paramètres (dix au total) n'étant pas connus et <emphasis role="strong">l'unique</emphasis> message |
||||
|
d'erreur du client d'enrôlement windows n'étant pas explicite (voir <xref linkend="err1.png" />), la mise au point n'en fût que plus difficile. |
||||
|
|
||||
|
<figure id="err1.png"> |
||||
|
<title>Message d'erreur du client d'enrôlement</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="err1.png" |
||||
|
format="PNG" width="85%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
La raison de cette incapacité à installer le certificat généré est que le sixième paramètre de la méthode <emphasis>Request</emphasis> de l'interface <emphasis>ICertRequestD</emphasis> (cf. <xref linkend="app_iface" />) doit contenir la chaîne de certification complète comprenant le certificat généré et ce bien qu'il soit aussi retourné dans le septième paramètre. |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
Une autre difficulté que j'ai rencontrée est le message d'erreur de la <xref linkend="err2.png" />. |
||||
|
|
||||
|
<figure id="err2.png"> |
||||
|
<title>Message d'erreur du client d'enrôlement</title> |
||||
|
|
||||
|
<mediaobject><imageobject><imagedata fileref="err2.png" |
||||
|
format="PNG" width="85%"/></imageobject></mediaobject> |
||||
|
</figure> |
||||
|
|
||||
|
Cette erreur est liée à un durcissement de la politique de sécurité de Windows 2003 Server, qui a lieu lors de l'installation du Service Pack 1<footnote><para>Ce comportement est décrit dans <uri>http://support.microsoft.com/kb/903220</uri> mais n'est conforme que lorsque les services de certificat sont installés sur la machine.</para></footnote>. La raison de ce problème est que la sécurité des interfaces DCOM est désormais "ACL based" <emphasis role="strong">et</emphasis> "role based" : il ne suffit pas de modifier la liste de contrôle d'accès à l'interface DCOM concernée, il faut également modifier la liste des membres du groupe "DCOM Users". |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
De nombreuses autres erreurs liées à la confidentialité des interfaces d'enrôlement ont ralenti mon avancée. À chaque fois, ma démarche a été identique : |
||||
|
<orderedlist spacing="compact"> |
||||
|
<listitem> |
||||
|
<para>vérifier que le problème n'est pas déjà connu en consultant la base de connaissances Microsoft,</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>consulter les forums, archives de listes de diffusion et autres sources non fiables,</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>analyser finement le journal des événements,</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>analyser les trames qui circulent sur le réseau,</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>lister les appels système à la recherche d'échecs,</para> |
||||
|
</listitem> |
||||
|
<listitem> |
||||
|
<para>procéder par hypothèse / expérience.</para> |
||||
|
</listitem> |
||||
|
</orderedlist> |
||||
|
</para> |
||||
|
|
||||
|
<para> |
||||
|
La dernière source de problèmes fût le manque de documentation sur DCOM. C'est une technologie dépréciée en faveur de .NET, les documentations en ligne sont souvent incomplètes et imprécises, tous les livres traitant de ce sujet ne sont pas réédités et ne sont plus disponibles. |
||||
|
J'ai finalement réussi à me procurer la référence sur le sujet : <emphasis>Professionnal DCOM Programming</emphasis> de Richard GRIMES, ce qui m'a permis de mieux comprendre les tenants et aboutissants de cette technologie. |
||||
|
</para> |
||||
|
</sect2> |
||||
|
</sect1> |
||||
|
</chapter> |
||||
|
|
||||
@ -0,0 +1,70 @@ |
|||||
|
<?xml version='1.0' encoding='utf-8' ?> |
||||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "file:docbook/docbookx.dtd" [ |
||||
|
<!ENTITY preface SYSTEM "include/preface.xml"> |
||||
|
<!ENTITY pres_ent SYSTEM "include/pres_ent.xml"> |
||||
|
<!ENTITY pres_stage SYSTEM "include/pres_stage.xml"> |
||||
|
<!ENTITY existant SYSTEM "include/existant.xml"> |
||||
|
<!ENTITY travail_perso SYSTEM "include/travail_perso.xml"> |
||||
|
<!ENTITY conclusion SYSTEM "include/conclusion.xml"> |
||||
|
<!ENTITY biblio SYSTEM "include/biblio.xml"> |
||||
|
<!ENTITY appendices SYSTEM "include/appendices.xml"> |
||||
|
<!ENTITY app_int SYSTEM "include/integration/int.xml"> |
||||
|
]> |
||||
|
<book lang="fr"> |
||||
|
<!-- Metadata --> |
||||
|
<bookinfo> |
||||
|
<title>Étude et développement d'un connecteur CMC pour OpenTrust-PKI</title> |
||||
|
<subtitle>Rapport de stage de fin d’études</subtitle> |
||||
|
<author> |
||||
|
<firstname>Nicolas</firstname><surname>MASSÉ</surname> |
||||
|
<affiliation> |
||||
|
<orgname>IDEALX</orgname> |
||||
|
</affiliation> |
||||
|
<email>nicolas.masse@idealx.com</email> |
||||
|
</author> |
||||
|
<copyright> |
||||
|
<year>2007</year> |
||||
|
<holder>Nicolas MASSÉ</holder> |
||||
|
</copyright> |
||||
|
<abstract> |
||||
|
<para> |
||||
|
Dans le cadre de mes études à l'ENSICAEN, je fût en stage au sein d'IDEALX trois mois durant. Lors de cette période, j'ai participé à la vie de l'entreprise en joignant une équipe d'intégrateurs pendant cinq semaines, mais j'ai également, pendant huit semaines, réalisé mon projet de fin d'étude : <emphasis>étude et développement d'un connecteur CMC pour le logiciel OpenTrust-PKI</emphasis> -- c'est à dire un connecteur destiné à l'auto-enrôlement des clients Microsoft. Ce projet a pour objectif de simplifier la phase de déploiement des certificats dans un environnement Microsoft, permettant ainsi de diminuer le TCO d'OpenTrust-PKI. Ce présent rapport présente le travail que j'ai réalisé pendant ce stage, le contexte technique nécessaire à sa compréhension et les résultats obtenus. |
||||
|
</para> |
||||
|
</abstract> |
||||
|
</bookinfo> |
||||
|
|
||||
|
|
||||
|
<!-- Preface --> |
||||
|
&preface; |
||||
|
|
||||
|
<!-- Présentation de l'entreprise --> |
||||
|
&pres_ent; |
||||
|
|
||||
|
<!-- Présentation du stage --> |
||||
|
&pres_stage; |
||||
|
|
||||
|
<!-- Étude de l'existant --> |
||||
|
&existant; |
||||
|
|
||||
|
<!-- Travail personnel --> |
||||
|
&travail_perso; |
||||
|
|
||||
|
<!-- Conclusion --> |
||||
|
&conclusion; |
||||
|
|
||||
|
<!-- Appendices --> |
||||
|
&appendices; |
||||
|
|
||||
|
<appendix id="app_int"> |
||||
|
<title>Contributions à l'intégration de la PKI 3.4</title> |
||||
|
|
||||
|
<para> |
||||
|
&app_int; |
||||
|
</para> |
||||
|
</appendix> |
||||
|
|
||||
|
<!-- Bibliography --> |
||||
|
&biblio; |
||||
|
|
||||
|
</book> |
||||
|
|
||||
@ -0,0 +1,152 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="../../globals/common-fo.xsl" /> |
||||
|
<!-- <xsl:include href="./titlepage.xsl" /> --> |
||||
|
|
||||
|
<!-- Biblio --> |
||||
|
<xsl:param name="bibliography.numbered" select="1"/> |
||||
|
|
||||
|
<!-- Draft mode |
||||
|
<xsl:attribute-set name="normal.para.spacing"> |
||||
|
<xsl:attribute name="space-before.optimum">1em</xsl:attribute> |
||||
|
<xsl:attribute name="space-before.minimum">0.8em</xsl:attribute> |
||||
|
<xsl:attribute name="space-before.maximum">1.2em</xsl:attribute> |
||||
|
<xsl:attribute name="line-height">16pt</xsl:attribute> |
||||
|
</xsl:attribute-set> --> |
||||
|
|
||||
|
<!-- Custom titlepage for the ENSI --> |
||||
|
<xsl:template name="book.titlepage.recto"> |
||||
|
<!-- ENSI --> |
||||
|
<fo:block-container absolute-position="absolute" top="0mm" left="0mm"> |
||||
|
<fo:block> |
||||
|
<fo:external-graphic |
||||
|
src="img/logos/ensi.png" |
||||
|
content-width="4cm" |
||||
|
content-type="content-type:image/png" /> |
||||
|
</fo:block> |
||||
|
<fo:block font-family="serif" font-size="12pt">6 bd maréchal Juin</fo:block> |
||||
|
<fo:block font-family="serif" font-size="12pt" space-before="0pt">14050 CAEN Cedex 4</fo:block> |
||||
|
<fo:block font-family="serif" font-size="14pt" space-before="8pt">Spécialité Informatique</fo:block> |
||||
|
<fo:block font-family="serif" font-size="14pt" space-before="0pt">Option Monétique</fo:block> |
||||
|
<fo:block font-family="serif" font-size="14pt" space-before="0pt">3ème Année</fo:block> |
||||
|
</fo:block-container> |
||||
|
|
||||
|
<!-- ENSI vertical --> |
||||
|
<fo:block-container absolute-position="absolute" bottom="0mm" left="0mm" display-align="after"> |
||||
|
<fo:block> |
||||
|
<fo:external-graphic |
||||
|
src="img/logos/ensi-vertical-long.png" |
||||
|
content-height="20cm" |
||||
|
content-type="content-type:image/png" /> |
||||
|
</fo:block> |
||||
|
</fo:block-container> |
||||
|
|
||||
|
<!-- T-Systems --> |
||||
|
<fo:block-container absolute-position="absolute" top="0mm" right="0mm"> |
||||
|
<fo:block text-align="right"> |
||||
|
<fo:external-graphic |
||||
|
src="img/logos/idealx.png" |
||||
|
content-width="5cm" |
||||
|
content-type="content-type:image/png" /> |
||||
|
</fo:block> |
||||
|
<fo:block text-align="right" font-family="serif" font-size="12pt">IDEALX</fo:block> |
||||
|
<fo:block text-align="right" font-family="serif" font-size="12pt">15-17 avenue de Ségur</fo:block> |
||||
|
<fo:block text-align="right" font-family="serif" font-size="12pt">75007 PARIS</fo:block> |
||||
|
<fo:block text-align="right" font-family="serif" font-size="12pt">http://www.idealx.com/</fo:block> |
||||
|
</fo:block-container> |
||||
|
|
||||
|
<!-- Title --> |
||||
|
<fo:block-container absolute-position="absolute" top="6cm" bottom="2cm" left="20mm" right="0cm" display-align="center"> |
||||
|
<fo:block text-align="center" font-family="serif" font-size="18pt" space-after="15mm"> |
||||
|
<xsl:value-of select="bookinfo/subtitle" /> |
||||
|
</fo:block> |
||||
|
<fo:block text-align="center" space-after="0mm"><fo:leader leader-length="5cm" leader-pattern="rule" rule-thickness="1pt"/></fo:block> |
||||
|
<fo:block text-align="center" font-family="serif" font-size="36pt" space-before="7.8mm" space-after="7.8mm"> |
||||
|
<xsl:value-of select="bookinfo/title" /> |
||||
|
</fo:block> |
||||
|
<fo:block text-align="center" space-before="0mm"><fo:leader leader-length="5cm" leader-pattern="rule" rule-thickness="1pt"/></fo:block> |
||||
|
<fo:block text-align="center" font-family="serif" font-size="14pt" space-before="20mm"> |
||||
|
<xsl:apply-templates select="bookinfo/author" /> |
||||
|
</fo:block> |
||||
|
</fo:block-container> |
||||
|
|
||||
|
<!-- Suivi --> |
||||
|
<fo:block-container absolute-position="absolute" bottom="0mm" left="20mm" display-align="after"> |
||||
|
<fo:block font-family="serif" font-size="14pt">Suivi Ensicaen:</fo:block> |
||||
|
<fo:block font-family="serif" font-size="14pt">OTMANI Ayoub</fo:block> |
||||
|
<fo:block font-family="serif" font-size="14pt" space-before="14pt">Suivi entreprise:</fo:block> |
||||
|
<fo:block font-family="serif" font-size="14pt">BROSSARD Mathias</fo:block> |
||||
|
</fo:block-container> |
||||
|
|
||||
|
<!-- Date --> |
||||
|
<fo:block-container absolute-position="absolute" bottom="0mm" right="0mm" display-align="after"> |
||||
|
<fo:block text-align="right" font-family="serif" font-size="14pt">Mars - Septembre 2007</fo:block> |
||||
|
</fo:block-container> |
||||
|
|
||||
|
</xsl:template> |
||||
|
|
||||
|
<!-- User defined page layout --> |
||||
|
<xsl:template name="user.pagemasters"> |
||||
|
<!-- custom setup for title page(s) --> |
||||
|
<fo:page-sequence-master master-name="custom-titlepage"> |
||||
|
<fo:repeatable-page-master-alternatives> |
||||
|
<fo:conditional-page-master-reference master-reference="blank" |
||||
|
blank-or-not-blank="blank"/> |
||||
|
<fo:conditional-page-master-reference master-reference="custom-titlepage-first" |
||||
|
page-position="first"/> |
||||
|
<fo:conditional-page-master-reference master-reference="titlepage-odd" |
||||
|
odd-or-even="odd"/> |
||||
|
<fo:conditional-page-master-reference |
||||
|
odd-or-even="even"> |
||||
|
<xsl:attribute name="master-reference"> |
||||
|
<xsl:choose> |
||||
|
<xsl:when test="$double.sided != 0">titlepage-even</xsl:when> |
||||
|
<xsl:otherwise>titlepage-odd</xsl:otherwise> |
||||
|
</xsl:choose> |
||||
|
</xsl:attribute> |
||||
|
</fo:conditional-page-master-reference> |
||||
|
</fo:repeatable-page-master-alternatives> |
||||
|
</fo:page-sequence-master> |
||||
|
|
||||
|
<!-- Custom first title page --> |
||||
|
<fo:simple-page-master master-name="custom-titlepage-first" |
||||
|
page-width="{$page.width}" |
||||
|
page-height="{$page.height}" |
||||
|
margin-top="20mm" |
||||
|
margin-bottom="20mm" |
||||
|
margin-left="20mm" |
||||
|
margin-right="20mm"> |
||||
|
<fo:region-body margin-bottom="0mm" |
||||
|
margin-top="0mm" |
||||
|
column-count="1"> |
||||
|
</fo:region-body> |
||||
|
</fo:simple-page-master> |
||||
|
</xsl:template> |
||||
|
|
||||
|
<!-- Wrapper override --> |
||||
|
<xsl:template name="select.user.pagemaster"> |
||||
|
<xsl:param name="element"/> |
||||
|
<xsl:param name="pageclass"/> |
||||
|
<xsl:param name="default-pagemaster"/> |
||||
|
|
||||
|
<!-- Return my customized title page master name if for titlepage, |
||||
|
otherwise return the default --> |
||||
|
|
||||
|
<xsl:choose> |
||||
|
<xsl:when test="$default-pagemaster = 'titlepage'"> |
||||
|
<xsl:value-of select="'custom-titlepage'" /> |
||||
|
</xsl:when> |
||||
|
<xsl:otherwise> |
||||
|
<xsl:value-of select="$default-pagemaster"/> |
||||
|
</xsl:otherwise> |
||||
|
</xsl:choose> |
||||
|
</xsl:template> |
||||
|
|
||||
|
<!-- Header / Footer width --> |
||||
|
<xsl:param name="header.column.widths" select="'1 5 1'"></xsl:param> |
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="../../globals/common-html-chunked.xsl" /> |
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="../../globals/common-xhtml-chunked.xsl" /> |
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,122 @@ |
|||||
|
# Environment variables
|
||||
|
export PATH := $(HOME)/bin/fop:$(PATH) |
||||
|
export CLASSPATH := xsl/xsl-stylesheets/extensions/xalan25.jar |
||||
|
|
||||
|
# Do you need a proxy ?
|
||||
|
export FOP_OPTS := -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8080 |
||||
|
|
||||
|
# Or any setting
|
||||
|
export FOP_OPTS := $(FOP_OPTS) -Xmx1G -Djava.awt.headless=true |
||||
|
|
||||
|
# Target filenames
|
||||
|
PDF_FILE := book.pdf |
||||
|
RTF_FILE := book.rtf |
||||
|
TXT_FILE := book.txt |
||||
|
PS_FILE := book.ps |
||||
|
XHTML_DIR := book-xhtml |
||||
|
XHTML1_DIR := onepage-xhtml |
||||
|
HTML_DIR := book-html |
||||
|
HTML1_DIR := onepage-html |
||||
|
XHTML_ARCH := book-xhtml.tar.bz2 |
||||
|
HTML_ARCH := book-html.tar.bz2 |
||||
|
XHTML1_ARCH := onepage-xhtml.tar.bz2 |
||||
|
HTML1_ARCH := onepage-html.tar.bz2 |
||||
|
VALIDITY_FILE := validity |
||||
|
|
||||
|
# Source filenames
|
||||
|
XSL_FO_FILE := xsl/fo.xsl |
||||
|
XSL_XHTML_FILE := xsl/xhtml-chunked.xsl |
||||
|
XSL_HTML_FILE := xsl/html-chunked.xsl |
||||
|
XSL_XHTML1_FILE := xsl/xhtml-onepage.xsl |
||||
|
XSL_HTML1_FILE := xsl/html-onepage.xsl |
||||
|
DB_FILE := main.xml |
||||
|
|
||||
|
# Titlepage customization
|
||||
|
TP_SPEC_FILE := xsl/titlepage.spec.xml |
||||
|
TP_XSL_FILE := xsl/titlepage.xsl |
||||
|
TP_TEMPLATE_FILE := ../globals/xsl-stylesheets/template/titlepage.xsl |
||||
|
|
||||
|
# Do you have a custom titlepage ?
|
||||
|
TP_XSL_REAL := $(shell if test -f $(TP_SPEC_FILE); then echo $(TP_XSL_FILE); fi) |
||||
|
|
||||
|
# FOP configuration
|
||||
|
FOP := fop |
||||
|
FOP_CONF := fop.xconf |
||||
|
|
||||
|
# XSLT configuration
|
||||
|
XSLTPROC := xsltproc |
||||
|
|
||||
|
# Validity check
|
||||
|
VALIDATOR := xmllint --noout --valid |
||||
|
|
||||
|
# Extract external entities
|
||||
|
XML_FILES := $(wildcard include/*.xml) |
||||
|
DEPENDENCIES := $(TP_XSL_REAL) $(VALIDITY_FILE) |
||||
|
|
||||
|
# Default target
|
||||
|
all: $(PDF_FILE) $(RTF_FILE) $(TXT_FILE) $(PS_FILE) $(XHTML_ARCH) $(HTML_ARCH) $(XHTML1_ARCH) $(HTML1_ARCH) |
||||
|
|
||||
|
$(VALIDITY_FILE): $(DB_FILE) $(XML_FILES) |
||||
|
$(VALIDATOR) $< |
||||
|
touch $(VALIDITY_FILE) |
||||
|
|
||||
|
$(PDF_FILE): $(DB_FILE) $(XSL_FO_FILE) $(DEPENDENCIES) |
||||
|
$(FOP) -c $(FOP_CONF) -xsl $(XSL_FO_FILE) -xml $< -pdf $@ |
||||
|
|
||||
|
$(RTF_FILE): $(DB_FILE) $(XSL_FO_FILE) $(DEPENDENCIES) |
||||
|
$(FOP) -c $(FOP_CONF) -xsl $(XSL_FO_FILE) -xml $< -rtf $@ |
||||
|
|
||||
|
$(TXT_FILE): $(DB_FILE) $(XSL_FO_FILE) $(DEPENDENCIES) |
||||
|
$(FOP) -c $(FOP_CONF) -xsl $(XSL_FO_FILE) -xml $< -txt $@ |
||||
|
|
||||
|
$(PS_FILE): $(DB_FILE) $(XSL_FO_FILE) $(DEPENDENCIES) |
||||
|
$(FOP) -c $(FOP_CONF) -xsl $(XSL_FO_FILE) -xml $< -ps $@ |
||||
|
|
||||
|
$(XHTML_DIR): $(DB_FILE) $(XSL_XHTML_FILE) $(DEPENDENCIES) |
||||
|
if [ ! -e $(XHTML_DIR) ]; then mkdir $(XHTML_DIR); ln -s ../img $(XHTML_DIR)/img; \
|
||||
|
ln -s ../../globals/xsl-stylesheets/images $(XHTML_DIR)/std-img; fi |
||||
|
$(XSLTPROC) $(XSL_XHTML_FILE) $< |
||||
|
touch $(XHTML_DIR) |
||||
|
|
||||
|
$(HTML_DIR): $(DB_FILE) $(XSL_HTML_FILE) $(DEPENDENCIES) |
||||
|
if [ ! -e $(HTML_DIR) ]; then mkdir $(HTML_DIR); ln -s ../img $(HTML_DIR)/img; \
|
||||
|
ln -s ../../globals/xsl-stylesheets/images $(HTML_DIR)/std-img; fi |
||||
|
$(XSLTPROC) $(XSL_HTML_FILE) $< |
||||
|
touch $(HTML_DIR) |
||||
|
|
||||
|
$(XHTML1_DIR): $(DB_FILE) $(XSL_XHTML1_FILE) $(DEPENDENCIES) |
||||
|
if [ ! -e $(XHTML_DIR) ]; then mkdir $(XHTML1_DIR); ln -s ../img $(XHTML1_DIR)/img; \
|
||||
|
ln -s ../../globals/xsl-stylesheets/images $(XHTML1_DIR)/std-img; fi |
||||
|
$(XSLTPROC) -output $@/index.xhtml $(XSL_XHTML1_FILE) $< |
||||
|
touch $(XHTML1_DIR) |
||||
|
|
||||
|
$(HTML1_DIR): $(DB_FILE) $(XSL_HTML1_FILE) $(DEPENDENCIES) |
||||
|
if [ ! -e $(HTML1_DIR) ]; then mkdir $(HTML1_DIR); ln -s ../img $(HTML1_DIR)/img; \
|
||||
|
ln -s ../../globals/xsl-stylesheets/images $(HTML1_DIR)/std-img; fi |
||||
|
$(XSLTPROC) -output $@/index.html $(XSL_HTML1_FILE) $< |
||||
|
touch $(HTML1_DIR) |
||||
|
|
||||
|
$(HTML_ARCH): $(HTML_DIR) |
||||
|
tar -jcv -h --exclude '.svn' --exclude '*.svg' -f $@ $< |
||||
|
|
||||
|
$(XHTML_ARCH): $(XHTML_DIR) |
||||
|
tar -jcv -h --exclude '.svn' --exclude '*.svg' -f $@ $< |
||||
|
|
||||
|
$(HTML1_ARCH): $(HTML1_DIR) |
||||
|
tar -jcv -h --exclude '.svn' --exclude '*.svg' -f $@ $< |
||||
|
|
||||
|
$(XHTML1_ARCH): $(XHTML1_DIR) |
||||
|
tar -jcv -h --exclude '.svn' --exclude '*.svg' -f $@ $< |
||||
|
|
||||
|
$(TP_XSL_FILE): $(TP_SPEC_FILE) |
||||
|
$(XSLTPROC) -output $@ $(TP_TEMPLATE_FILE) $< |
||||
|
|
||||
|
clean: |
||||
|
rm -f $(PDF_FILE) $(TP_XSL_FILE) $(VALIDITY_FILE) $(HTML_ARCH) $(XHTML_ARCH) $(RTF_FILE) $(TXT_FILE) $(PS_FILE) |
||||
|
rm -rf $(XHTML_DIR) $(HTML_DIR) |
||||
|
|
||||
|
test: |
||||
|
@echo '$(XML_FILES)' |
||||
|
|
||||
|
.PHONY: all clean test |
||||
|
|
||||
@ -0,0 +1,218 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="xsl-stylesheets/fo/docbook.xsl" /> |
||||
|
|
||||
|
<!-- Don't forget the quotes inside the double quotes --> |
||||
|
<xsl:param name="paper.type" select="'A4'" /> |
||||
|
<xsl:param name="page.orientation" select="'portrait'" /> |
||||
|
|
||||
|
<!-- FOP extension, doesn't work ! |
||||
|
<xsl:param name="fop.extensions" select="1" /> --> |
||||
|
|
||||
|
<!-- Draft mode, not supported by FOP |
||||
|
<xsl:param name="draft.mode" select="maybe" /> --> |
||||
|
|
||||
|
<!-- Print section numbers --> |
||||
|
<xsl:param name="section.autolabel" select="1" /> |
||||
|
|
||||
|
<!-- Display admonition icons (warning, note, tip, etc.) --> |
||||
|
<xsl:param name="admon.graphics" select="1" /> |
||||
|
<xsl:param name="admon.graphics.extension" select="'.svg'" /> |
||||
|
<xsl:param name="admon.graphics.path">../globals/xsl-stylesheets/images/</xsl:param> |
||||
|
<xsl:attribute-set name="graphical.admonition.properties"> |
||||
|
<xsl:attribute name="space-before.optimum">1em</xsl:attribute> |
||||
|
<xsl:attribute name="space-before.minimum">0.8em</xsl:attribute> |
||||
|
<xsl:attribute name="space-before.maximum">1.2em</xsl:attribute> |
||||
|
<xsl:attribute name="space-after.optimum">1em</xsl:attribute> |
||||
|
<xsl:attribute name="space-after.minimum">0.8em</xsl:attribute> |
||||
|
<xsl:attribute name="space-after.maximum">1.2em</xsl:attribute> |
||||
|
<xsl:attribute name="border-style">dashed</xsl:attribute> |
||||
|
<xsl:attribute name="border-width">.5pt</xsl:attribute> |
||||
|
<xsl:attribute name="border-color">#555555</xsl:attribute> |
||||
|
<xsl:attribute name="background-color">#EEEEEE</xsl:attribute> |
||||
|
<xsl:attribute name="padding">5pt</xsl:attribute> |
||||
|
</xsl:attribute-set> |
||||
|
<xsl:attribute-set name="admonition.properties"> |
||||
|
</xsl:attribute-set> |
||||
|
<xsl:attribute-set name="admonition.title.properties"> |
||||
|
<xsl:attribute name="font-family">sans-serif</xsl:attribute> |
||||
|
</xsl:attribute-set> |
||||
|
|
||||
|
|
||||
|
<!-- Callout configuration --> |
||||
|
<xsl:param name="callout.graphics" select="0" /> |
||||
|
<xsl:param name="callout.unicode" select="1" /> |
||||
|
|
||||
|
<!-- Disable text label in admonitions --> |
||||
|
<!-- <xsl:param name="admon.textlabel" select="0" /> --> |
||||
|
|
||||
|
<!-- Customization of the TOC : indent by 15 pt --> |
||||
|
<xsl:param name="toc.indent.width" select="15" /> |
||||
|
|
||||
|
<!-- Images path --> |
||||
|
<xsl:param name="img.src.path">img/</xsl:param> |
||||
|
|
||||
|
<!-- Set the default font for the text body --> |
||||
|
<xsl:param name="body.font.family" select="'Georgia'"/> |
||||
|
|
||||
|
<!-- Customize the font used for programlisting --> |
||||
|
<xsl:attribute-set name="monospace.properties"> |
||||
|
<!-- Reduce the size of the monospace font --> |
||||
|
<xsl:attribute name="font-size"> |
||||
|
<xsl:text>90%</xsl:text> |
||||
|
</xsl:attribute> |
||||
|
|
||||
|
<!-- Light gray background --> |
||||
|
<xsl:attribute name="background-color">#EEEEEE</xsl:attribute> |
||||
|
|
||||
|
<!-- Change the font to "Courier New" --> |
||||
|
<!-- <xsl:attribute name="font-family">CourierNew</xsl:attribute> --> |
||||
|
</xsl:attribute-set> |
||||
|
|
||||
|
<!-- Template overload --> |
||||
|
<xsl:template name="inline.monoseq"> |
||||
|
<xsl:param name="content"> |
||||
|
<xsl:apply-templates/> |
||||
|
</xsl:param> |
||||
|
<fo:inline xsl:use-attribute-sets="monospace.properties"> |
||||
|
<xsl:attribute name="background-color">transparent</xsl:attribute> |
||||
|
<xsl:if test="@dir"> |
||||
|
<xsl:attribute name="direction"> |
||||
|
<xsl:choose> |
||||
|
<xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when> |
||||
|
<xsl:otherwise>rtl</xsl:otherwise> |
||||
|
</xsl:choose> |
||||
|
</xsl:attribute> |
||||
|
</xsl:if> |
||||
|
<xsl:copy-of select="$content"/> |
||||
|
</fo:inline> |
||||
|
</xsl:template> |
||||
|
|
||||
|
<!-- TOC template --> |
||||
|
<xsl:template name="toc.line"> |
||||
|
<xsl:variable name="id"> |
||||
|
<xsl:call-template name="object.id"/> |
||||
|
</xsl:variable> |
||||
|
|
||||
|
<xsl:variable name="label"> |
||||
|
<xsl:apply-templates select="." mode="label.markup"/> |
||||
|
</xsl:variable> |
||||
|
|
||||
|
<fo:block text-align-last="justify" |
||||
|
text-align="start" |
||||
|
end-indent="{$toc.indent.width}pt" |
||||
|
last-line-end-indent="-{$toc.indent.width}pt"> |
||||
|
|
||||
|
<!-- Adds space before main elements --> |
||||
|
<xsl:choose> |
||||
|
<xsl:when test="parent::book"> |
||||
|
<xsl:attribute name="space-before">3pt</xsl:attribute> |
||||
|
<xsl:attribute name="space-after">1pt</xsl:attribute> |
||||
|
</xsl:when> |
||||
|
</xsl:choose> |
||||
|
|
||||
|
<fo:inline keep-with-next.within-line="always"> |
||||
|
|
||||
|
<!-- Main elements in bold --> |
||||
|
<xsl:choose> |
||||
|
<xsl:when test="parent::book"> |
||||
|
<xsl:attribute name="font-weight">bold</xsl:attribute> |
||||
|
</xsl:when> |
||||
|
</xsl:choose> |
||||
|
|
||||
|
<fo:basic-link internal-destination="{$id}"> |
||||
|
<xsl:if test="$label != ''"> |
||||
|
<xsl:copy-of select="$label"/> |
||||
|
<xsl:value-of select="$autotoc.label.separator"/> |
||||
|
</xsl:if> |
||||
|
<xsl:apply-templates select="." mode="titleabbrev.markup"/> |
||||
|
</fo:basic-link> |
||||
|
</fo:inline> |
||||
|
|
||||
|
<fo:inline keep-together.within-line="always"> |
||||
|
<xsl:text> </xsl:text> |
||||
|
|
||||
|
<!-- Main elements do not have leaders (dots) --> |
||||
|
<xsl:choose> |
||||
|
<xsl:when test="parent::book"> |
||||
|
<fo:leader leader-pattern="space" |
||||
|
leader-pattern-width="3pt" |
||||
|
leader-alignment="reference-area" |
||||
|
keep-with-next.within-line="always"/> |
||||
|
</xsl:when> |
||||
|
<xsl:otherwise> |
||||
|
<fo:leader leader-pattern="dots" |
||||
|
leader-pattern-width="3pt" |
||||
|
leader-alignment="reference-area" |
||||
|
keep-with-next.within-line="always"/> |
||||
|
</xsl:otherwise> |
||||
|
</xsl:choose> |
||||
|
|
||||
|
<xsl:text> </xsl:text> |
||||
|
<fo:basic-link internal-destination="{$id}"> |
||||
|
<fo:page-number-citation ref-id="{$id}"/> |
||||
|
</fo:basic-link> |
||||
|
</fo:inline> |
||||
|
</fo:block> |
||||
|
</xsl:template> |
||||
|
|
||||
|
<!-- Customization of the bibliography --> |
||||
|
<xsl:template match="title" mode="bibliodiv.titlepage.recto.auto.mode"> |
||||
|
<fo:block xsl:use-attribute-sets="section.title.properties section.title.level1.properties"> |
||||
|
<xsl:value-of select="." /> |
||||
|
</fo:block> |
||||
|
</xsl:template> |
||||
|
|
||||
|
<!-- Customization of the glossary --> |
||||
|
<xsl:template match="title" mode="glossdiv.titlepage.recto.auto.mode"> |
||||
|
<fo:block xsl:use-attribute-sets="section.title.properties section.title.level1.properties"> |
||||
|
<xsl:value-of select="." /> |
||||
|
</fo:block> |
||||
|
</xsl:template> |
||||
|
|
||||
|
<!-- Component's title (chapter, appendix, etc.) --> |
||||
|
<xsl:attribute-set name="component.title.properties"> |
||||
|
<xsl:attribute name="font-size"> |
||||
|
<xsl:value-of select="$body.font.master * 2"/> |
||||
|
<xsl:text>pt</xsl:text> |
||||
|
</xsl:attribute> |
||||
|
</xsl:attribute-set> |
||||
|
|
||||
|
<!-- Section 1 title --> |
||||
|
<xsl:attribute-set name="section.title.level1.properties"> |
||||
|
<xsl:attribute name="font-size"> |
||||
|
<xsl:value-of select="$body.font.master * 1.75"/> |
||||
|
<xsl:text>pt</xsl:text> |
||||
|
</xsl:attribute> |
||||
|
<!-- <xsl:attribute name="border-bottom">0.5pt solid black</xsl:attribute> --> |
||||
|
<!-- <xsl:attribute name="margin-right">4cm</xsl:attribute> --> |
||||
|
</xsl:attribute-set> |
||||
|
|
||||
|
<!-- Section 2 title --> |
||||
|
<xsl:attribute-set name="section.title.level2.properties"> |
||||
|
<xsl:attribute name="font-size"> |
||||
|
<xsl:value-of select="$body.font.master * 1.5"/> |
||||
|
<xsl:text>pt</xsl:text> |
||||
|
</xsl:attribute> |
||||
|
</xsl:attribute-set> |
||||
|
|
||||
|
<!-- Section 3 title --> |
||||
|
<xsl:attribute-set name="section.title.level3.properties"> |
||||
|
<xsl:attribute name="font-size"> |
||||
|
<xsl:value-of select="$body.font.master * 1.25"/> |
||||
|
<xsl:text>pt</xsl:text> |
||||
|
</xsl:attribute> |
||||
|
</xsl:attribute-set> |
||||
|
|
||||
|
<!-- Section 4 title --> |
||||
|
<xsl:attribute-set name="section.title.level4.properties"> |
||||
|
<xsl:attribute name="font-size"> |
||||
|
<xsl:value-of select="$body.font.master * 1.1"/> |
||||
|
<xsl:text>pt</xsl:text> |
||||
|
</xsl:attribute> |
||||
|
</xsl:attribute-set> |
||||
|
</xsl:stylesheet> |
||||
@ -0,0 +1,36 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="xsl-stylesheets/html/chunk.xsl" /> |
||||
|
<!-- <xsl:include href="./titlepage.xsl" /> --> |
||||
|
|
||||
|
<!-- Don't forget the quotes inside the double quotes --> |
||||
|
<xsl:param name="base.dir" select="'./book-html/'" /> |
||||
|
|
||||
|
<!-- Print section numbers --> |
||||
|
<xsl:param name="section.autolabel" select="1" /> |
||||
|
|
||||
|
<!-- No image scaling --> |
||||
|
<xsl:param name="ignore.image.scaling" select="1" /> |
||||
|
|
||||
|
<!-- Display admonition icons (warning, note, tip, etc.) --> |
||||
|
<xsl:param name="admon.graphics" select="1" /> |
||||
|
<xsl:param name="admon.graphics.extension" select="'.png'" /> |
||||
|
<xsl:param name="admon.graphics.path">std-img/</xsl:param> |
||||
|
|
||||
|
<!-- Disable text label in admonitions --> |
||||
|
<!-- <xsl:param name="admon.textlabel" select="0" /> --> |
||||
|
|
||||
|
<!-- Callout configuration --> |
||||
|
<xsl:param name="callout.graphics" select="1" /> |
||||
|
<xsl:param name="callout.graphics.extension" select="'.gif'" /> |
||||
|
<xsl:param name="callout.graphics.path">std-img/callouts/</xsl:param> |
||||
|
|
||||
|
<!-- Images path --> |
||||
|
<xsl:param name="img.src.path">img/</xsl:param> |
||||
|
|
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,36 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="xsl-stylesheets/html/docbook.xsl" /> |
||||
|
<!-- <xsl:include href="./titlepage.xsl" /> --> |
||||
|
|
||||
|
<!-- Don't forget the quotes inside the double quotes --> |
||||
|
<xsl:param name="base.dir" select="'./onepage-html/'" /> |
||||
|
|
||||
|
<!-- Print section numbers --> |
||||
|
<xsl:param name="section.autolabel" select="1" /> |
||||
|
|
||||
|
<!-- No image scaling --> |
||||
|
<xsl:param name="ignore.image.scaling" select="1" /> |
||||
|
|
||||
|
<!-- Display admonition icons (warning, note, tip, etc.) --> |
||||
|
<xsl:param name="admon.graphics" select="1" /> |
||||
|
<xsl:param name="admon.graphics.extension" select="'.png'" /> |
||||
|
<xsl:param name="admon.graphics.path">std-img/</xsl:param> |
||||
|
|
||||
|
<!-- Disable text label in admonitions --> |
||||
|
<!-- <xsl:param name="admon.textlabel" select="0" /> --> |
||||
|
|
||||
|
<!-- Callout configuration --> |
||||
|
<xsl:param name="callout.graphics" select="1" /> |
||||
|
<xsl:param name="callout.graphics.extension" select="'.gif'" /> |
||||
|
<xsl:param name="callout.graphics.path">std-img/callouts/</xsl:param> |
||||
|
|
||||
|
<!-- Images path --> |
||||
|
<xsl:param name="img.src.path">img/</xsl:param> |
||||
|
|
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,36 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="xsl-stylesheets/xhtml/chunk.xsl" /> |
||||
|
<!-- <xsl:include href="./titlepage.xsl" /> --> |
||||
|
|
||||
|
<!-- Don't forget the quotes inside the double quotes --> |
||||
|
<xsl:param name="base.dir" select="'./book-xhtml/'" /> |
||||
|
|
||||
|
<!-- Print section numbers --> |
||||
|
<xsl:param name="section.autolabel" select="1" /> |
||||
|
|
||||
|
<!-- No image scaling --> |
||||
|
<xsl:param name="ignore.image.scaling" select="1" /> |
||||
|
|
||||
|
<!-- Display admonition icons (warning, note, tip, etc.) --> |
||||
|
<xsl:param name="admon.graphics" select="1" /> |
||||
|
<xsl:param name="admon.graphics.extension" select="'.png'" /> |
||||
|
<xsl:param name="admon.graphics.path">std-img/</xsl:param> |
||||
|
|
||||
|
<!-- Disable text label in admonitions --> |
||||
|
<!-- <xsl:param name="admon.textlabel" select="0" /> --> |
||||
|
|
||||
|
<!-- Callout configuration --> |
||||
|
<xsl:param name="callout.graphics" select="1" /> |
||||
|
<xsl:param name="callout.graphics.extension" select="'.gif'" /> |
||||
|
<xsl:param name="callout.graphics.path">std-img/callouts/</xsl:param> |
||||
|
|
||||
|
<!-- Images path --> |
||||
|
<xsl:param name="img.src.path">img/</xsl:param> |
||||
|
|
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,36 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="xsl-stylesheets/xhtml/docbook.xsl" /> |
||||
|
<!-- <xsl:include href="./titlepage.xsl" /> --> |
||||
|
|
||||
|
<!-- Don't forget the quotes inside the double quotes --> |
||||
|
<xsl:param name="base.dir" select="'./onepage-xhtml/'" /> |
||||
|
|
||||
|
<!-- Print section numbers --> |
||||
|
<xsl:param name="section.autolabel" select="1" /> |
||||
|
|
||||
|
<!-- No image scaling --> |
||||
|
<xsl:param name="ignore.image.scaling" select="1" /> |
||||
|
|
||||
|
<!-- Display admonition icons (warning, note, tip, etc.) --> |
||||
|
<xsl:param name="admon.graphics" select="1" /> |
||||
|
<xsl:param name="admon.graphics.extension" select="'.png'" /> |
||||
|
<xsl:param name="admon.graphics.path">std-img/</xsl:param> |
||||
|
|
||||
|
<!-- Disable text label in admonitions --> |
||||
|
<!-- <xsl:param name="admon.textlabel" select="0" /> --> |
||||
|
|
||||
|
<!-- Callout configuration --> |
||||
|
<xsl:param name="callout.graphics" select="1" /> |
||||
|
<xsl:param name="callout.graphics.extension" select="'.gif'" /> |
||||
|
<xsl:param name="callout.graphics.path">std-img/callouts/</xsl:param> |
||||
|
|
||||
|
<!-- Images path --> |
||||
|
<xsl:param name="img.src.path">img/</xsl:param> |
||||
|
|
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,16 @@ |
|||||
|
#!/bin/sh |
||||
|
|
||||
|
FOP_PREFIX="$HOME/bin/fop" |
||||
|
CLASSPATH="$FOP_PREFIX/build/fop.jar:$FOP_PREFIX/lib/xercesImpl.jar:$FOP_PREFIX/lib/xalan.jar" |
||||
|
CLASSPATH="$CLASSPATH:$FOP_PREFIX/lib/avalon-framework.jar:$FOP_PREFIX/lib/xml-apis.jar" |
||||
|
CLASSPATH="$CLASSPATH:$FOP_PREFIX/lib/commons-logging-1.0.4.jar:$FOP_PREFIX/lib/commons-io-1.1.jar" |
||||
|
CLASS="org.apache.fop.fonts.apps.TTFReader" |
||||
|
ENC="ansi" |
||||
|
|
||||
|
if [ $# -ne 1 ]; then |
||||
|
echo "Usage: $0 <ttf file>" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
java -cp "$CLASSPATH" "$CLASS" -enc "$ENC" "$1" "$(echo "$1" |sed 's/\.[Tt][Tt][Ff]//').xml" |
||||
|
|
||||
@ -0,0 +1,149 @@ |
|||||
|
<?xml version="1.0"?> |
||||
|
|
||||
|
<!-- NOTE: This is the version of the configuration --> |
||||
|
<fop version="1.0"> |
||||
|
|
||||
|
<!-- Base URL for resolving relative URLs --> |
||||
|
<base>.</base> |
||||
|
|
||||
|
<!-- Font Base URL --> |
||||
|
<font-base>../globals/fonts</font-base> |
||||
|
|
||||
|
<!-- Source resolution in dpi (dots/pixels per inch) for determining the size of pixels in SVG and bitmap images, default: 72dpi --> |
||||
|
<source-resolution>300</source-resolution> |
||||
|
<!-- Target resolution in dpi (dots/pixels per inch) for specifying the target resolution for generated bitmaps, default: 72dpi --> |
||||
|
<target-resolution>300</target-resolution> |
||||
|
|
||||
|
<!-- Default page-height and page-width, in case |
||||
|
value is specified as auto --> |
||||
|
<!-- <default-page-settings height="297mm" width="210mm"/> --> |
||||
|
|
||||
|
<!-- Information for specific renderers --> |
||||
|
<!-- Uses renderer mime type for renderers --> |
||||
|
<renderers> |
||||
|
<renderer mime="application/pdf"> |
||||
|
<filterList> |
||||
|
<!-- provides compression using zlib flate (default is on) --> |
||||
|
<value>flate</value> |
||||
|
|
||||
|
<!-- encodes binary data into printable ascii characters (default off) |
||||
|
This provides about a 4:5 expansion of data size --> |
||||
|
<!-- <value>ascii-85</value> --> |
||||
|
|
||||
|
<!-- encodes binary data with hex representation (default off) |
||||
|
This filter is not recommended as it doubles the data size --> |
||||
|
<!-- <value>ascii-hex</value> --> |
||||
|
</filterList> |
||||
|
|
||||
|
<fonts> |
||||
|
<!-- embedded fonts --> |
||||
|
<!-- |
||||
|
This information must exactly match the font specified |
||||
|
in the fo file. Otherwise it will use a default font. |
||||
|
|
||||
|
For example, |
||||
|
<fo:inline font-family="Arial" font-weight="bold" font-style="normal"> |
||||
|
Arial-normal-normal font |
||||
|
</fo:inline> |
||||
|
for the font triplet specified by: |
||||
|
<font-triplet name="Arial" style="normal" weight="bold"/> |
||||
|
|
||||
|
If you do not want to embed the font in the pdf document |
||||
|
then do not include the "embed-url" attribute. |
||||
|
The font will be needed where the document is viewed |
||||
|
for it to be displayed properly. |
||||
|
|
||||
|
possible styles: normal | italic | oblique | backslant |
||||
|
possible weights: normal | bold | 100 | 200 | 300 | 400 |
||||
|
| 500 | 600 | 700 | 800 | 900 |
||||
|
(normal = 400, bold = 700) |
||||
|
--> |
||||
|
|
||||
|
<!-- |
||||
|
<font metrics-url="arial.xml" kerning="yes" embed-url="arial.ttf"> |
||||
|
<font-triplet name="Arial" style="normal" weight="normal"/> |
||||
|
<font-triplet name="ArialMT" style="normal" weight="normal"/> |
||||
|
</font> |
||||
|
<font metrics-url="arialb.xml" kerning="yes" embed-url="arialb.ttf"> |
||||
|
<font-triplet name="Arial" style="normal" weight="bold"/> |
||||
|
<font-triplet name="ArialMT" style="normal" weight="bold"/> |
||||
|
</font> |
||||
|
--> |
||||
|
|
||||
|
<!-- <font metrics-url="cour.xml" kerning="yes" embed-url="cour.ttf"> |
||||
|
<font-triplet name="CourierNew" style="normal" weight="normal"/> |
||||
|
</font> |
||||
|
<font metrics-url="courbd.xml" kerning="yes" embed-url="courbd.ttf"> |
||||
|
<font-triplet name="CourierNew" style="normal" weight="bold"/> |
||||
|
</font> |
||||
|
<font metrics-url="courbi.xml" kerning="yes" embed-url="courbi.ttf"> |
||||
|
<font-triplet name="CourierNew" style="italic" weight="bold"/> |
||||
|
</font> |
||||
|
<font metrics-url="couri.xml" kerning="yes" embed-url="couri.ttf"> |
||||
|
<font-triplet name="CourierNew" style="italic" weight="normal"/> |
||||
|
</font> --> |
||||
|
<font metrics-url="georgia.xml" kerning="yes" embed-url="georgia.ttf"> |
||||
|
<font-triplet name="Georgia" style="normal" weight="normal"/> |
||||
|
</font> |
||||
|
<font metrics-url="georgiab.xml" kerning="yes" embed-url="georgiab.ttf"> |
||||
|
<font-triplet name="Georgia" style="normal" weight="bold"/> |
||||
|
</font> |
||||
|
<font metrics-url="georgiaz.xml" kerning="yes" embed-url="georgiaz.ttf"> |
||||
|
<font-triplet name="Georgia" style="italic" weight="bold"/> |
||||
|
</font> |
||||
|
<font metrics-url="georgiai.xml" kerning="yes" embed-url="georgiai.ttf"> |
||||
|
<font-triplet name="Georgia" style="italic" weight="normal"/> |
||||
|
</font> |
||||
|
|
||||
|
</fonts> |
||||
|
|
||||
|
<!-- This option lets you specify additional options on an XML handler --> |
||||
|
<!--xml-handler namespace="http://www.w3.org/2000/svg"> |
||||
|
<stroke-text>false</stroke-text> |
||||
|
</xml-handler--> |
||||
|
|
||||
|
</renderer> |
||||
|
|
||||
|
<renderer mime="application/postscript"> |
||||
|
<!-- This option forces the PS renderer to rotate landscape pages --> |
||||
|
<!--auto-rotate-landscape>true</auto-rotate-landscape--> |
||||
|
|
||||
|
<!-- This option lets you specify additional options on an XML handler --> |
||||
|
<!--xml-handler namespace="http://www.w3.org/2000/svg"> |
||||
|
<stroke-text>false</stroke-text> |
||||
|
</xml-handler--> |
||||
|
</renderer> |
||||
|
|
||||
|
<renderer mime="application/vnd.hp-PCL"> |
||||
|
</renderer> |
||||
|
|
||||
|
<!-- MIF does not have a renderer |
||||
|
<renderer mime="application/vnd.mif"> |
||||
|
</renderer> |
||||
|
--> |
||||
|
|
||||
|
<renderer mime="image/svg+xml"> |
||||
|
<format type="paginated"/> |
||||
|
<link value="true"/> |
||||
|
<strokeText value="false"/> |
||||
|
</renderer> |
||||
|
|
||||
|
<renderer mime="application/awt"> |
||||
|
</renderer> |
||||
|
|
||||
|
<renderer mime="text/xml"> |
||||
|
</renderer> |
||||
|
|
||||
|
<!-- RTF does not have a renderer |
||||
|
<renderer mime="text/rtf"> |
||||
|
</renderer> |
||||
|
--> |
||||
|
|
||||
|
<renderer mime="text/plain"> |
||||
|
<pageSize columns="80"/> |
||||
|
</renderer> |
||||
|
|
||||
|
</renderers> |
||||
|
|
||||
|
</fop> |
||||
|
|
||||
@ -0,0 +1 @@ |
|||||
|
../globals/Makefile |
||||
@ -0,0 +1 @@ |
|||||
|
../globals/docbook |
||||
@ -0,0 +1 @@ |
|||||
|
../globals/fop.xconf |
||||
@ -0,0 +1,35 @@ |
|||||
|
<?xml version='1.0' encoding='utf-8' ?> |
||||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" |
||||
|
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> |
||||
|
<book> |
||||
|
<!-- Metadata --> |
||||
|
<bookinfo> |
||||
|
<title>Title</title> |
||||
|
<author> |
||||
|
<firstname>John</firstname><surname>SMITH</surname> |
||||
|
<affiliation> |
||||
|
<orgname>ACME corp.</orgname> |
||||
|
<orgdiv>IT dept.</orgdiv> |
||||
|
</affiliation> |
||||
|
<email>john@acme.com</email> |
||||
|
</author> |
||||
|
<copyright> |
||||
|
<year>2000</year> |
||||
|
<holder>ACME corp.</holder> |
||||
|
</copyright> |
||||
|
</bookinfo> |
||||
|
|
||||
|
<preface> |
||||
|
<title>Foreword</title> |
||||
|
<para></para> |
||||
|
</preface> |
||||
|
|
||||
|
<chapter> |
||||
|
<title>My First Document with Docbook</title> |
||||
|
<sect1> |
||||
|
<title>What is docbook ?</title> |
||||
|
<para>A paragraph</para> |
||||
|
</sect1> |
||||
|
</chapter> |
||||
|
</book> |
||||
|
|
||||
@ -0,0 +1,11 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="../../globals/common-fo.xsl" /> |
||||
|
<!-- <xsl:include href="./titlepage.xsl" /> --> |
||||
|
|
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="../../globals/common-html-chunked.xsl" /> |
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version='1.0'?> |
||||
|
<xsl:stylesheet |
||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
|
xmlns:fo="http://www.w3.org/1999/XSL/Format" |
||||
|
version="1.0"> |
||||
|
|
||||
|
<xsl:import href="../../globals/common-xhtml-chunked.xsl" /> |
||||
|
</xsl:stylesheet> |
||||
|
|
||||
@ -0,0 +1,22 @@ |
|||||
|
SUBDIRS := $(wildcard doc-*) |
||||
|
|
||||
|
help: |
||||
|
@echo "Usages: make <target>" |
||||
|
@echo " all : build all documentations" |
||||
|
@echo " new-doc : create a new documentation from a template" |
||||
|
@echo " clean : clean all documentations" |
||||
|
|
||||
|
all: $(SUBDIRS) |
||||
|
|
||||
|
$(SUBDIRS): |
||||
|
make -C $@ all |
||||
|
|
||||
|
clean: |
||||
|
@for i in $(SUBDIRS); do make -C "$$i" clean || exit 1; done |
||||
|
|
||||
|
new-doc: template |
||||
|
@echo "Enter the name of your documentation (no space, special chars, etc.): " |
||||
|
@echo -n "name> " ; read name ; echo "Creating doc-$$name..." ; cp -r template "doc-$$name" |
||||
|
|
||||
|
.PHONY: $(SUBDIRS) new-doc all help clean |
||||
|
|
||||
@ -0,0 +1 @@ |
|||||
|
../globals/Makefile |
||||
@ -0,0 +1 @@ |
|||||
|
../globals/docbook |
||||
@ -0,0 +1 @@ |
|||||
|
../globals/fop.xconf |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/AEP-Fonct.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/AEP-IDXPKI.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/LRA_routage_aggregation.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/IDX-Enroll.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/PKI_MS-Fonct.png |
||||
@ -0,0 +1 @@ |
|||||
|
../../../Schemas/autoenroll.png |
||||
|
After Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 257 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 6.4 KiB |