Использование Express HTTPS API в производстве на IIS с подписанным сертификатом - PullRequest
0 голосов
/ 11 февраля 2020

Я готовлю свое приложение http Angular / Express / Node и API для работы через порт 8443 https в рабочей среде, развернутой на IIS на windows сервере. В настоящее время мое приложение работает по протоколу https (8443) в prod с правильным сертификатом из параметра привязки сайта в IIS, но сервер express не отвечает правильно на вызовы API. (Может ли API и основное приложение использовать порт 8443 в PROD ?, в dev я использую 4200 и 8080). Обратите внимание, что порт 443 - это совершенно другое приложение, в настоящее время настроенное с использованием того же сертификата.

Практически каждый пример выполнения Express на HTTPS, который я могу найти, включает создание самоподписанного сертификата, упаковывающего сертификат в код, и передача относительного местоположения в качестве параметра express при создании. См. Включение HTTPS для express. js

Однако получить производственную информацию немного сложнее, тем не менее, большинство, похоже, упаковывают сертификат с кодом и обмениваются при сборке. / время выполнения через переменную среды.

Однако в моем случае IIS в работе имеет сертификат, который мне нужно использовать, и я не знаю его местонахождение. Как я могу указать express использовать этот сертификат? Возможно, используя переписать в web.config?

Вот мой сервер. js:

/* set up the server configuration */
const http = require('http');
var https = require('https');
const app = require('./app.js');
const port = process.env.PORT || 8080;
var httpServer = http.createServer(app);
var httpsServer = https.createServer(app);

httpServer.listen(port, '0.0.0.0');
httpsServer.listen(8443);

мой web.config на IIS:

<configuration>
<system.webServer>
  <rewrite>
    <rules>
      <rule name="Redirect all requests" stopProcessing="true">
        <match url=".*" />
        <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="/" />
        <!--<action type="Rewrite" url="/" />-->
        </rule>
    </rules>
  </rewrite>
      <security>
         <requestFiltering>
            <verbs applyToWebDAV="false" allowUnlisted="true" />
         </requestFiltering>
      </security>
    <modules>
       <remove name="WebDAVModule"/>
    </modules>
</system.webServer>
</configuration>

1 Ответ

0 голосов
/ 06 марта 2020

Это были мои решения:

(Может ли API и основное приложение использовать порт 8443 в PROD ?, в dev я использую 4200 и 8080). Обратите внимание, что порт 443 - это совершенно другое приложение, настроенное в настоящее время с использованием того же сертификата.

Другой сайт на 443 не будет вмешиваться, если ваше приложение не пытается его использовать. Использование 4200 (приложение) и 8080 (express) на локальном вполне подойдет. Использование 8443 в производстве для приложения и express прекрасно работает. Убедитесь, что web.config перенаправляет URL-адреса без / api / в маршрут к серверу, js файл. в то время как приложение запрашивает go в /. См. Ниже:

 <rewrite>
            <rules>
                <!-- Don't interfere with requests for node-inspector debugging -->
                <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
                    <match url="^server.js\/debug[\/]?"/>
                </rule>

                <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
                <rule name="StaticContent" patternSyntax="Wildcard">
                    <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                    </conditions>
                    <match url="*.*"/>
                </rule>
                <!-- All other URLs are mapped to the Node.js application entry point -->
                <rule name="API Requests">
                        <match url="api*" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                    </conditions>
                    <action type="Rewrite" url="server.js"/>
                </rule>
                <rule name="SocketIO" patternSyntax="ECMAScript">
                    <match url="socket.io.+"/>
                    <action type="Rewrite" url="server.js"/>
                </rule>
                        <rule name="Redirect all requests" stopProcessing="true">
                <match url=".*" />
                    <conditions logicalGrouping="MatchAll">
                      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                <action type="Rewrite" url="/" />
                <!--<action type="Rewrite" url="/" />-->
              </rule>
            </rules>
        </rewrite>

Однако в моем случае IIS на производстве имеет сертификат, который мне нужно использовать, и я не знаю его местонахождение. Как я могу указать express использовать этот сертификат? Возможно, с помощью перезаписи в web.config?

При использовании сертификата в PROD с Express / IIS не требуется местоположение сертификата, и он не управляется в web.config. Скорее, express не нужно взаимодействовать или знать о сертификате, и вы можете использовать IIS Manager для настройки привязок к сертификату в производстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...