পোস্টগ্রিএসকিউএল সার্ভারের এসএসএল শংসাপত্র কীভাবে পরীক্ষা করবেন?


14

ধরুন এখানে কোনও পোস্টগ্রিসএসকিউএল সার্ভার চলছে এবং এতে এসএসএল সক্ষম করা আছে। "স্ট্যান্ডার্ড" লিনাক্স এবং পোস্টগ্রিএসকিউএল সরঞ্জামগুলি ব্যবহার করে, আমি কীভাবে এর এসএসএল শংসাপত্রটি পরীক্ষা করতে পারি?

আপনি চালিয়ে যা পাবেন তার অনুরূপ আউটপুট আশা করছি openssl x509 -text ...। এবং আমি এক বা দুই-লাইনার কমান্ড লাইন উত্তরের জন্য প্রত্যাশা করছি যাতে আমার কোনও প্যাকেট স্নিফার চালাতে হবে না।

পোস্টগ্র্রেএসকিউএল সার্ভারে আমার অ্যাক্সেস নেই, তাই আমি এর কনফিগারেশন ফাইলগুলি সরাসরি দেখতে পারি না।

আমার কাছে একটি সুপারসউসার লগইন নেই, তাই আমি ssl_cert_fileসেটিংসের মান এবং তারপরে pg_read_fileএটি পেতে পারি না ।

ব্যবহার করা কার্যকর openssl s_client -connect ...হয় না কারণ পোস্টগ্রিসকিউএল এখনই এসএসএল হ্যান্ডশেক করতে চাইছে বলে মনে হচ্ছে না।

psqlডকুমেন্টেশনের তাত্ক্ষণিক নজর থেকে , আমি কোনও কমান্ড-লাইন প্যারামিটার খুঁজে পাইনি যা এটি সূচনাতে সেই তথ্যটি দেখায়। (যদিও এটি আমাকে কিছু নির্দিষ্ট সিফার তথ্য দেখায়))

উত্তর:


7

দেখে মনে হচ্ছে ওপেনএসএসএল-এর s_clientসরঞ্জামটি -starttls1.1.1-এ ব্যবহার করে পোস্টগ্রাস সমর্থন যুক্ত করেছে , সুতরাং আপনি এখন অতিরিক্ত সহায়ক স্ক্রিপ্ট ছাড়াই ওপেনএসএসএল-এর কমান্ড লাইন সরঞ্জামগুলির সম্পূর্ণ শক্তি ব্যবহার করতে পারেন:

openssl s_client -starttls postgres -connect my.postgres.host:5432 # etc...

তথ্যসূত্র:


10

ক্রেগ রিঞ্জার এর মন্তব্যে এই ধারণাটি অনুসরণ করে:

একটি বিকল্প openssl s_clientপোস্টগ্র্রেএসকিউএল প্রোটোকল দিয়ে প্যাচ টু হ্যান্ডশেক করা। আপনি সম্ভবত এটি জাভা দিয়ে করতে পারেন, পিজিজেডিবিসিতে একটি কাস্টম এসএসএসকেটফ্যাক্টরি পাস করে। আমি নিশ্চিত যে কোনও সহজ বিকল্প আছে।

... আমি একটি সাধারণ এসএসএল সকেট কারখানা লিখেছি। আমি পিজজেডিবিসির নিজস্ব 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());
            }
        }
    }
}


দারুণ ধন্যবাদ পিজি সিম্পলডেটা সোর্স ব্যবহার করতে না চাওয়ার লোকদের জন্য। এখানে সাধারণ জেডিবিসি ড্রাইভার সেটআপ ব্যবহারের জন্য বৈকল্পিক: String connectionURL = "jdbc:postgresql://server:62013/dbname"; Properties props = new Properties(); props.setProperty("user", "username"); props.setProperty("password", "password"); props.setProperty("ssl", "true"); props.setProperty("sslfactory", DumperFactory.class.getName()); Connection con = null; // Load the Driver class. Class.forName("org.postgresql.Driver"); con = DriverManager.getConnection(connectionURL, props);
মার্কাস

7

আপনি যদি জাভা ইনস্টল এবং সংকলন নিয়ে মাথা ঘামাতে না চান এবং আপনার ইতিমধ্যে পাইথন রয়েছে, আপনি এই অজগর স্ক্রিপ্টটি চেষ্টা করতে পারেন: https://github.com/thusoy/postgres-mitm/blob/master/postgres_get_server_cert.py

আমি এটি শংসাপত্রের তারিখগুলি পরীক্ষা করতে ব্যবহার করি:

