Postgresql

如何檢查 PostgreSQL 伺服器的 SSL 證書?

  • July 20, 2021

假設有一個 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());
           }
       }
   }
}

引用自:https://dba.stackexchange.com/questions/108710