Ошибка: самозаверяющий сертификат в NodeJS HTTPS-запросе - PullRequest
0 голосов
/ 21 января 2020

Я довольно новичок в NodeJS и пытаюсь реализовать HTTPS-запрос от NodeJS (backend) напрямую к API промежуточного программного обеспечения, размещенному в IISNode с сертификатом GoDaddy. У меня есть другой репозиторий для моего представления (внешний интерфейс), и все вызовы промежуточного программного обеспечения API через браузер работают с сертификатом GoDaddy. Вызовы прекрасно работают с HTTP, используя Ax ios. При обращении к API промежуточного программного обеспечения с HTTPS из бэкэнда NodeJS я получаю:

Error: self signed certificate
    at TLSSocket.onConnectSecure (_tls_wrap.js:1058:34)
    at TLSSocket.emit (events.js:198:13)
    at TLSSocket.EventEmitter.emit (domain.js:448:20)
    at TLSSocket._finishInit (_tls_wrap.js:636:8)

Действительно странно, что репозиторий веб-интерфейса без проблем взаимодействует с промежуточным ПО через браузер, но NodeJS бэкэндов звонить не буду. Я попытался использовать Ax ios в бэкэнде без удачи и ошибок. Я переключился на HTTPS, и вызовы GET работают, но вызовы POST выдают ошибку выше.

Я прочитал тонны постов и примеров, касающихся самозаверяющих сертификатов, но я использую сертификат, сгенерированный из GoDaddy. Вот некоторые фрагменты кода, которые я пробовал:

Ax ios:


    const SSLAgent = new https.Agent({
        rejectUnauthorized: true,
        passphrase: process.env.PASSPHRASE,
        pfx: fs.readFileSync(path.join(__dirname, "../../") + process.env.PFX),
        ca: fs.readFileSync(path.join(__dirname, "../../") + process.env.CRT_BUNDLE)
    });


    const fetchData = () => axios.get(`${process.env.MIDDLE_WARE_URL}/something`, {
        headers: {
            Authorization: `Bearer ${token}`
        },
        httpsAgent: SSLAgent
    });


    const uploadData = () => {
        const form = new FormData();
        form.append("data", fs.createReadStream(dataPath));
        return axios.post(`${process.env.MIDDLE_WARE_URL}/data`, form, {
            headers: {
                ...form.getHeaders(),
                Authorization: `Bearer ${token}`
            },
            httpsAgent: SSLAgent
        });
    };

    const fetchItemImage = (ItemID: number) => axios.get(`${process.env.MIDDLE_WARE_URL}/item/${ItemID}/image.png`, {
        responseType: "arraybuffer",
        headers: {Authorization: `Bearer ${token}`},
        httpsAgent: new https.Agent({pfx: fs.readFileSync(path.join(__dirname, "../../") + process.env.PFX), passphrase: process.env.PASSPHRASE}), ca: fs.readFileSync(path.join(__dirname, "../../") + process.env.CRT_BUNDLE)
    });

HTTPS:


        const SSLAgent = {
        rejectUnauthorized: true,   
        passphrase: process.env.PASSPHRASE,
        pfx: fs.readFileSync(path.join(__dirname, "../../") + process.env.PFX),
        ca: fs.readFileSync(path.join(__dirname, "../../") + process.env.CRT_BUNDLE)
    };

    const middleServer = express;
    const middle = express.Router();
    https.createServer(SSLAgent, middleServer).listen(443);

    let data;
    const dataOptions = {
        headers: {
            "Authorization": `Bearer ${token}`
        }
    };
    const fetchData = () => middle.get("/data", (req, res) => {
        console.log("The req is: ", req);
        if (res.statusCode === 200) {
            console.log("The Fetch Data Res: ", res);
            data = res;
        }
        data = [];
    });

    const uploadStuff = () => {
        const form = new FormData();
        form.append("Stuff", fs.createReadStream(stuffPath));
        const stuffOptions = {
            headers: {
                ...form.getHeaders(),
               "Authorization": `Bearer ${token}`
            },
            form
        };
        return  middle.post("/stuff", (req, res) => {
            req.params(stuffOptions);
            res.on("data", () => {
                console.log("The post response is: ", res);
            });
            res.on("error", (error) => {
                console.log("The post error is: ", error);
            });
        });
    };

Кроме того, вот мой IIS web.config :


    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.webServer>
            <handlers>
                <add name="iisnode" path="iis.js" verb="*" modules="iisnode" />
                <add name="iisnode-socketio" path="iis.js" verb="*" modules="iisnode" />
            </handlers>
            <rewrite>
                <rules>
                    <rule name="my_middleware">
                        <match url="/*" />
                        <conditions>
                            <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                        </conditions>
                          <action type="Redirect" redirectType="Found" url="https://{HTTPS_HOST}/{R:1}" />
                    </rule>
                        <!-- Don't interfere with requests for logs -->
                    <rule name="LogFile" patternSyntax="ECMAScript" stopProcessing="true">
                      <match url="^[a-zA-Z0-9_\-]+\.js\.logs\/\d+\.txt$" />
                    </rule>
                        <!-- Don't interfere with requests for node-inspector debugging -->
                    <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
                      <match url="^app.js\/debug[\/]?" />
                    </rule>
                        <!-- First we consider whether the incoming URL matches a physical file in the     /public folder -->
                    <rule name="StaticContent">
                      <action type="Rewrite" url="public{REQUEST_URI}" />
                    </rule>
                        <!-- All other URLs are mapped to the Node.js application entry point -->
                    <rule name="DynamicContent">
                        <conditions>
                            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" />
                        </conditions>           
                        <action type="Rewrite" url="iis.js" logRewrittenUrl="true" />
                    </rule>
                    <rule name="SocketIO" patternSyntax="ECMAScript">
                        <match url="socket.io.+" />
                        <action type="Rewrite" url="iis.js" />
                    </rule> 
                </rules>
            </rewrite>
            <webSocket enabled="false" />
            <iisnode debugHeaderEnabled="true" promoteServerVars="AUTH_USER,AUTH_TYPE,LOGON_USER" />
            <security>
                <authorization>
                    <remove users="*" roles="" verbs="" />
                    <add accessType="Allow" users="?" verbs="OPTIONS" />
                    <add accessType="Allow" users="*" roles="" />
                </authorization>
                <requestFiltering>
                    <requestLimits maxAllowedContentLength="4294967295" />
                </requestFiltering>
            </security>
            <defaultDocument>
                <files>
                    <add value="iis.js" />
                </files>
            </defaultDocument>
        </system.webServer>
    </configuration>

...