postgres_get_server_cert.py example.com:5432 | openssl x509 -noout -dates

বা পাঠ্য হিসাবে সম্পূর্ণ শংসাপত্রের জন্য:

postgres_get_server_cert.py example.com:5432 | openssl x509 -noout -text

1
এটি ইনস্টল না করেই ব্যবহার করার জন্য: curl https://raw.githubusercontent.com/thusoy/postgres-mitm/master/postgres_get_server_cert.py | python - example.com:5432(তবে আপনি কী
এভাবে চালাবেন

3

সিএসডি এর উত্তর আমাকে সত্যই বাঁচিয়েছে। আমাদের মধ্যে যারা জাভা জানেন না বা ভুলে গেছেন তাদের জন্য এখানে আরও বিশদ ওয়াকথ্রু রয়েছে।

  1. আপনার সার্ভার জাভা সংকলন করতে পারে তা নিশ্চিত করুন। "কোন জাভ্যাক" কমান্ডটি ব্যবহার করে দেখুন, যদি এটি "... কোনও জাভ্যাক ইন ..." এর মতো কিছু না করে দেয় তবে আপনাকে একটি জেডিকে ইনস্টল করতে হবে (জেআরই কাজ করবে না, এতে "জাভা" আছে তবে "জাভাক" নয়)।

  2. Postgresql-jdbc ইনস্টল করুন যদি তা ইতিমধ্যে আপনার কাছে না থাকে। আরএইচইএল 6 এর জন্য কমান্ডটি হ'ল "yum install postgresql-jdbc"। জার ফাইলগুলি কোথায় ইনস্টল করা হয়েছে তা নির্ধারণ করুন। সেগুলির বেশ কয়েকটি থাকবে, প্রতিটি সংস্করণের জন্য একটি। আমি "/usr/share/java/postgresql-jdbc3.jar" ব্যবহার করেছি।

  3. সিএসডি কোডটি অনুলিপি করুন এবং ডাটাবেস তথ্য সন্নিবেশ করুন (অন্য উত্তর), অথবা এই উত্তরটির শেষে আমার সামান্য পরিবর্তিত সংস্করণ ব্যবহার করুন। একেবারে "শোপস্টগ্রিএসকিউএলসিআর্ট.জাভা" নামক একটি ফাইলে সংরক্ষণ করুন। উচ্চ / ছোট হাতের বিষয়গুলি, এটিকে অন্য যে কোনও বিষয়ে কল করুন এবং এটি সংকলন করবে না।

  4. শোপোস্টগ্রিসএসকিউএলসিআর্ট.জাভা ফাইল সহ ডিরেক্টরিতে, নিম্নলিখিত কমান্ডটি চালান (প্রয়োজন হলে postgresql-jdbc3.jar এর অবস্থানটি পরিবর্তন করুন): "জাভ্যাক-সিপি / আরএসআর / শ্যাটার / জাভা / পোস্টগ্রেসক্লাল-jdbc3.jar শোপোস্টগ্রেএসকিউএলসিআরটি.জাভা"। আপনার এখন একই ডিরেক্টরিতে 3। ক্লাস ফাইল থাকা উচিত।

  5. অবশেষে, নিম্নলিখিত কমান্ডটি চালান: "জাভা -cp।: / Usr / share / java / postgresql-jdbc3.jar শোপোস্টগ্রেএসকিউএলকিয়ার্ট"। দ্য "." "-cp" এর পরে এটি .class ফাইলগুলির জন্য বর্তমান ডিয়ারের দিকে তাকাতে হবে। আপনি এখানে ক্লাস ফাইলগুলির পুরো পথটি সন্নিবেশ করতে পারেন, "জার্নাল" ফাইলটি পথ এবং অবস্থানের মধ্যে রাখার জন্য কেবল মনে রাখবেন।

  6. আপনার যদি অন্য কোনও মেশিনে কমান্ডটি চালানোর দরকার হয় তবে আপনার একই জার ফাইলটি ইনস্টল করতে হবে (postgresql-jdbc3.jar), অথবা আপনি সম্ভবত .class ফাইলগুলি সংকলিত সার্ভার থেকে এটি অনুলিপি করতে পারেন। তারপরে কেবল .class ফাইলগুলি অনুলিপি করুন এবং পাথগুলি সংশোধন করার পরে 5 থেকে কমান্ডটি চালান।

