Я довольно новичок в 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>