Je génère l'exportation de certains fichiers pkcs # 12 à des fins de test. Ces fichiers ne sont pas utilisés en production et n'existent que temporairement lors des tests automatisés.
J'utilise la commande suivante:
openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt
Pourquoi insiste-t-il sur un mot de passe d'exportation lorsque j'ai inclus -nodes
?
Ma version OpenSSL est OpenSSL 1.0.1f 6 Jan 2014
sur Ubuntu Server 14.10 64 bits.
En mode interactif, lorsque le système vous demande un mot de passe, appuyez simplement sur Entrée et aucun mot de passe ne sera défini.
Si vous voulez automatiser cela (par exemple en tant que commande ansible), utilisez l’argument -passout
. Il s'attend à ce que le paramètre soit sous la forme pass:mypassword
. Puisque nous ne voulons pas de mot de passe:
openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt -passout pass:
tl; dr Ce que vous essayez de faire ne peut tout simplement pas être fait avec l'utilitaire de ligne de commande OpenSSL. Cela ne peut être fait que par programme en utilisant libcrypto, la bibliothèque de chiffrement d'OpenSSL.
-nodes
signifie "ne pas chiffrer la clé privée", mais dans un fichier PKCS # 12, les certificats sont également chiffrés. Ainsi, même avec -nodes
, vous aurez besoin d'un mot de passe d'exportation.
Voir la documentation de -descert
qui dit:
Cryptez le certificat en utilisant le triple DES; cela peut rendre le fichier PKCS # 12 illisible par certains logiciels de "qualité export". Par défaut, la clé privée est crypté avec triple DES et le certificat utilisant RC2 40 bits.
Donc, à moins que vous n'utilisiez cette option, les certificats sont chiffrés à l'aide de RC2. Vous pouvez modifier les algorithmes pour la clé ou le certificat en utilisant les options -keypbe
et -certpbe
.
De plus, pour openssl pkcs12
, l'option -nodes
est uniquement répertoriée dans la section:
Les options pour analyser un fichier PKCS12 sont les suivantes:
Mais vous n’analysez pas un tel fichier, vous le créez et si vous regardez
Les options de création de fichier PKCS12 sont les suivantes:
l'option -nodes
n'est même pas listée.
Un simple clic sur retour lorsque vous êtes invité à entrer un mot de passe ne signifie pas non plus "pas de mot de passe", mais signifie "mot de passe vide" (votre mot de passe est une chaîne vide), ce qui est légal. Si certains logiciels tentent de lire les fichiers PKCS # 12 avec un mot de passe de chaîne vide en premier lieu, cela fonctionne comme si aucun mot de passe ne fonctionnait. Dans le cas contraire, demandez à l'utilisateur de saisir un mot de passe, par conséquent, si le mot de passe est vide, dans ce cas, l'utilisateur ne sera jamais invité à donner l'impression que "aucun mot de passe" n'est défini.
Cela peut entraîner des problèmes dans macOS et iOS, car Apple suppose que PKCS # 12 a toujours un mot de passe défini et qu'il ne vous permet pas de saisir un "mot de passe vide". Par conséquent, si un fichier a un mot de passe vide, il est impossible de l'importer. sur ces systèmes. Firefox avait aussi ce problème au tout début, mais il a été corrigé il y a 13 ans .
Lors de la lecture d'un fichier PKCS # 12, OpenSSL lui-même tente de distinguer "sans mot de passe" et "mot de passe vide" uniquement en devinant. Voici le code original du projet:
/* If we enter empty password try no password first */
if(!mpass[0] && PKCS12_verify_mac(p12, NULL, 0)) {
/* If mac and crypto pass the same set it to NULL too */
if(!twopass) cpass = NULL;
} else if (!PKCS12_verify_mac(p12, mpass, -1)) {
BIO_printf (bio_err, "Mac verify error: invalid password?\n");
ERR_print_errors (bio_err);
goto end;
}
La première fois que NULL
est passé pour le mot de passe, la deuxième fois, la chaîne vide est analysée pour le mot de passe. Regardons maintenant le code lors de la création d'un fichier P12:
p12 = PKCS12_create(cpass, name, key, ucert, certs,
key_pbe, cert_pbe, iter, -1, keytype);
Théoriquement, cet appel créerait un fichier PKCS # 12 sans mot de passe si, et uniquement sicpass
est NULL
, cependant, lorsque cet appel est effectué, il ne peut pas être NULL
car si vous suivez le chemin du code depuis le début de la fonction de l'appel ci-dessus, il n'y a pas de chemin de code qui conduirait à ce que cpass
soit NULL
à la fin.
if(!cpass) {
if(export_cert) cpass = passout;
else cpass = passin;
}
if(cpass) {
mpass = cpass;
noprompt = 1;
} else {
cpass = pass;
mpass = macpass;
}
Si cpass
était toujours NULL
à la dernière if
, il sera défini sur pass
et pass
sera:
char pass[50], macpass[50];
Il s'agit d'une variable statique et, stocké dans un pointeur, ce pointeur ne peut pas être NULL
. Il n'y a pas d'autre code qui affecte jamais une valeur différente à cpass
, donc cpass
peut être une chaîne vide, mais ce ne peut certainement pas être NULL
et donc aucun fichier PKCS # 12 qu'OpenSSL ne créera jamais en ligne de commande sans mot de passe. Il peut avoir un mot de passe vide mais il a certainement un mot de passe.