Récemment, j'ai travaillé avec la B-I-T GmbH Informations et processus de Hanovre a travaillé à la réalisation de l'échange électronique de données avec les caisses d'assurance maladie légales et l'assurance pension à partir d'une seule application.
Dans ce cas, on utilise une combinaison de transmission de données authentifiées de messages à la fois signés et cryptés. Dans tous ces cas, les technologies PKI sont utilisées.
Le format de message utilisé est ici documenté.
Déroulement schématique de la communication
Le message en clair est une structure de type XML (appelée eXTra), qui n'est pas décrite en détail ici. Cet article se concentre uniquement sur les opérations PKI nécessaires.
Voir aussi à ce sujet l'article "Bases de la cryptographie„ .
Message signé
Le message en texte clair, disponible au format eXTra Syntaxe du message cryptographique (CMS, également connu sous le nom de PKCS#7) SignedData Datenstruktur eingebettet. Diese Nachricht wird mit dem privaten Schlüssel des Absenders signiert, um die Integrität und Nichtabstreitbarkeit (engl. Non-repudiation) der Nachricht zu gewährleisten.
Message chiffré signé
Le message signé est ensuite enregistré dans une CMS (PKCS#7). EnvelopedData La structure de données est intégrée et cryptée avec les clés publiques des destinataires (une ou plusieurs). Ainsi, la confidentialité du message est désormais également garantie.
Schématiquement, le message se présente donc à peu près comme suit :

Transmission de données du message signé crypté
Le message chiffré et signé est maintenant envoyé ou récupéré par l'un des moyens suivants :
- Via un service web dans le cas de l'assurance pension.
- Par e-mail dans le cas des caisses d'assurance maladie obligatoires.
Par la suite, nous ne nous intéresserons qu'à l'assurance pension, mais les processus sont très similaires dans le cas de l'assurance maladie obligatoire.
L'assurance pension utilise les services web suivants :
| Environs | Adresse |
|---|---|
| Environnement productif | https://itsg.eservice-drv.de/SPoC/ExtraService |
| Environnement de test | https://itsg.eservicet-drv.de/SPoC/ExtraService |
Schématiquement, les opérations suivantes doivent donc être effectuées sur l'ensemble de la chaîne de communication :

Mise en œuvre
Notre première approche a consisté à écrire une application en ligne de commande dans C#, qui se chargerait de la création/vérification des signatures et du chiffrement/déchiffrement des messages. Cela aurait l'avantage de pouvoir accéder à l'API des certificats Windows et donc de pouvoir sauvegarder dans le backend, par exemple, les certificats utilisés sur une carte à puce ou un module Trusted Platform.
C# (et PowerShell) n'est malheureusement pas possible, car le nombre d'utilisateurs requis est trop élevé. CmsSigner En effet, le schéma de padding ne peut pas être imposé pour les classes de 6e et de 3e et le CCN RSASSA-PSS (PKCS#1 version 2.1).
Les outils de choix sont donc OpenSSL et cURL. Ici aussi, il est possible d'utiliser une carte à puce dans le backend, par exemple via l'interface PKCS#11. Pour des raisons de simplicité, nous allons toutefois décrire ci-après la procédure avec de simples fichiers de clés.
Conversion dans les formats de fichiers appropriés
Tout d'abord, les certificats doivent être disponibles dans le format approprié.
Les hypothèses suivantes sont retenues :
- Le certificat utilisé pour la signature et le décryptage est au format DER (PEM) codé en BASE64.
- La clé privée du certificat est également disponible sans mot de passe au format DER (PEM) codé en BASE64.
- Il existe un fichier qui contient tous les certificats d'autorité de certification impliqués, également au format DER (PEM) codé en BASE64.
Signer un message
La commande suivante permet d'afficher le fichier out_msg_plain.txt et le message signé qui en résulte est enregistré dans le fichier out_msg_signed.bin est enregistré. Pour signer le message, le certificat de l'expéditeur (expéditeur.pem), à laquelle est associée la clé privée (expéditeur.key) doit être disponible.
openssl ^ cms ^ -sign ^ -binary ^ -in out_msg_plain.txt ^ -text ^ -nodetach -outform DER ^ -signer absender.pem ^ -certfile CAChain.pem ^ -inkey absender.key ^ -out out_msg_signed.bin ^ -keyopt rsa_padding_mode:pss ^ -nosmimecap
Pour améliorer la lisibilité de la commande, des retours à la ligne de la ligne de commande Windows ont été inscrits.
Les arguments utilisés ont la signification suivante :
| Argument | Description |
|---|---|
| cms | OpenSSL doit générer une structure de données CMS (PKCS#7). |
| -sign | Il s'agit d'une structure de données SignedData. |
| -binaire | Les données lues doivent être traitées en format binaire. |
| -in out_msg_plain.txt | Le message indiqué doit être lu. |
| -texte | Le message émis est accompagné d'en-têtes pour le message MIME. |
| -nodetach | Les données signées ne doivent pas être encodées dans le type MIME multipart/signed. |
| -outform DER | La structure de données CMS générée doit être éditée en codage DER (binaire). |
| -signer absender.pem | La structure de données CMS générée doit être signée avec l'identité contenue dans le certificat indiqué. |
| -certfile CAChain.pem | Contient la chaîne de certificats des certificats utilisés afin de pouvoir établir le statut de confiance par rapport à ceux-ci. |
| -inkey expéditeur.key | Référence à la clé privée du certificat de l'expéditeur. |
| -out out_msg_signed.bin | La structure de données CMS générée doit être éditée dans le fichier indiqué. |
| -keyopt rsa_padding_mode:pss | Le mode de padding doit être le mode RSASSA-PSS exigé par l'ACC. |
| -nosmimecap | Par défaut, OpenSSL attache une Extension des capacités S/MIME à la structure des données (puisqu'un mail signé a une structure identique), ce comportement est empêché par cette option. |
Crypter le message
Il convient de mentionner ici que nous sommes bien entendu à la fois expéditeurs et destinataires de messages dans l'exploitation réelle. Dans ce cas, nous utilisons le même certificat et la même clé privée pour l'envoi et la réception des messages. Par la suite, nous utiliserons toutefois le nom de fichier "empfaenger.pem", car nous souhaitons par exemple simuler l'envoi et la réception du même message dans un environnement de développement ou de test.
La commande suivante permet d'afficher le fichier out_msg_signed.bin et le message signé qui en résulte est enregistré dans le fichier out_msg_encrypted.bin gespeichert. Zum Verschlüsseln wird das Zertifikat des Empfängers (receveur.pem) sans clé privée.
openssl ^ cms ^ -encrypt ^ -binary ^ -in out_msg_signed.bin ^ -aes-256-cbc ^ -out msg_encrypted.bin ^ -outform DER ^ -recip empfaenger.pem ^ -keyopt rsa_padding_mode:oaep ^ -keyopt rsa_oaep_md:sha256
Pour améliorer la lisibilité de la commande, des retours à la ligne de la ligne de commande Windows ont été inscrits.
Les arguments utilisés ont la signification suivante :
| Argument | Description |
|---|---|
| cms | OpenSSL doit générer une structure de données CMS (PKCS#7). |
| -encrypt | Il s'agit d'une structure de données cryptée EnvelopedData. |
| -binaire | Les données lues doivent être traitées en format binaire. |
| -in out_msg_signed.bin | Le message indiqué doit être lu. |
| -aes-256-cbc | Pour le cryptage, il est prévu d'utiliser l'algorithme AES avec une longueur de clé de 256 bits. |
| -out msg_encrypted.bin | La structure de données CMS générée doit être éditée dans le fichier indiqué. |
| -outform DER | La structure de données CMS générée doit être éditée en codage DER (binaire). |
| -recip récepteur.pem | Indique le certificat du destinataire du message. La clé publique correspondante permet de crypter le message. Ce paramètre peut être indiqué plusieurs fois si le message doit être envoyé à plusieurs destinataires. |
| -keyopt rsa_padding_mode:oaep | La description d'interface de l'ACS exige que le mode de padding OAEP-AES soit utilisé. |
| -keyopt rsa_oaep_md:sha256 | La description de l'interface de l'ACC exige que l'algorithme de hachage SHA-256 soit utilisé. |
Veuillez noter que : Si l'expéditeur ne s'inscrit pas lui-même dans la liste des destinataires, il ne sera pas en mesure de décrypter le message généré. En règle générale, il n'y a pas lieu de le faire, mais cela peut facilement prêter à confusion.
Décrypter le message
La commande suivante permet d'afficher le fichier in_msg_encrypted.bin et le message signé qu'il contient est enregistré dans le fichier in_msg_signed.bin est enregistré. Pour le décryptage, le certificat du destinataire (receveur.pem) avec sa clé privée (empfaenger.key) nécessaire
openssl ^ cms ^ -decrypt ^ -inform DER ^ -in in_msg_encrypted.bin ^ -out in_msg_signed.bin ^ -outform DER ^ -recip empfaenger.pem ^ -inkey empfaenger.key
Pour améliorer la lisibilité de la commande, des retours à la ligne de la ligne de commande Windows ont été inscrits.
Les arguments utilisés ont la signification suivante :
| Argument | Description |
|---|---|
| cms | OpenSSL doit traiter une structure de données CMS (PKCS#7). |
| -decrypt | Il s'agit d'une structure de données EnvelopedData qui doit être décryptée. |
| -inform DER | La structure de données CMS doit être lue en codage DER (binaire). |
| -in msg_encrypted.bin | Le nom de fichier du message à traiter. |
| -out in_msg_signed.bin | Le nom de fichier du message à éditer. |
| -outform DER | Le message décrypté doit être émis en code DER (binaire). |
| -recip récepteur.pem | La structure de données CMS doit être décryptée avec l'identité contenue dans le certificat indiqué. |
| -inkey récepteur.key | Référence à la clé privée du certificat du destinataire. |
Vérifier la signature et éditer le texte en clair
La commande suivante permet de modifier la signature des données contenues dans le fichier in_msg_signed.bin et le message en texte clair est enregistré dans le fichier in_msg_plain.txt enregistré.
openssl ^ cms ^ -verify ^ -inform DER ^ -CAfile CAChain.pem ^ -in in_msg_signed.bin ^ -out in_msg_plain.txt
Pour améliorer la lisibilité de la commande, des retours à la ligne de la ligne de commande Windows ont été inscrits.
Les arguments utilisés ont la signification suivante :
| Argument | Description |
|---|---|
| cms | OpenSSL doit traiter une structure de données CMS (PKCS#7). |
| -verify | Il s'agit d'une structure de données SignedData qui doit être vérifiée. |
| -inform DER | La structure de données CMS doit être lue en codage DER (binaire). |
| -CAfile CAChain.pem | Contient la chaîne de certificats des certificats utilisés afin de pouvoir établir le statut de confiance par rapport à ceux-ci. |
| -in in_msg_signed.bin | Le fichier dans lequel est enregistré le message CMS à vérifier. |
| -out in_msg_plain.txt | Le fichier dans lequel le message en clair doit être enregistré. |
Transmission de données
Transmission des données au service web et authentification via un certificat.
Ici aussi, pour des raisons de compréhension, deux certificats sont mentionnés dans les exemples (expéditeur.pem et destinataire.pem) ; en fonctionnement réel, il s'agit bien entendu du même certificat dans les deux cas.
cURL est disponible dans les versions actuelles de Windows 10. partie intégrante du système d'exploitation et ne doit pas être installé séparément.
Récupération des données
Les données utiles signées et cryptées sont envoyées en tant qu'objet MTOM avec le message SOAP.
curl ^ -k https://itsg.eservicet-drv.de/SPoC/ExtraService ^ --cert empfaenger.pem ^ --key empfaenger.key ^ --cacert CAChain.pem ^ --tlsv1.2 ^ -d @nachricht.xml ^ -H "Content-Type: application/soap+xml" ^ -o Outfile.txt
Pour améliorer la lisibilité de la commande, des retours à la ligne de la ligne de commande Windows ont été inscrits.
Les arguments utilisés ont la signification suivante :
| Argument | Description |
|---|---|
| -k https://itsg.eservicet-drv.de/SPoC/ExtraService | L'adresse du service web. |
| -cert destinataire.pem | L'authentification vis-à-vis du service web doit se faire avec le certificat indiqué. |
| -key récepteur.key | Référence à la clé privée du certificat d'authentification. |
| -cacert CAChain.pem | Contient la chaîne de certificats des certificats utilisés afin de pouvoir établir le statut de confiance par rapport à ceux-ci. |
| -tlsv1.2 | Seule la version 1.2 de Transport Layer Security (TLS) doit être utilisée. |
| -d @nachricht.xml | Die MTOM-Nachricht, welche die verschlüsselten und signierten Nutzdaten enthält. |
| -H „Content-Type: application/soap+xml“ | Gibt über HTTP-Header an, welcher Art Daten übertragen werden. |
| -o Outfile.txt | Die Ausgabe des Webservice wird in die angegebene Datei umgeleitet. |
Versenden von Daten
Les données utiles signées et cryptées sont envoyées en tant qu'objet MTOM avec le message SOAP.
Pour améliorer la lisibilité de la commande, des retours à la ligne de la ligne de commande Windows ont été inscrits.
curl ^ -k https://itsg.eservicet-drv.de/SPoC/ExtraService ^ -X POST ^ --cert absender.pem ^ --key absender.key ^ --cacert CAChain.pem ^ --tlsv1.2 ^ --data-binary @nachricht.xml ^ -H "content-type: multipart/related; boundary=MIME-Multipart-Boundary;Content-ID=RootPart; charset=iso-8859-1;" ^ -o Outfile.txt
Les arguments utilisés ont la signification suivante :
| Argument | Description |
|---|---|
| -k https://itsg.eservicet-drv.de/SPoC/ExtraService | L'adresse du service web. |
| -X POST | Als HTTP-Methode soll POST verwendet werden. |
| –cert absender.pem | L'authentification vis-à-vis du service web doit se faire avec le certificat indiqué. |
| –key absender.key | Référence à la clé privée du certificat d'authentification. |
| -cacert CAChain.pem | Contient la chaîne de certificats des certificats utilisés afin de pouvoir établir le statut de confiance par rapport à ceux-ci. |
| -tlsv1.2 | Seule la version 1.2 de Transport Layer Security (TLS) doit être utilisée. |
| –data-binary @nachricht.xml | Die MTOM-Nachricht, welche die verschlüsselten und signierten Nutzdaten enthält. |
| -H „content-type: multipart/related; boundary=MIME-Multipart-Boundary;Content-ID=RootPart; charset=iso-8859-1;“ | Gibt über HTTP-Header an, welcher Art Daten übertragen werden. |
| -o Outfile.txt | Die Ausgabe des Webservice wird in die angegebene Datei umgeleitet. |
Einige Tipps für die Fehlersuche
Analyse einer Nachricht
Zwecks Analyse und Fehlersuche ist es sehr hilfreich, das Zertifikat im Windows-Zertifikatspeicher samt privatem Schlüssel vorzuhalten.
Die Nachricht kann anschließend mit folgendem Befehl ausgewertet werden:
certutil -dump {Datei}
Der Inhalt einer verschlüsselten CMS-Nachricht kann direkt mit folgendem Befehl entpackt werden:
certutil -strip {Datei}
Liens complémentaires :
Sources externes
- Security Schnittstelle (SECON) (Elektronischer Datenaustausch in der gesetzlichen Krankenversicherung)
- Schnittstellenspezifikation zum XML-basierenden, elektronischen Datenaustausch mit der Rentenversicherung im Verfahren Reha§301 (Deutsche Rentenversicherung Bund)
- Data Exchange in the German Health Service with CryptoSys PKI (D.I. Management Services Pty Limited)
- tinyHeb, Eine Open Source Abrechnungssoftware für Hebammen
- RFC 5652 – Cryptographic Message Syntax (CMS) (Internet Engineering Task Force)