Bonjour, j’écrivais un programme qui importe des clés privées à partir d’un fichier .pem
et crée un objet de clé privée pour l’utiliser plus tard. Le problème que j’ai rencontré est que certains fichiers pem
commencent par
-----BEGIN PRIVATE KEY-----
tandis que d'autres commencent par
-----BEGIN RSA PRIVATE KEY-----
grâce à ma recherche, je savais que les premiers étaient au format PKCS#8
mais je ne pouvais pas savoir à quel format appartient l’autre.
Voir https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (recherchez sur la page "BEGIN RSA PRIVATE KEY") ( lien d'archive pour la postérité, juste au cas où).
BEGIN RSA PRIVATE KEY
est PKCS # 1 et n'est qu'une clé RSA. Il s’agit essentiellement de l’objet clé de PKCS # 8, mais sans l’identificateur de version ou d’algorithme indiqué au préalable. BEGIN PRIVATE KEY
est PKCS # 8 et indique que le type de clé est inclus dans les données de clé elles-mêmes. Du lien:
Les données codées PKCS # 8 non chiffrées commencent et se terminent par les balises:
-----BEGIN PRIVATE KEY----- BASE64 ENCODED DATA -----END PRIVATE KEY-----
La structure DER suivante est présente dans les données codées en base64:
PrivateKeyInfo ::= SEQUENCE { version Version, algorithm AlgorithmIdentifier, PrivateKey BIT STRING } AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL }
Ainsi, pour une clé privée RSA, OID est 1.2.840.113549.1.1.1 et il existe une RSAPrivateKey comme chaîne de bits de données de clé PrivateKey.
Par opposition à BEGIN RSA PRIVATE KEY
, qui spécifie toujours une clé RSA et n'inclut donc pas un OID de type de clé. BEGIN RSA PRIVATE KEY
est PKCS#1
:
Fichier de clé privée RSA (PKCS # 1)
Le fichier PEM de clé privée RSA est spécifique aux clés RSA.
Cela commence et finit avec les tags:
-----BEGIN RSA PRIVATE KEY----- BASE64 ENCODED DATA -----END RSA PRIVATE KEY-----
La structure DER suivante est présente dans les données codées en base64:
RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q exponent1 INTEGER, -- d mod (p1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL }
Regardez <openssl/pem.h>
. Cela donne des marqueurs BEGIN possibles.
Copier le contenu du lien ci-dessus pour une référence rapide:
_#define PEM_STRING_X509_OLD "X509 CERTIFICATE"
#define PEM_STRING_X509 "CERTIFICATE"
#define PEM_STRING_X509_PAIR "CERTIFICATE PAIR"
#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE"
#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST"
#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST"
#define PEM_STRING_X509_CRL "X509 CRL"
#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY"
#define PEM_STRING_PUBLIC "PUBLIC KEY"
#define PEM_STRING_RSA "RSA PRIVATE KEY"
#define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY"
#define PEM_STRING_DSA "DSA PRIVATE KEY"
#define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY"
#define PEM_STRING_PKCS7 "PKCS7"
#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA"
#define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY"
#define PEM_STRING_PKCS8INF "PRIVATE KEY"
#define PEM_STRING_DHPARAMS "DH PARAMETERS"
#define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS"
#define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS"
#define PEM_STRING_DSAPARAMS "DSA PARAMETERS"
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY"
#define PEM_STRING_PARAMETERS "PARAMETERS"
#define PEM_STRING_CMS "CMS"
_