2015-08-13 2 views
0

Я использую модуль crypto для проверки сертификата, но оба сертификата и мой открытый ключ находятся в формате DER. Похоже, что модуль crypto не принимает этот формат.NodeJS: проверить сертификат в формате DER

Есть ли способ (или модуль) конвертировать DER в формат PEM с помощью NodeJS? Я не смог найти и не могу использовать командную строку для вызова openssl через оболочку.

ОБНОВЛЕНИЕ: Речь идет не о сертификатах HTTPS. Речь идет об общих сертификатах X.509.

+0

Я бы оставил часть «ОБНОВЛЕНИЕ», если бы был вами. –

ответ

2

ответ Доминикас было хорошо, но в моем случае, у меня есть сертификат, который использует ECC и node-forge не поддержите его. Так я нашел модуль под названием node-openssl-wrapper, который работал отлично, потому что он инкапсулирует команды OpenSSL в простой вызов функции, например:

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

Я думаю, что этот ответ работает для меня, но когда я использую этот pemCert в crypto.publicDecrypt (pemkey, cipherText), и он говорит: (pemkey) не является буфером. Есть идеи? Заранее большое спасибо. @blzn – leonsPAPA

+1

Возможно, вам стоит попробовать 'crypto.publicDecrypt (новый буфер (pemkey), cipherText)'. – blzn

1

Вот один из способов сделать это:

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

Хорошая попытка, но она не поддерживает ECDSA для открытых ключей. – blzn

1

Я думаю, что формат PEM это только DER двоичные данные который был закодирован в base64, разбит на 64 символьные строки и завернут между «----- BEGIN CERTIFICATE -----» и «----- END CERTIFICATE -----».

Таким образом, вы можете сделать это:

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

Вам не нужно будет ставить «\ п» перед постфикса, потому что последний матч буфера дер должен быть пустой строкой «», так что будет быть «\ n» в конце derBuffer.toString('base64').match(/.{0,64}/g).join('\n')

Смежные вопросы