Code source wiki de Services web SOAP et certificats en lien avec une connexion sécurisée (SSL)
Modifié par Jean-Claude ALLETRU le 2024/05/02 09:41
Afficher les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
| 1 | Mise en place d'un transport sécurisé (SSL) pour les services web Adélia Studio. | ||
| 2 | |||
| 3 | La configuration de la consommation d'un service web avec Adélia Studio s'appuie sur le fichier cfgWebServices.xml. | ||
| 4 | Dans un contexte d'exécution C/Windows, il est possible de renseigner le nom d'un fichier certificat au format .pem. | ||
| 5 | Dans un contexte d'exécution Java, il est possible de renseigner le nom d'un fichier (keystore) au format .jks ou également (à partir d'Adélia Studio V12 PTF04) un fichier .pem. | ||
| 6 | |||
| 7 | Note : Depuis la version d'Adélia Studio 12 PTF04, la connexion SSL est établie automatiquement en se basant sur le fichier %adeliws%/certifs/cacert.pem pour un contexte C/Windows et | ||
| 8 | sur le fichier %java_home%/lib/jre/security/cacerts pour un contexte java. | ||
| 9 | Le fichier %adeliws%/certifs/cacert.pem (C/windows) peut - si nécessaire - être mis à jour à partir du lien suivant : [[https://curl.haxx.se/docs/caextract.html>>url:https://curl.haxx.se/docs/caextract.html]] | ||
| 10 | |||
| 11 | |||
| 12 | Si la connexion échoue, il est possible d'activer le mode mode ServerCertAuto : <Transport><SSLCertificate><ServerCertAuto>true</ServerCertAuto></SSLCertificate></Transport> | ||
| 13 | pour forcer la récupération d'un certificat depuis le serveur (utilisation dans le cas d'un certificat auto-signé). | ||
| 14 | |||
| 15 | ((( | ||
| 16 | == Guide détaillé pour la création de fichiers certificats spécifiques == | ||
| 17 | ))) | ||
| 18 | |||
| 19 | **(% style="color: rgb(0,51,102);" %)//Authentification serveur (SSL 1-way//(%%)) | ||
| 20 | **Le client doit s'assurer que le serveur est bien celui qu'il prétend être. | ||
| 21 | Pour cela le serveur dispose d'un certificat signé par un CA assurant son authenticité (Pour une plate-forme de tests, il est possible d'utiliser un certificat auto-signé. Les exemples qui suivent utilisent ce type de certificat).** | ||
| 22 | ** | ||
| 23 | Configuration du serveur (tomcat) / mise en place d'une connexion sécurisée** | ||
| 24 | * Création d'un certificat auto-signé (self signed) + clé privée ~=> keystore | ||
| 25 | |||
| 26 | |||
| 27 | |||
| 28 | {{code language="none"}} | ||
| 29 | "%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA | ||
| 30 | {{/code}} | ||
| 31 | |||
| 32 | |||
| 33 | Création par défaut du keystore //.keystore// (si inexistant) dans le répertoire %userprofile% au format JKS (JavaKeyStore) (password par défaut "changeit") | ||
| 34 | |||
| 35 | |||
| 36 | |||
| 37 | * Déclaration d'un connector https dans le fichier //server.xml// (utilisant les valeurs par défaut du keystore, keystoreFile~="%userprofile%/.keystore", keystorePass~="changeit", keystoreType~="JKS") : | ||
| 38 | |||
| 39 | |||
| 40 | |||
| 41 | {{code language="none"}} | ||
| 42 | <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" | ||
| 43 | minSpareThreads="25" maxSpareThreads="75" enableLookups="false" | ||
| 44 | disableUploadTimeout="true" acceptCount="20" scheme="https" | ||
| 45 | secure="true" clientAuth="false" sslProtocol="TLS"/> | ||
| 46 | {{/code}} | ||
| 47 | |||
| 48 | |||
| 49 | ou | ||
| 50 | * Déclaration d'un connector https dans le fichier //server.xml// faisant référence à un keystore particulier "c:\keystore\.keystore": | ||
| 51 | |||
| 52 | |||
| 53 | |||
| 54 | {{code language="none"}} | ||
| 55 | <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" | ||
| 56 | minSpareThreads="25" maxSpareThreads="75" enableLookups="false" | ||
| 57 | disableUploadTimeout="true" acceptCount="20" scheme="https" | ||
| 58 | secure="true" clientAuth="false" sslProtocol="TLS" | ||
| 59 | keystoreFile="c:/keystore/.keystore" keystorePass="pwd"/> | ||
| 60 | {{/code}} | ||
| 61 | |||
| 62 | |||
| 63 | |||
| 64 | |||
| 65 | * Configuration du web.xml de l'application web hébergeant le service web ~=> toutes les ressources sont sécurisées : | ||
| 66 | |||
| 67 | |||
| 68 | |||
| 69 | {{code language="none"}} | ||
| 70 | <security-constraint> | ||
| 71 | <web-resource-collection> | ||
| 72 | <web-resource-name>Wildcard means whole app requires authentication</web-resource-name> | ||
| 73 | <url-pattern>/*</url-pattern> | ||
| 74 | </web-resource-collection> | ||
| 75 | <user-data-constraint> | ||
| 76 | <transport-guarantee>CONFIDENTIAL</transport-guarantee> | ||
| 77 | </user-data-constraint> | ||
| 78 | </security-constraint> | ||
| 79 | {{/code}} | ||
| 80 | |||
| 81 | |||
| 82 | |||
| 83 | |||
| 84 | |||
| 85 | **Rappel** : Le fichier de configuration Axis2.xml se trouvant dans l'application web hôte doit déclarer un <transportSender> et un <transportReceiver> pour le protocole https. | ||
| 86 | |||
| 87 | |||
| 88 | ******Consommation d'un service avec la connexion sécurisée | ||
| 89 | Plate-forme C/Windows** | ||
| 90 | * Récupération du certificat (auto-signé) du serveur pour valider la connexion avec le serveur (handshake SSL) | ||
| 91 | |||
| 92 | |||
| 93 | Pour que le client accepte/valide le certificat (self-signed) du serveur, le client doit passer à ce dernier ce même certificat. Il faut récupérer ce certificat dans un format PEM (texte encodé en base64) et non au format JKS (format binaire standard java). | ||
| 94 | Il est possible de récupérer ce certificat depuis le client à l'aide de la commande //openssl// suivante : | ||
| 95 | |||
| 96 | |||
| 97 | {{code language="none"}} | ||
| 98 | openssl s_client -connect serveur:port > svca.pem | ||
| 99 | {{/code}} | ||
| 100 | |||
| 101 | |||
| 102 | |||
| 103 | |||
| 104 | |||
| 105 | Il faut alors éditer le fichier Cerfile.pem et conserver uniquement la partie entre les bornes -----BEGIN CERTIFICATE----- et -----END CERTIFICATE----- | ||
| 106 | |||
| 107 | Note : les bornes doivent figurer dans le fichier. | ||
| 108 | |||
| 109 | |||
| 110 | On peut alors tester la validité du certificat avec la commande suivante : | ||
| 111 | |||
| 112 | |||
| 113 | {{code language="none"}} | ||
| 114 | Openssl s_client -connect serveur:port –CAfile svca.pem | ||
| 115 | {{/code}} | ||
| 116 | |||
| 117 | |||
| 118 | La commande doit se terminer par ~=> Verify return code: 0 (ok) | ||
| 119 | |||
| 120 | |||
| 121 | |||
| 122 | * Configuration : utilisation du certificat pour invoquer le service web | ||
| 123 | |||
| 124 | |||
| 125 | Pour utiliser le certificat lors de l'invocation du service, il faut préciser le nom du fichier dans l'élément <server_cert> du fichier //cfgWebServices.xml//. | ||
| 126 | |||
| 127 | Exemple : | ||
| 128 | |||
| 129 | |||
| 130 | {{code language="none"}} | ||
| 131 | <Service> | ||
| 132 | <AdeliaName>AX2_DOL</AdeliaName> | ||
| 133 | <Epr>https://vmwas7:8443/axis2/services/AX2_DOL</Epr> | ||
| 134 | <Transport> | ||
| 135 | <SSLCertificate> | ||
| 136 | <ServerCertFile>c:\certifs\svca.pem</ServerCertFile> | ||
| 137 | </SSLCertificate> | ||
| 138 | </Transport> | ||
| 139 | </Service> | ||
| 140 | {{/code}} | ||
| 141 | |||
| 142 | |||
| 143 | |||
| 144 | |||
| 145 | |||
| 146 | Rappel : Le fichier de configuration Axis2.xml présent sur le client (%adeliws%/axis2) doit déclarer un <transportSender> et <transportReceiver> pour le protocole https. | ||
| 147 | |||
| 148 | **Plate-forme Java | ||
| 149 | ** | ||
| 150 | |||
| 151 | Pour que le client accepte/valide le certificat (self-signed) du serveur, le client doit passer à ce dernier ce même certificat. Il faut récupérer ce certificat dans un format JKS (exporté depuis le keystore du serveur) et l'ajouter dans le keystore du poste client. | ||
| 152 | * Récupération du certificat (auto-signé) du serveur pour valider la connexion avec le serveur (handshake SSL). | ||
| 153 | |||
| 154 | |||
| 155 | |||
| 156 | {{code language="none"}} | ||
| 157 | <serveur> keytool -export -keystore c:\keystore\.keystore -alias tomcat -file tomcat.crt | ||
| 158 | {{/code}} | ||
| 159 | |||
| 160 | * Si besoin créer un keystore sur le client (si absent) : | ||
| 161 | |||
| 162 | |||
| 163 | |||
| 164 | {{code language="none"}} | ||
| 165 | <client> keytool -genkey -alias salias -keyalg RSA -keystore keystore.jks | ||
| 166 | {{/code}} | ||
| 167 | |||
| 168 | * Importer le certifcat dans le keystore client (avec un alias différent de celui utilisé pour stocker la clé privée) : | ||
| 169 | |||
| 170 | |||
| 171 | |||
| 172 | {{code language="none"}} | ||
| 173 | <client> keytool -import -alias websvc -file tomcat.crt -keystore keystore.jks | ||
| 174 | {{/code}} | ||
| 175 | |||
| 176 | * Configuration : utilisation du certificat pour invoquer le service web (configuration //cfgWebServices.xml)// | ||
| 177 | |||
| 178 | |||
| 179 | Exemple : | ||
| 180 | |||
| 181 | |||
| 182 | {{code language="none"}} | ||
| 183 | <Service> | ||
| 184 | <AdeliaName>AX2_DOL</AdeliaName> | ||
| 185 | <Epr>https://vmwas7:8443/axis2/services/AX2_DOL</Epr> | ||
| 186 | <Transport> | ||
| 187 | <SSLCertificate> | ||
| 188 | <TruststoreName>c:/certifs/java/keystore.jks</TruststoreName> | ||
| 189 | <TruststorePwd> | ||
| 190 | <Encrypted>false</Encrypted> | ||
| 191 | <Password>changeit</Password> | ||
| 192 | </TruststorePwd> | ||
| 193 | </SSLCertificate> | ||
| 194 | </Transport> | ||
| 195 | </Service> | ||
| 196 | {{/code}} | ||
| 197 | |||
| 198 | |||
| 199 | **Remarques : ** | ||
| 200 | * Il est également possible de récupérer le fichier certificat (au format .pem) à l'aide de la commande openssl (Cf.Plate-forme C/Windows); de convertir le fichier .pem au format .der | ||
| 201 | |||
| 202 | |||
| 203 | {{code language="none"}} | ||
| 204 | openssl x509 -outform der -in certificate.pem -out certificate.der | ||
| 205 | {{/code}} | ||
| 206 | |||
| 207 | |||
| 208 | puis de l'enregistrer dans le keystore. | ||
| 209 | |||
| 210 | |||
| 211 | {{code language="none"}} | ||
| 212 | keytool -import -alias your-alias -keystore cacerts -file certificate.der | ||
| 213 | {{/code}} | ||
| 214 | |||
| 215 | |||
| 216 | |||
| 217 | * si le pwd est crypté pour le truststore, alors la clé de cryptage est le truststorename. | ||
| 218 | |||
| 219 | |||
| 220 | |||
| 221 | |||
| 222 | **(% style="color: rgb(0,51,102);" %)//Authentification serveur + client (SSL 2-ways)//(%%)** | ||
| 223 | |||
| 224 | Le client doit s'assurer que le serveur est bien celui qu'il prétend être. | ||
| 225 | Le serveur doit s'assurer que le client est bien celui qu'il prétend être.****En plus de la configuration présentée dans le paragraphe précédent, il faut : | ||
| 226 | |||
| 227 | **(% style="color: rgb(0,51,102);" %) (%%)****Configuration du client | ||
| 228 | |||
| 229 | Plate-forme C/Windows** | ||
| 230 | Créer un certificat (self-signed ou non) + clé privée. | ||
| 231 | Utilisation des éléments KEY_FILE (fichier PEM contenant le certificat + la clé privée ~= certificate chain file) et SSL_PASSPHRASE pour l'accès à la clé privée ( ~= passphrase demandé lors de la création de la clé privée avec l'option //–des3//). | ||
| 232 | Création du fichier (certificate chain file) via openssl : | ||
| 233 | |||
| 234 | |||
| 235 | {{code language="none"}} | ||
| 236 | openssl req -x509 -days 365 -newkey rsa:1024 -keyout hostkey.pem -nodes -out hostcert.pem | ||
| 237 | {{/code}} | ||
| 238 | |||
| 239 | |||
| 240 | **** La commande crée un certificat (self-signed) dans le fichier hostcert.pem et une clé privée dans hostkey.pem. | ||
| 241 | Il suffit de concaténer le fichier //hostkey.pem// au fichier //hostcert.pem// pour obtenir un nouveau fichier qui est le certificate chain file. | ||
| 242 | |||
| 243 | ****Remarque : la commande recherche la présence du fichier de configuration //openssl.cnf//. Pour préciser l'emplacement de ce fichier, il faut fixer la variable d'environnement OPENSSL_CONF (sans guillemet sinon cela ne fonctionne pas). | ||
| 244 | Exemple : set OPENSSL_CONF~=d:\devnet\openssl-1.0.0d\bin\openssl.cnf | ||
| 245 | |||
| 246 | ****//**Plate-forme Java**// | ||
| 247 | Créer un certificat (self-signed ou non) + clé privée dans un keystore : | ||
| 248 | |||
| 249 | |||
| 250 | {{code language="none"}} | ||
| 251 | %JAVA_HOME%\bin\keytool -genkey -alias key1 -keyalg RSA -keystore keystore.jks | ||
| 252 | {{/code}} | ||
| 253 | |||
| 254 | |||
| 255 | ****Exporter le certificat pour l'ajouter au truststore du serveur (tomcat) : | ||
| 256 | |||
| 257 | |||
| 258 | {{code language="none"}} | ||
| 259 | %JAVA_HOME%\bin\keytool -export -alias key1 -keystore keystore.jks -file svcli.cer | ||
| 260 | {{/code}} | ||
| 261 | |||
| 262 | |||
| 263 | **(% style="color: rgb(0,51,102);" %) | ||
| 264 | (%%)****Configuration du serveur (tomcat)** | ||
| 265 | * Au niveau du connecteur https, activer l'authentification cliente : clientAuth~="**true**" | ||
| 266 | |||
| 267 | |||
| 268 | {{code language="none"}} | ||
| 269 | <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" | ||
| 270 | minSpareThreads="25" maxSpareThreads="75" enableLookups="false" | ||
| 271 | disableUploadTimeout="true" acceptCount="20" scheme="https" | ||
| 272 | secure="true" clientAuth="true" sslProtocol="TLS"/> | ||
| 273 | {{/code}} | ||
| 274 | |||
| 275 | |||
| 276 | |||
| 277 | |||
| 278 | * Référence au //truststore// (<truststoreFile><truststorePass><truststoreType>) utilisé pour valider les certificats clients (et non au keystore qui lui est utilisé pour les certificats serveurs : le keystore et trustore utilisent par défaut le même format [JKS] et peuvent donc faire référence à un même fichier). | ||
| 279 | |||
| 280 | |||
| 281 | {{code language="none"}} | ||
| 282 | <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" | ||
| 283 | minSpareThreads="25" maxSpareThreads="75" enableLookups="false" | ||
| 284 | disableUploadTimeout="true" acceptCount="20" scheme="https" | ||
| 285 | secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="c:\keystore\.keystore" truststoreFile="c:\keystore\.keystore" /> | ||
| 286 | {{/code}} | ||
| 287 | |||
| 288 | |||
| 289 | |||
| 290 | |||
| 291 | * Inscrire dans le truststore de tomcat le certificat client auto-signé : | ||
| 292 | |||
| 293 | (% style="list-style-type: none;background-image: none;" %) | ||
| 294 | * ** Certificat au format PEM (créé par openssl)*** récupérer le certificat sur le client (fichier au format PEM) | ||
| 295 | Importer le certificat (PEM) dans le truststore de tomcat (avec conversion en JKS): | ||
| 296 | |||
| 297 | |||
| 298 | {{code language="none"}} | ||
| 299 | keytool -import -v -trustcacerts -alias <your alias> -file <your file>.pem -keystore <your key store>.jks - | ||
| 300 | storepass <your storepass> | ||
| 301 | {{/code}} | ||
| 302 | |||
| 303 | |||
| 304 | L'option <trustcacerts> n'est pas obligatoire. | ||
| 305 | |||
| 306 | ** Certificat au format JKS (sans conversion)*** | ||
| 307 | |||
| 308 | {{code language="none"}} | ||
| 309 | keytool -import -v -alias <your alias> -file <your file>.cer -keystore <your key store>.jks - | ||
| 310 | storepass <your storepass> | ||
| 311 | {{/code}} | ||
| 312 | |||
| 313 | |||
| 314 | |||
| 315 | |||
| 316 | |||
| 317 | |||
| 318 | |||
| 319 | Exemples : nouvelle entrée dans le trustore de tomcat pour le certificat client de PS658. | ||
| 320 | |||
| 321 | |||
| 322 | {{code language="none"}} | ||
| 323 | keytool -import -v -trustcacerts -alias PS658 -file ps658.pem -keystore c:\keystore\.keystore -storepass changeit | ||
| 324 | |||
| 325 | keytool -import -v -alias svcli -file svcli.cer -keystore c:\keystore\.keystore -storepass changeit | ||
| 326 | {{/code}} | ||
| 327 | |||
| 328 | |||
| 329 | ****Note : Problème avec les certificats auto-signés ~=> il faut importer dans le truststore de tomcat un certificat pour chaque client. La solution est donc de signer les certificats des clients par un même CA (le truststore tomcat incorporant alors uniquement le certificat de ce CA) : possibilité d'utiliser un CA gratuit du style de //startcom.org//. | ||
| 330 | |||
| 331 | ****Signer les certificats clients avec ce CA et importer le certificat racine StartCom dans le trustore tomcat ~=> ajuster la configuration du connecteur tomcat pour faire référence au truststore (emplacement, mot de passe). | ||
| 332 | ((( | ||
| 333 | == Articles connexes == | ||
| 334 | ))) | ||
| 335 | |||
| 336 | Les articles connexes apparaissent ici en fonction des étiquettes que vous avez sélectionnées. Cliquez pour modifier la macro et ajouter ou modifier des étiquettes. | ||
| 337 | |||
| 338 | {{liveData sort="doc.date:desc" source="liveTable" properties="doc.title,doc.date,doc.author" description="Recently updated" limit="5" filters="tag=service web https certificat" sourceParameters="translationPrefix=platform.index."}}{{/liveData}} | ||
| 339 |