【问题标题】:FATAL: could not access private key file “/etc/ssl/private/ssl-cert-snakeoil.key”: Permission denied致命:无法访问私钥文件“/etc/ssl/private/ssl-cert-snakeoil.key”:权限被拒绝
【发布时间】:2016-03-16 13:07:59
【问题描述】:

我相信我最终在 /etc/ssl 目录树中混合了权限,因为最后一次修改是在 11 月 18 日和我无法让我的 PostgreSQL 工作的第二天。

当我输入时

sudo 服务 postgresql 启动

我明白了

致命:无法访问私钥文件“/etc/ssl/private/ssl-cert-snakeoil.key”:权限被拒绝

检查权限

~$ sudo -i
~$ ls -la /etc/ssl/private
drw-r----- 2 root ssl-cert 4096 Nov 18 21:10 .
-rwxrwxrwx 1 postgres postgres 1704 Set 4 11:26 ssl-cert-snakeoil.key

检查组组成

~$ id postgres
uid=114(postgres) gid=127(postgres) groups=127(postgres),114(ssl-cert)

我还注意到我在 /etc/ssl/certs/ 的 ssl-cert-snakeoil.pem 文件没有符号链接。我不知道这是否有什么不同...

请帮我解决这个问题。

谢谢。

编辑:是否应该将其发布在 serverfault 上?

【问题讨论】:

    标签: postgresql ssl


    【解决方案1】:

    尝试将 .key 文件的权限设置为 600。Postgres 不喜欢设置了组或世界权限的密钥文件。您可能还需要将所有者更改为 postgres,但我不确定。

    【讨论】:

    • 没有更改,不过感谢您的尝试。我很绝望。
    • /etc/ssl/private 目录的权限是什么?
    • 另外,什么版本的 postgres?顺便说一句,我们在 /var/lig/pgsql/data 中有我们的 server.key 文件。
    • Postgre 版本是 9.4.5 并且 /etc/ssl/private 权限是 drw-r----- 2 root ssl-cert 4096 Nov 18 21:10
    • 尝试从 /etc/ssl/private 删除组读取权限 - 600 而不是 640。我还没有验证这一点,但我在其他地方看到了它的建议。
    【解决方案2】:

    检查输出

    $ sudo -u postgres
    $ cd /etc/ssl/private
    $ ls
    

    如果响应是“权限被拒绝”,请执行

    $ chown postgres:ssl-cert /etc/ssl/private/
    $ chown postgres:postgres /etc/ssl/private/ssl-cert-snakeoil.key
    

    【讨论】:

    • 然后我也得到了错误File must be owned by the database user or root, must have no write permission for "group", and must have no permissions for "other" 所以我更改了权限:sudo chmod 510 /etc/ssl/private/ssl-cert-snakeoil.key 现在,一切正常:)
    • @ChristophSchranz 谢谢!按照您的评论也为我解决了这个问题。
    【解决方案3】:

    尝试将postgres用户添加到组ssl-cert

    运行以下代码来解决您的问题:

    # > It happened to me and it turned out that I removed erroneously the postgres user from "ssl-cert" group, set it back with
    sudo gpasswd -a postgres ssl-cert
    
    # Fixed ownership and mode
    sudo chown root:ssl-cert  /etc/ssl/private/ssl-cert-snakeoil.key
    sudo chmod 740 /etc/ssl/private/ssl-cert-snakeoil.key
    
    # now postgresql starts! (and install command doesn't fail anymore)
    sudo /etc/init.d/postgresql start
    

    感谢GabLeRoux

    【讨论】:

    • 如果文件的权限设置正确,问题可能是由于层次结构上的父目录之一没有执行(x)权限。这是遍历指向文件的目录所必需的。
    • @Seth 非常感谢您提供“x”权限提示。帮我省了很多麻烦。
    【解决方案4】:

    我在尝试在远程 docker 实例上启动 Postgresql 时遇到了这个问题。我最终找到了疯狂的解决方案here。基本上你必须重新创建目录,它自己的 chown 不起作用:

    mkdir /etc/ssl/private-copy; mv /etc/ssl/private/* /etc/ssl/private-copy/; rm -r /etc/ssl/private; mv /etc/ssl/private-copy /etc/ssl/private; chmod -R 0700 /etc/ssl/private; chown -R postgres /etc/ssl/private
    

    【讨论】:

      【解决方案5】:

      我在 WSL 中运行 postgres 服务器,我遇到了 ssl-cert 文件的错误。我设法通过将文件的所有者更改为我创建的 postgres 用户来使其工作,根据应用程序的需要向用户添加预期的用户和组 ID(分别为 111 和 116,从有用的错误消息中收集) ,瞧,我在 WSL 中有一个活动服务器。

      sudo useradd postgres
      sudo usermod -u 111 -g 116 -a -G ssl-cert postgres
      sudo chown postgres /etc/ssl/private/ssl-cert-snakeoil.key
      

      运行上述程序后,运行服务器的用户(对我来说是 postgres)还有两个文件需要访问权限,它们都位于 /var/postgresql。我使用sudo chown -- 两次以上将所有权授予postgres。运行 sudo service postgresql start 将通过任何错误消息告诉您需要转移哪些文件的所有权。

      【讨论】:

        【解决方案6】:

        只有在您更改了 /etc/ssl/private 的权限后才会起作用

        mkdir /etc/ssl/private-copy; mv /etc/ssl/private/* /etc/ssl/private-copy/; rm -r /etc/ssl/private; mv /etc/ssl/private-copy /etc/ssl/private; chmod -R 0700 /etc/ssl/private; chown -R postgres /etc/ssl/private
        

        复制整个命令(这是一行代码)。

        如果这对您不起作用,请通过 groups postgres 检查您的 postgres 用户组,并确保您的 postgres 用户具有 ssl-cert root postgres(顺序无关紧要)。

        现在让我们检查您在 ssl/private 上的文件权限:

        $ ls -la /etc/ssl/
        > drwx------   2 postgres root private
        

        如果这不是输出,请使用 sudo chmod -R 700 /etc/ssl/private 和所有者 chown -R postgres:root /etc/ssl/private 更改您的权限

        //Now check permissions on ssl-cert-snakeoil.key, 
        //which will be inside your **private** directory.
        $ ls -la /etc/ssl/private/ssl-cert-snakeoil.key
        > -rwx------ 1 postgres root /etc/ssl/private/ssl-cert-snakeoil.key
        

        【讨论】:

          【解决方案7】:

          我在/etc/ssl/private 下还有其他证书,因此,递归更改权限是不可能的。

          我尝试将postgres 用户添加到ssl-cert 组,但也没有用。

          我把/etc/ssl/private的权限修改为716,基本上是说除了root(用户)和ssl-cert(组)以外的任何人都可以读取和执行该目录。

          sudo chmod 716 /etc/ssl/private

          然后,我修改了ssl-cert-snakeoil.key的所有权

          sudo chown postgres:postgres /etc/ssl/private/ssl-cert-snakeoil.key

          这对我有用,基本上是@devops 和@Noushad 的答案的组合

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-10
            • 2014-07-02
            • 2019-04-14
            • 1970-01-01
            • 1970-01-01
            • 2018-11-06
            • 2016-01-31
            相关资源
            最近更新 更多