Vérification d’une signature CPS avec OpenSSL

Comment vérifier une signature réalisée depuis Devbox-santé CPS avec OpenSSL

La CPSFacade et son proxy REST Devbox-Santé-CPS expose un endpoint permettant de signer tout document. Mais une fois signé le contenu, comment en vérifier sa signature ?

Signature avec DevBox-Santé CPS

Supposons le texte à signer suivant stocker dans le fichier message.json:

{"message": "hello DevBox-Santé"}

Pour le signer vous allez utiliser le proxy cps de la DevBox-santé sur le port 9999, en CURL ça donne : 

curl -X POST "http://localhost:9999/cps/sign/for/SIGNATURE/with/SHA256WithRSA" -H  "accept: */*" -H  "Content-Type: application/json" --data @message.json --output signature.txt

C’est tout ce qu’il vous faut pour obtenir une signature et le fichier signature.txt contiendra la signature du message.json.

Vérification avec OpenSSL

Pour cela vous devez obtenir le certificat publique de la carte CPS :

curl -X GET "http://localhost:9999/cps/certificate/SIGNATURE" -H "accept: */*"  --output certificat.cer

Le ficher certificat.cer contenant le certificat ressemble à cela :

MIIIkjCCBnqgAwIBAgIQY9r/ ... S80hoFHQ=

Pour qu’il plaise à OpenSSL, il faut lui dire ce que c’est en rajoutant les lignes dans le fichier :

-----BEGIN CERTIFICATE-----
MIIIkjCCBnqgAwIBAgIQY9r/ ... S80hoFHQ=
-----END CERTIFICATE-----

Dans le certificat nous pouvons extraire la clé publique : 

openssl x509 -in certificat.cer  -pubkey -noout > pubkey.pem

et on obtient un fichier pubkey.pem :

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjipTM5ec9lNhfI280/S
YdDIHE0DNPS+ofB24EN4QX669BkAdefzZtAwEPfR29V+zLwRj0tgjGADXVAp/1rT
F30YPumCLwO2YYXgtx3tkQTQxadb02MIJ447VJPBPr5pqsTc4dcCnLcn/QAgVvdk
bIU2vRwa7Xkve/npoHhMnSboCCfuHcoP1WNagIZuy7v8EcNiqAXf88bt9qLjMXSE
Ff7lV5OhroRlSdQ06BHJokXWtEjbrV+TLDT0HuA0XaAfGlHFL2vJnifrhZXklTmr
ZSUceRSCleTxR0PR8pITpa7yTXz84dB33q0XrCti12YLG7oruJZ064YEzDCr+SJ7
iQIDAQAB
-----END PUBLIC KEY-----

Donc maintenant nous avons le texte, une signature, et une clé publique, il ne reste plus qu’à vérifier que la signature soit conforme :

$ openssl dgst -sha256 -verify pubkey.pem -signature signature.txt message.json
Verified OK

Et voilà.