Postgresql
如何檢查 PostgreSQL 伺服器的 SSL 證書?
假設有一個 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 命令行工具的全部功能而無需額外的幫助腳本:openssl s_client -starttls postgres -connect my.postgres.host:5432 # etc...
參考:
按照克雷格·林格評論中的想法:
一種選擇是
openssl s_client
使用 PostgreSQL 協議修補握手。您也可以通過將自定義 SSLSocketFactory 傳遞給 PgJDBC 來使用 Java 來實現。我不確定是否有任何簡單的選項。…我寫了一個簡單的 SSL 套接字工廠。我複制了 PgJDBC 自己的
NonValidatingFactory
類的程式碼,只是添加了程式碼來列印證書。這是它的樣子,當一切都說完了:
import java.security.GeneralSecurityException; import java.security.cert.X509Certificate; import java.sql.Connection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.postgresql.ds.PGSimpleDataSource; import org.postgresql.ssl.WrappedFactory; public class ShowPostgreSQLCert { public static void main(String[] args) throws Throwable { PGSimpleDataSource ds = new PGSimpleDataSource(); ds.setServerName( ... ); ds.setSsl(true); ds.setUser( ... ); ds.setDatabaseName( ... ); ds.setPassword( ... ); ds.setSslfactory(DumperFactory.class.getName()); try (Connection c = ds.getConnection()) { } } public static class DumperFactory extends WrappedFactory { public DumperFactory(String arg) throws GeneralSecurityException { SSLContext ctx = SSLContext.getInstance("TLS"); ctx.init(null, new TrustManager[] { new DumperTM() }, null); _factory = ctx.getSocketFactory(); } } public static class DumperTM implements X509TrustManager { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { for (int i=0; i<certs.length; ++i) { System.out.println("Cert " + (i+1) + ":"); System.out.println(" Subject: " + certs[i].getSubjectX500Principal().getName()); System.out.println(" Issuer: " + certs[i].getIssuerX500Principal().getName()); } } } }