SSL 권한 오류: HTTPS가 포함된 Node.js + SSL을 암호화하자 + Apache + 루트가 아닌 사용자

SSL 권한 오류: HTTPS가 포함된 Node.js + SSL을 암호화하자 + Apache + 루트가 아닌 사용자

Node.js 서버가 설정되어 있고 Apache에서 Let's Encrypt 인증서와 함께 HTTPS를 사용하려고 합니다. 내가 설정한 관련 코드는 다음과 같습니다.

var fs = require('fs'),
https = require('https'),
express = require('express'),
options = {
  key: fs.readFileSync('/etc/letsencrypt/live/www.mysite.com/privkey.pem'),
  cert: fs.readFileSync('/etc/letsencrypt/live/www.mysite.com/fullchain.pem'),
  ca: fs.readFileSync('/etc/letsencrypt/live/www.mysite.com/chain.pem')
}, ...

스크립트를 시작하려고 하면 다음 오류가 발생합니다.

Error: EACCES: permission denied, open '/etc/letsencrypt/live/www.mysite.com/privkey.pem'

이는 루트 소유자만이 현재 Apache의 30개 이상의 일반 웹사이트에서 사용되는 SSL용 Let's Encrypt 디렉터리와 파일을 소유하기 때문입니다. 하나의 웹사이트에 Node App을 설정하려고 합니다. 내 노드 app.js 프로젝트 파일은 mysite1:mysite1의 소유이며 루트가 아닌 사용자(예: "mysite1")로 노드 앱을 실행하는 것이 더 안전하다는 것을 알고 있습니다.

/etc/letsencrypt 디렉토리에 755 권한을 부여하지 않고도 Let's Encrypt HTTPS가 Apache의 Node.js 앱과 안전하게 작동하도록 하는 적절한 방법은 무엇입니까?

편집 - 설명:

Node.js와 Apache가 나란히 실행됩니다. 웹 사이트의 virtualHost .conf 파일에서 443 DocumentRoot는 /home/mysite1/mysite1.com이며, 이는 Let's Encrypt SSL이 설치된 이유입니다.

내 Node.js 앱은 /home/mysite1/app 에 설정되어 있습니다. 웹 사이트에서 나는 사이트 전체 채팅방으로 Socket.io를 사용하고 다음과 완벽하게 연결/작동합니다(앱이 루트 사용자로 시작된 경우). ProxyPass가 필요하지 않습니다.

<script src="//www.mysite1.com:3000/socket.io/socket.io.js"></script>
<script>var socket = io('https://www.mysite1.com:3000');</script>

보안 목적으로 루트가 아닌 사용자로 앱을 실행할 때 표시되는 유일한 오류는 내 노드 앱에 SSL 파일에 액세스/구성하려고 할 때 권한 오류가 있다는 것입니다. 구체적으로 무엇을 해야 합니까? Apache "뒤에서" 실행하는 방법이 확실하지 않거나 더 간단한 솔루션이 있는지 잘 모르겠습니다.

더 간단한 솔루션이 있어야 할 것 같습니다. Node.js가 루트로 실행되어 SSL 데이터를 가져오고 Apache처럼 사용자에게 전달하기 전에 서버를 실행하게 할 수 있을까요?

편집 2:

Michael과 ezra-s의 제안에 따라 한동안 Google에서 검색하고 몇 가지 사항을 변경했지만 제대로 작동하지 않습니다. Apache에서는 다음과 같은 작업을 수행했습니다.

<VirtualHost *:443>
  ServerAlias mysite1.com
  DocumentRoot /home/mysite1/mysite1.com
  DirectoryIndex index.html index.php
  <Directory /home/mysite1/mysite1.com>
    .. web config stuff
  </Directory>

  ProxyRequests Off
  ProxyPreserveHost On
  ProxyVia Full
  <Proxy *>
    Require all granted
  </Proxy>

  <Location /node>
    ProxyPass http://127.0.0.1:3000
    ProxyPassReverse http://127.0.0.1:3000
  </Location>

  SSLEngine on
  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/www.letshangout.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/www.letshangout.com/privkey.pem
</VirtualHost>

내 노드 app.js 프로젝트 파일에서 require('https') 및 인증서 옵션을 제거하고 "http" 패키지로 대체한 후 스크립트 초기화를 시도했습니다.

내 웹사이트 페이지에는 소켓.io를 로드하고 노드 앱과 연결을 시도하는 스크립트가 있습니다.

<script src="https://www.mysite1.com/node/socket.io/socket.io.js"></script>
<script>var socket = io('https://www.mysite1.com/node/');</script>

페이지를 로드할 때 500 오류가 발생하고 스크립트가 로드되지 않습니다. Apache 구성이나 스크립트 URL에서 무엇을 변경해야 합니까? 저는 이전에 노드와 함께 프록시를 사용해 본 적이 없습니다. 이것이 제 첫 번째 노드 앱입니다.

해결책:

나는 그것을 웹 소켓과 자바스크립트와 관련하여 수행해야 하는 다른 작업의 조합으로 생각했습니다.

1) 웹소켓 처리를 위한 Apache Confighttps://stackoverflow.com/a/41685748/2317571

2) 클라이언트용 JavaScript 소켓 연결 구성https://stackoverflow.com/questions/22919276/how-to-connect-socket-io-through-a-reverse-proxy

3) (보너스 팁): Apache 뒤에 노드 앱을 가져오는 데 대한 Michael과 ezra-s의 조언 덕분에 ufw 방화벽을 사용하고 node/socket.io 포트 3000을 localhost에 잠글 수 있습니다. 포트가 하나 줄어들고 보안도 향상되었습니다. 구멍) 세상에 열려있습니다. 이 정보가 다른 사람에게 도움이 되기를 바랍니다.

답변1

1. 포트 자체에서 Node.js 앱을 실행합니다.

2. 역방향 프록시를 수행합니다.

메모:Node.js 앱과 Apache 간의 연결은 HTTP를 사용합니다. 그러나 이는 "localhost" 수준에서만 발생합니다. 그러므로 괜찮을 것입니다.

VirtualHost 구성:

<VirtualHost *:443>
        ServerName nodeapp.com
        ServerAdmin webmas@localhost
        DocumentRoot /var/www/nodeapp

        SSLEngine on
        SSLCertificateFile      /path/to/cert
        SSLCertificateKeyFile   /path/to/key


        ProxyRequests off
        ProxyPass "/" "http://127.0.0.1:node_app_port/"
        ProxyPassReverse "/" "http://127.0.0.1:node_app_port/"

        ErrorLog ${APACHE_LOG_DIR}/nodeapp_error.log
        CustomLog ${APACHE_LOG_DIR}/nodeapp_access.log combined

</VirtualHost>

관련 정보