web-dev-qa-db-ja.com

「エラー:EACCES:アクセス許可が拒否されました。 '/ etc / letsencrypt / live / domain.net / privkey.pem'を開いてください」でSSLを暗号化できませんでした。

Node.jsでSSLを使おうとしましたが、permission denied

try {
var TLSoptions = {
    key: fs.readFileSync("/etc/letsencrypt/live/domain.work/privkey.pem"),
    cert: fs.readFileSync("/etc/letsencrypt/live/domain.work/cert.pem")
};

https.createServer(TLSoptions, app).listen(port, Host, function() {
   console.log("TLS Website started.")
}); catch(e) {
    console.log(e)
}

=>

{ Error: EACCES: permission denied, open '/etc/letsencrypt/live/domain.work/privkey.pem'
at Object.fs.openSync (fs.js:663:18)
... (Librarys dump)
errno: -13,
code: 'EACCES',
syscall: 'open',
path: '/etc/letsencrypt/live/domain.work/privkey.pem' }

そこで、*。pemのファイルを作り直してみました。

rm -f /etc/letsencrypt/live
rm -f /etc/letsencrypt/archive    
rm -f /etc/letsencrypt/renewal
Sudo ./letsencrypt-auto certonly -a standalone -d domain.work

ファイルの権限を確認してください。

/etc/letsencrypt/live/domain.work$ ls -lsa
total 12
4 drwxr-xr-x 2 root root 4096 Jan  3 21:56 .
4 drwx------ 3 root root 4096 Jan  3 21:56 ..
0 lrwxrwxrwx 1 root root   37 Jan  3 21:56 cert.pem -> 
../../archive/domain.work/cert1.pem
0 lrwxrwxrwx 1 root root   38 Jan  3 21:56 chain.pem -> 
../../archive/domain.work/chain1.pem
0 lrwxrwxrwx 1 root root   42 Jan  3 21:56 fullchain.pem -> 
../../archive/domain.work/fullchain1.pem
0 lrwxrwxrwx 1 root root   40 Jan  3 21:56 privkey.pem -> 
../../archive/domain.work/privkey1.pem

/etc/letsencrypt/archive/domain.work$ ls -lsa
total 24
4 drwxr-xr-x 2 root root 4096 Jan  3 21:56 .
4 drwx------ 3 root root 4096 Jan  3 21:56 ..
4 -rw-r--r-- 1 root root 1789 Jan  3 21:56 cert1.pem
4 -rw-r--r-- 1 root root 1647 Jan  3 21:56 chain1.pem
4 -rw-r--r-- 1 root root 3436 Jan  3 21:56 fullchain1.pem
4 -rw-r--r-- 1 root root 1708 Jan  3 21:56 privkey1.pem

しかし、それは解決されておらず、間違いや問題を見つけることができません。
この問題を解決するにはどうすればよいですか?

8
kraftwerk

Sudoを使用して証明書を発行すると、それらはrootによって所有されます。ノードはrootとして実行されておらず、証明書フォルダーのアクセス許可では所有者以外のユーザーがノードを開くことができないため、ノードアプリはノードを認識できません。

解決策を理解するために、ノードがユーザーnodeuserとして実行されていると仮定します。

解決策#1(一時的):
証明書の所有者をノードユーザーに切り替えることができます。
$ Sudo chown nodeuser -R /etc/letsencrypt
ただし、これにより、NginxやApacheなど、証明書を参照する他のアイテムが破損する可能性があります。
また、90日以内の次の更新までしか持続しません。一方、証明書を更新するスクリプトを使用すると、所有者を設定することもできます。

解決策#2(これを行わないでください):
ノードをrootとして実行します。
Sudo node index.js
これにより、ノードがrootユーザーとして実行されます。つまり、ノードの非常に安全でないサーフェスがシステム上のすべてにアクセスできるようになります。これをしないでください。

解決策#3(これも行わないでください):
証明書をすべての人に公開します。
証明書は/etc/letsencrypt/archive/${domain}/cert1.pemに保存され、/etc/letsencrypt/live/${domain}/cert1.pemからリンクされます。

これらのパスの両方にあるすべてのフォルダーは+ xです。つまり、「ライブ」フォルダーと「アーカイブ」フォルダー自体を除いて、システム上のすべてのユーザーがフォルダーを開くことができます。
権限を変更することで、それらを開くこともできます。

$ Sudo chmod +x /etc/letsencrypt/live
$ Sudo chmod +x /etc/letsencrypt/archive

他の予期しないソースからのアクセスを許可するため、これは悪いことです。一般的に、すべての人にフォルダを開くことは悪い考えです。

解決策4(これを行う):
[。

// Create group with root and nodeuser as members
$ Sudo addgroup nodecert
$ Sudo adduser nodeuser nodecert
$ Sudo adduser root nodecert

// Make the relevant letsencrypt folders owned by said group.
$ Sudo chgrp nodecert /etc/letsencrypt/live
$ Sudo chgrp nodecert /etc/letsencrypt/archive

// Allow group to open relevant folders
$ Sudo chmod 710 /etc/letsencrypt/live
$ Sudo chmod 710 /etc/letsencrypt/archive

これにより、ノードは他のユーザーに開かずに、証明書を含むフォルダーにアクセスできるようになります。

これらの変更後は、再起動するか、少なくともログアウトしてログインする必要があります。
(権限とグループへの多くの変更には新しいセッションが必要であり、再起動するまでPM2で問題が発生しました。)

17
SamGoody

私はNode.jsに精通していませんが、PostgreSQLと明らかに同じ権限の問題です。したがって、同じソリューションが正常に機能するはずです。これにより、次のことが可能になります/etc/letsencryptの権限はそのままにします

  • 証明書をNode.jsディレクトリにコピーします
  • コピーしたファイルを「ノード」ユーザーにchownします

/etc/letsencrypt/renewal-hooks/deployでそれを実行するスクリプトを作成できます。このスクリプトは、証明書を更新するたびに呼び出されます。

/etc/letsencrypt/renewal-hooks/deploy/10-certbot-copy-certs

#!/bin/bash

domain=domain.work # using your example name
node_dir=/path/to/cert_copies
node_user=nodeuser

cp /etc/letsencrypt/live/$domain/{fullchain,privkey}.pem "$node_dir"/
chown $node_user "$node_dir"/*.pem
0
mivk