Le cas d'utilisation est le suivant :
- L'utilisateur entre sur un site web qui requiert la présentation d'un certificat.
- S'il est valide, l'utilisateur peut télécharger un PDF et le signer avec le même certificat.
- Chargement du PDF
- Le serveur valide que le PDF est signé par le même certificat que celui qui présente le site web.
Je suis bloqué à l'étape 4. J'ai réussi à obtenir la clé publique du certificat du client à partir du site web et aussi à partir du PDF, mais ce ne sont pas les mêmes. La clé publique est un SHA256 RSA de 2048 bits. De plus, j'utilise iTextSharp pour manipuler les documents PDF.
Voici mon code :
HttpRequest request = context.Request;
HttpClientCertificate cert = request.ClientCertificate;
//get public key from client certificate
string certKey = BitConverter.ToString(cert.PublicKey).Replace("-", " ")
//now gets PDF and retrieves public key
PdfReader pdfreader = new PdfReader("path_to_pdf");
AcroFields fields = pdfreader.AcroFields;
AcroFields.Item item = fields.GetFieldItem("Signature1");
List<string> names = fields.GetSignatureNames();
foreach (string name in names){
PdfDictionary dict = fields.GetSignatureDictionary(name);
PdfPKCS7 pkcs7 = fields.VerifySignature(name);
Org.BouncyCastle.X509.X509Certificate cert = pkcs7.SigningCertificate;
//get public key from PDF cert
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(cert.GetPublicKey());
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
string serializedPublic = BitConverter.ToString(serializedPublicBytes).Replace("-", " ");
}
Avec ce code, certKey et serializedPublic ne sont pas les mêmes.