假设有一个 PostgreSQL 服务器正在运行并且它启用了 SSL。使用“标准”Linux 和 PostgreSQL 工具,我如何检查其 SSL 证书?
我希望输出类似于您从运行中获得的输出openssl x509 -text ...
。我希望有一个或两个命令行的答案,所以我不必求助于运行数据包嗅探器。
我无权访问 PostgreSQL 服务器,因此无法直接查看其配置文件。
我没有超级用户登录,所以我无法获取设置的值,ssl_cert_file
然后pg_read_file
就可以了。
使用openssl s_client -connect ...
不起作用,因为 PostgreSQL 似乎不想立即进行 SSL 握手。
通过快速查看psql
文档,我找不到使其在启动时显示该信息的命令行参数。(尽管它确实向我显示了某些密码信息。)
看起来 OpenSSL 的
s_client
工具-starttls
在 1.1.1 中添加了 Postgres 支持,因此您现在可以使用 OpenSSL 命令行工具的全部功能而无需额外的帮助脚本:参考:
按照克雷格·林格评论中的想法:
...我写了一个简单的 SSL 套接字工厂。我复制了 PgJDBC 自己的
NonValidatingFactory
类的代码,只是添加了代码来打印证书。这是它的样子,当一切都说完了:
如果你不想安装 java 和编译,并且你已经有了 python,你可以试试这个 python 脚本:https ://github.com/thusoy/postgres-mitm/blob/master/postgres_get_server_cert.py
我用它来检查证书日期:
或将完整证书作为文本:
csd的回答真的救了我。对于我们这些不了解或忘记 java 的人来说,这里有一个更详细的演练。
确保你的服务器可以编译java。尝试命令“which javac”,如果它输出类似“... no javac in ...”,那么您需要安装 JDK(JRE 不起作用,它有“java”但没有“javac”)。
如果您还没有 postgresql-jdbc,请安装它。对于 RHEL6,命令是“yum install postgresql-jdbc”。找出 jar 文件的安装位置。会有几个,每个版本一个。我使用了“/usr/share/java/postgresql-jdbc3.jar”。
复制 csd 的代码并插入数据库信息(另一个答案),或者在这个答案的末尾使用我稍微修改过的版本。将其保存在一个名为“ShowPostgreSQLCert.java”的文件中。大写/小写很重要,将其称为其他任何内容,它都不会编译。
在包含 ShowPostgreSQLCert.java 文件的目录中,运行以下命令(根据需要修改 postgresql-jdbc3.jar 的位置):“javac -cp /usr/share/java/postgresql-jdbc3.jar ShowPostgreSQLCert.java”。您现在应该在同一目录中有 3 个 .class 文件。
最后,运行以下命令:“java -cp .:/usr/share/java/postgresql-jdbc3.jar ShowPostgreSQLCert”。这 ”。” 在“-cp”之后意味着它应该在当前目录中查找 .class 文件。您可以在此处插入类文件的完整路径,只需记住在路径和 .jar 文件的位置之间保留“:”。
如果您需要在不同的机器上运行命令,您需要安装相同的 jar 文件(postgresql-jdbc3.jar),或者您可以从编译 .class 文件的服务器上复制它。然后只需复制 .class 文件并在修改路径后运行 5. 中的命令。
我稍微修改了代码,以便您可以在命令行上传递数据库信息,而不是将其编译到 .class 文件中。只需不带任何参数运行它,它就会显示一条消息,显示它期望的参数。csd的代码+修改为:
我从https://stackoverflow.com/questions/3313020/write-x509-certificate-into-pem-formatted-string-in-java添加了一些代码以将证书输出为 PEM,并消除了指定数据库的需要,用户名或密码(获取证书不需要它们)。
使用它,我能够验证是否需要重新启动 PostgreSQL 才能切换到新证书。
不是Java开发人员,我构建和运行的步骤可能不是那么好,但它们可以工作,只要你能找到一个postgresql jdbc
编译:
跑步:
样本输出:
资源: