2015-08-13 1 views
0

J'utilise le module crypto pour valider un certificat, mais les deux, mon certificat et ma clé publique sont au format DER. Il semble que le module crypto n'accepte pas ce format.NodeJS: Valider le certificat au format DER

Existe-t-il un moyen (ou un module) pour convertir le format DER au format PEM en utilisant NodeJS? Je ne pouvais pas trouver et ne peut pas utiliser la ligne de commande pour appeler openssl via shell.

MISE À JOUR: Il ne s'agit pas de certificats HTTPS. Il s'agit de certificats généraux X.509.

+0

Je laisserais la partie "MISE À JOUR" si j'étais vous. –

Répondre

2

réponse Dominykas était bonne, mais dans mon cas, j'ai un certificat qui utilise ECC et node-forge ne soutiens le. J'ai trouvé un module appelé node-openssl-wrapper, qui a parfaitement fonctionné, car il encapsule les commandes OpenSSL dans un simple appel de fonction, comme celle-ci:

co(function*() { 
    var ossl = require('openssl-wrapper'); 
    var derCert = new Buffer('...'); // binary DER certificate 
    var pemCert = yield ossl.qExec('x509', derCert, { inform: 'der', outform: 'pem' }); 
}); 
+0

Je pense que cette réponse fonctionne pour moi, mais quand j'utilise ce pemCert dans crypto.publicDecrypt (pemkey, cipherText) et il dit: (pemkey) n'est pas un tampon. Une idée? Merci beaucoup d'avance. @blzn – leonsPAPA

+1

Peut-être devriez-vous essayer 'crypto.publicDecrypt (nouveau Buffer (pemkey), cipherText)'. – blzn

1

Voici une façon de le faire:

function derToPem(der) { 
 
\t var forge = require("node-forge"); 
 
\t var derKey = forge.util.decode64(der); 
 
\t var asnObj = forge.asn1.fromDer(derKey); 
 
\t var asn1Cert = forge.pki.certificateFromAsn1(asnObj); 
 
\t return forge.pki.certificateToPem(asn1Cert); 
 
};

+0

Bon essai, mais il ne supporte pas ECDSA pour les clés publiques. – blzn

1

Je pense que le format PEM est juste la DER données binaires qui a été codé en base64, divisé en 64 lignes de caractères, et enveloppé entre '----- BEGIN CERTIFICATE -----' et '----- END CERTIFICATE -----'.

Vous pouvez faire ceci:

var prefix = '-----BEGIN CERTIFICATE-----\n'; 
var postfix = '-----END CERTIFICATE-----'; 
var pemText = prefix + derBuffer.toString('base64').match(/.{0,64}/g).join('\n') + postfix; 

Vous aurez pas besoin de mettre un « \ n » avant la Postfix parce que le dernier match de la mémoire tampon der doit être une chaîne vide « », donc il y aura être un '\ n' à la fin de derBuffer.toString('base64').match(/.{0,64}/g).join('\n')