2016-12-27 6 views
0

ノードhttps証明書検証のカスタム検証を行います。 httpsオプションでrejectUnauthorizedプロパティをfalseに設定しました。https証明書から重要な拡張機能を読み取る

var httpsOptions = { 
    ... 
    rejectUnauthorized: false, 
    ... 
}; 

証明書の検証が内部的に失敗した場合でも、要求は失敗しません。私は手動でその部分を扱いたい。私はunhandled critical extensionエラーを処理したかった。これを行うコードは、

var req = https.request(httpsOptions, (res) => { 
    var data = ''; 
    res.on('data', (chunk) => { 
     data += chunk; 
    }); 
    res.on('end',() => { 
    console.log(data); 
    }); 
}); 

req.on("socket", function() { 
    req.socket.on('secureConnect',() => { 
    if(!req.socket.authorized){ 
     if(req.socket.authorizationError === 'unhandled critical extension'){ 
     // Place to verify extensions 
     } 
     process.nextTick(() => {req.abort();});  
    } 
    }); 
}); 

req.write(JSON.stringify(requestObj)); 
req.end(); 

上記のコードは期待どおりです。 unhandled critical extensionエラーが発生したとき、私は言うことができます。 ifの条件(拡張子を確認する場所)の中で、処理されていないものはすべてcritical extensionsです。それが私が持っているリストと一致しない場合、私は要求を中止したい。 req.socketには非常に多くのプロパティがあるので、ここに貼り付けることができませんでした。それにはunhandledの重要な拡張子を持つフィールドはありません。どのようにエラーを引き起こした未処理の重要な拡張子を抽出するのですか?

注:私はx509PKIjsなどのSSL証明書を解析することができ、いくつかのnpmパッケージを見てきました。それは多くの混乱をもたらし、私は自分の問題を解決できる実例を見つけることができませんでした。

EDIT

req.socket.getPeerCertificate().rawBuffer形式のDER証明書を提供します。どのようにデコードし、それらの拡張子を表示するのですか?

答えて

0

まず、サーバー証明書を取得する必要があります。私たちはそれを得るためにreq.socket.getPeerCertificate()を使うことができます。 JSONオブジェクトを返しますが、拡張セクションはありません。しかし、それはrawプロパティのbuffer形式の証明書全体を持つことになります。

var certInBuf = req.socket.getPeerCertificate().raw; 

このバッファ形式をpem形式に変換するために使用できるパッケージが多数あります。そのうちの一つは、その後、我々は、証明書を解析し、拡張子を抽出するためにnode-forgeを使用することができますpemtools

var certInPem = pemtools(certInBuf, 'CERTIFICATE').toString(); 

です。

var pki = require('node-forge').pki; 
var extensions = pki.certificateFromPem(certInPem).extensions; 

次に、拡張機能を検証できます。満足できない場合は、req.abort()

関連する問題