1

Proxmox 2.1 の REST API に接続する NodeJS サービスを作成しています。

私のスクリプト:

// module dependencies
var http    = require('http'),
    url     = require('url'),
    https   = require('https'),
    querystring = require('querystring'),
    fs     = require('fs');

exports.urlReq = function(reqUrl, options, cb){
    if(typeof options === "function"){ cb = options; options = {}; }// incase no options passed in

    // parse url to chunks
    reqUrl = url.parse(reqUrl);

    // http.request settings
    var settings = { 
        host: reqUrl.hostname,
        port: reqUrl.port || 80,
        path: reqUrl.pathname,
        headers: options.headers || {},
        method: options.method || 'GET',
        requestCert: false
    };

    // if there are params:
    if(options.params){
        options.params = querystring.stringify(options.params); 
        settings.headers['Content-Length'] = options.params.length; 
    }; 


    // MAKE THE REQUEST
    var req = https.request(settings); 

    req.on('error', function(err) {
        console.log(err);
    });

    // when the response comes back
    req.on('response', function(res){
        res.body = '';

        console.log("statusCode: ", res.statusCode);
        console.log("headers: ", res.headers);

        res.setEncoding('utf-8');

        // concat chunks
        res.on('data', function(chunk){ res.body += chunk });

        res.on('error', function(err){
            throw err;
        })

        // when the response has finished
        res.on('end', function(){

            // fire callback
            cb(res.body, res);
        });
    }); 

    // if there are params: write them to the request
    if(options.params){ req.write(options.params) };

    // end the request
    req.end();
}

スクリプトは GET 要求に対して機能しますが、POST 要求を実行すると停止します。エラーはスローされず、黙って失敗します。

コンソールが応答をログに記録するときの res.connection オブジェクトは次のとおりです。

connection: 
      { pair: [Object],
        writable: true,
        readable: true,
        _paused: false,
        _needDrain: false,
        _pending: [],
        _pendingCallbacks: [],
        _pendingBytes: 0,
        socket: [Object],
        encrypted: [Object],
        authorized: false,
        _controlReleased: true,
        _events: [Object],
        _pool: <Buffer 48 54 54 50 2f 31 2e 31 20 34 30 30 20 50 61 72 61 6d 65 74 65 72 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 2d 20 64 75 70 6c 69 63 ...>,
        _poolStart: 332,
        _poolEnd: 65536,
        parser: [Object],
        _httpMessage: [Circular],
        ondata: [Function: socketOnData],
        onend: [Function: socketOnEnd],
        npnProtocol: undefined,
        authorizationError: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' },

サーバーは自己署名 SSL 証明書を使用します。

どんな助けでも大歓迎です、

ありがとう!

4

2 に答える 2

3

これはかなり古いものですが、最近 Proxmox で同様の問題に遭遇したため、他の誰かがこの問題に遭遇した場合に備えて貢献したいと考えました。

「authorizationError: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'」エラーを回避するには、node.js に自己署名証明書 (デフォルトでは拒否されます) を受け入れるように指示し、これをスクリプトの先頭に置きます。

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

また、Content-Type ヘッダーを設定したかどうかはコードでわかりませんが、Proxmox API への POST 用に application/x-www-form-urlencoded に設定する必要があります。おそらく、options.headers で既に設定しているのでしょうが、Content-Length を指定しているので、よくわかりませんでした。CSRFPreventionToken は POST にも必要であるため、これもヘッダーの一部として渡す必要があります。

于 2013-08-05T17:11:47.607 に答える
2

authorized: falseそして、それが証明書の問題であることを明確に述べます。これは通常、証明書がルート証明機関authorizationError: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'によって適切に署名されていないことが原因です。

Proxmoxサーバーで適切に署名された証明書を設定できるかどうかはわかりませんが、それを管理する人は誰でも設定する必要があります。保守または管理するソフトウェアの場合は、2つのオプションがあります(HTTPSクライアントがHTTPSサーバーを信頼する必要があるすべての状況に以下が適用されることに注意してください)。

  1. サーバーに適切に署名された証明書をインストールします(購入するか、管理者にそのように指示します)。また
  2. クライアントに検証不可能な証明書を信頼してもらいます。

あなたが最初のことをするつもりなら、それからクライアント側からすることは他に何もありません。

したがって、以下は、nodejs HTTPSクライアントに特定のサーバーからの自己署名証明書を信頼させる方法の簡単な手順です(すべての自己署名証明書ではなく、その特定の証明書のみが信頼チェーンに追加されることに注意してください)。

  1. WebブラウザでターゲットURLにアクセスし、証明書をローカルに保存します。Mozilla Firefoxは、PEM形式での証明書のエクスポートをサポートしています。
  2. ブラウザが証明書をPEM形式でエクスポートできない場合は、OpenSSLを使用して変換します。
  3. 最後に、TLSサーバーオプションオブジェクトを介して証明書を信頼するようにHTTPSエージェントに指示します。詳細については、 nodejs tls.connect()のドキュメントを参照してください。
于 2013-01-30T16:15:02.063 に答える