আমি কোডটি কিছুটা সংশোধন করেছিলাম যাতে আপনি .class ফাইলটিতে সংকলনের পরিবর্তে কমান্ড লাইনে ডাটাবেস তথ্য পাস করতে পারেন। কেবল কোনও যুক্তি ছাড়াই এটি চালান এবং এটি কোনও বার্তা প্রদর্শন করবে যা দেখায় যে এটি কোন যুক্তি প্রত্যাশা করে। সিএসডি এর কোড + পরিবর্তনগুলি হ'ল:

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();
        if( args.length != 4 ) {
            System.out.println("Not enough arguments. Usage: ShowPostgreSQLCert ServerName User DatabaseName Password");
            System.exit(1);
        }
        ds.setServerName( args[0] );
        ds.setSsl(true);
        ds.setUser( args[1] );
        ds.setDatabaseName( args[2] );
        ds.setPassword( args[3] );
        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());
            }
        }
    }
}

1

আমি /programming/3313020/write-x509-certificate-into-pem-formatted-string-in-java থেকে শংসাপত্রগুলিকে পিইএম হিসাবে আউটপুট দেওয়ার জন্য কিছু কোড যুক্ত করেছি এবং একটি ডিবি নির্দিষ্ট করার প্রয়োজনীয়তা সরিয়েছি, ব্যবহারকারীর নাম বা পাসওয়ার্ড (তাদের শংসাপত্র পাওয়ার প্রয়োজন নেই)।

এটি ব্যবহার করে, আমি যাচাই করতে সক্ষম হয়েছি যে পোস্টগ্রেএসকিউএল পুনরায় চালু করা দুর্ভাগ্যবশত নতুন শংসাপত্রে স্যুইচ করার প্রয়োজন বলে মনে হচ্ছে না।

জাভা বিকাশকারী না হয়ে, আমার তৈরি এবং চালানোর জন্য আমার পদক্ষেপগুলি সম্ভবত এত দুর্দান্ত নয়, তবে তারা কাজ করে, আপনি যতক্ষণ পোস্টগ্রেসকিএল খুঁজে পেতে পারেন jdbc

# locate postgresql | grep jar
/path/to/a/lib/postgresql-9.1-901-1.jdbc4.jar   <-- this one will do
...

সংকলন করতে:

javac -cp /path/to/a/lib/postgresql-9.1-901-1.jdbc4.jar ./ShowPostgreSQLCert.java

চালানোর জন্য:

java -cp /path/to/a/lib/postgresql-9.1-901-1.jdbc4.jar:. ShowPostgreSQLCert 127.0.0.1

নমুনা আউটপুট:

Cert 1:
    Subject: CN=...
    Issuer: CN=...
    Not Before: Fri Oct 21 11:14:06 NZDT 2016
    Not After: Sun Oct 21 11:24:00 NZDT 2018
-----BEGIN CERTIFICATE-----
MIIHEjCCBfqgAwIBAgIUUbiRZjruNAEo2j1QPqBh6GzcNrwwDQYJKoZIhvcNAQEL
...
IcIXcVQxPzVrpIDT5G6jArVt+ERLEWs2V09iMwY7//CQb0ivpVg=
-----END CERTIFICATE-----

Cert 2:
...

উৎস:

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;

import javax.xml.bind.DatatypeConverter;
import java.security.cert.X509Certificate;
import java.io.StringWriter;

public class ShowPostgreSQLCert {
    public static void main(String[] args) throws Throwable {
        PGSimpleDataSource ds = new PGSimpleDataSource();
        if( args.length != 1 ) {
            System.out.println("Not enough arguments.");
            System.out.println("Usage: ShowPostgreSQLCert ServerName");
            System.exit(1);
        }
        ds.setServerName( args[0] );
        ds.setSsl(true);
        ds.setUser( "" );
        ds.setDatabaseName( "" );
        ds.setPassword( "" );
        ds.setSslfactory(DumperFactory.class.getName());
        try (Connection c = ds.getConnection()) { }
        catch (org.postgresql.util.PSQLException e) {
            // Don't actually want to login
        }
    }

    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 String certToString(X509Certificate cert) {
        StringWriter sw = new StringWriter();
        try {
            sw.write("-----BEGIN CERTIFICATE-----\n");
            sw.write(DatatypeConverter.printBase64Binary(cert.getEncoded()).replaceAll("(.{64})", "$1\n"));
            sw.write("\n-----END CERTIFICATE-----\n");
        } catch (java.security.cert.CertificateEncodingException e) {
            e.printStackTrace();
        }
        return sw.toString();
    }

    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());
                System.out.println("    Not Before: " + certs[i].getNotBefore().toString());
                System.out.println("    Not After: " + certs[i].getNotAfter().toString());

                System.out.println(certToString(certs[i]));
            }
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.