私は自分のローカル無線ルーター(Linksys)にログインする小さなアプリを開発していますが、ルーターの自己署名SSL証明書に問題があります。
私は192.168.1.1とwgetを実行して取得:
ERROR: cannot verify 192.168.1.1's certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/[email protected]':
Self-signed certificate encountered.
ERROR: certificate common name `Linksys' doesn't match requested Host name `192.168.1.1'.
To connect to 192.168.1.1 insecurely, use `--no-check-certificate'.
Nodeでは、キャッチされているエラーは次のとおりです。
{ [Error: socket hang up] code: 'ECONNRESET' }
私の現在のサンプルコードは次のとおりです。
var req = https.request({
Host: '192.168.1.1',
port: 443,
path: '/',
method: 'GET'
}, function(res){
var body = [];
res.on('data', function(data){
body.Push(data);
});
res.on('end', function(){
console.log( body.join('') );
});
});
req.end();
req.on('error', function(err){
console.log(err);
});
Node.jsに "--no-check-certificate"と同等の機能を持たせるにはどうすればよいですか?
安くて安全でない答え:
追加する
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
https.request()
を呼び出す前に、コードで
より安全な方法(上記の解決法ではノード全体のプロセスが安全ではなくなる)がこの質問 で答えられます
リクエストオプションに、次のものを含めてみてください。
var req = https.request({
Host: '192.168.1.1',
port: 443,
path: '/',
method: 'GET',
rejectUnauthorized: false,
requestCert: true,
agent: false
},
あなたを誤解させようとするすべての人を信じてはいけません。
あなたの要求では、単に追加してください:
ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]
不正な証明書を有効にした場合、あなたはまったく保護されず(本人確認を行わないためにMITMに公開される)、SSLなしで作業しても大きな違いはありません。解決策は、次のスニペットに示すように、予想されるCA証明書を指定することです。証明書の共通名が、要求で呼び出したアドレスと同じであることを確認します(ホストで指定されているとおり)。
あなたがそれから得るものは:
var req = https.request({
Host: '192.168.1.1',
port: 443,
path: '/',
ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
method: 'GET',
rejectUnauthorized: true,
requestCert: true,
agent: false
},
理解するためにここに この記事 (開示:この回答の著者によって書かれたブログ記事)を読んでください:
以下の環境変数を追加します。
NODE_TLS_REJECT_UNAUTHORIZED=0
例えばexport
を使う:
export NODE_TLS_REJECT_UNAUTHORIZED=0
(Juanraに感謝します)
@Armandの回答に追加する:
以下の環境変数を追加します。
NODE_TLS_REJECT_UNAUTHORIZED = 0輸出と:
nODE_TLS_REJECT_UNAUTHORIZED = 0をエクスポート(Juanraに感謝します)
あなたがウィンドウズを使っているなら:
set NODE_TLS_REJECT_UNAUTHORIZED=0
デフォルトのオプションでリクエストインスタンスを作成することもできます。
require('request').defaults({ rejectUnauthorized: false })
MeteorJSの場合は、npmRequestOptionsで設定できます。
HTTP.post(url, {
npmRequestOptions: {
rejectUnauthorized: false // TODO remove when deploy
},
timeout: 30000, // 30s
data: xml
}, function(error, result) {
console.log('error: ' + error);
console.log('resultXml: ' + result);
});
あるいは、次のようにローカルの名前解決(ほとんどのオペレーティングシステムではhosts
ファイルがディレクトリetc
にあります、詳細は異なります)を追加することもできます。
192.168.1.1 Linksys
そして次に
var req = https.request({
Host: 'Linksys',
port: 443,
path: '/',
method: 'GET'
...
働くでしょう。