টমক্যাট কি পুনরায় আরম্ভ না করেই তার এসএসএল শংসাপত্র পুনরায় লোড করতে পারে?


11

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

টমক্যাটটি পুনরায় আরম্ভ না করে এটিকে পুনরায় লোড করা সম্ভব, বা এর পরিবর্তে কোনও প্রোগ্রামিক উপায় আছে যা এটি করা যেতে পারে?

উত্তর:


6

আমি বিশ্বাস করি না যে এটির স্বয়ংক্রিয়ভাবে করার একটি উপায় আছে যদিও আপনার ব্যাকগ্রাউন্ড প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে টমক্যাটটি পুনরায় চালু করতে পারে। Jvm আরম্ভ করার পরে কীস্টোরটি একবারে পঠিত হয়। আপনি যদি নিজের নিজস্ব হ্যান্ডলার লিখতে থাকেন যে সময়ে সময়ে কীস্টোরটি পুনরায় পরীক্ষা করে দেখেন তবে ব্যক্তিগতভাবে আমি ইন্টারনেটে এর কোনও উদাহরণ পাই নি।


8

আপনি আপনার jssecacert ফাইল পরিবর্তন করার পরে পৃথক টমক্যাট সংযোগকারী পুনরায় আরম্ভ করতে পারেন 84 8443 এর মত পোর্ট পুনরায় চালু করা সম্ভব।

আমি শংসাপত্রগুলি যুক্ত / মোছার পরে টমক্যাট সংযোগকারীগুলিকে পুনঃসূচনা করার জন্য যে সম্পূর্ণ কোড / পদ্ধতিটি ব্যবহার করছি তা এখানে।

// Stop and restart the SSL connection so that the tomcat server will
// re-read the certificates from the truststore file.
public void refreshTrustStore() throws Exception 
{
    try 
    {
        //following line should be replaced based on where you get your port number. You may pass in as argument to this method
        String httpsPort = configurationManager.getHttpsPort();
        String objectString = "*:type=Connector,port=" + httpsPort + ",*";

        final ObjectName objectNameQuery = new ObjectName(objectString); 

        for (final MBeanServer server: MBeanServerFactory.findMBeanServer(null))
        {
            if (!server.queryNames(objectNameQuery, null).isEmpty())
            {
                MBeanServer mbeanServer = server;
                ObjectName objectName = (ObjectName) server.queryNames(objectNameQuery, null).toArray()[0];

                mbeanServer.invoke(objectName, "stop", null, null);

                // Polling sleep to reduce delay to safe minimum.
                // Use currentTimeMillis() over nanoTime() to avoid issues
                // with migrating threads across sleep() calls.
                long start = System.currentTimeMillis();
                // Maximum of 6 seconds, 3x time required on an idle system.
                long max_duration = 6000L;
                long duration = 0L;
                do
                {
                    try
                    {
                        Thread.sleep(100);
                    }
                    catch (InterruptedException e)
                    {
                        Thread.currentThread().interrupt();
                    }

                    duration = (System.currentTimeMillis() - start);
                } while (duration < max_duration &&
                        server.queryNames(objectNameQuery, null).size() > 0);

                // Use below to get more accurate metrics.
                String message = "TrustStoreManager TrustStore Stop: took " + duration + "milliseconds";
                logger.information(message);

                mbeanServer.invoke(objectName, "start", null, null);

                break;
            }
        }
    } 
    catch (Exception exception) 
    {
        // Log and throw exception
            throw exception
    }
}

1
সংযোজকটি bindOnInit="false"বিকল্পের সাথে কনফিগার করা থাকলে এটি কাজ করবে ।
anilech

4

টমক্যাট ভি 8.5.24 দিয়ে শুরু করার এটির একটি উপায় রয়েছে।

তারা নামকরণের 2 পদ্ধতি চালু করেছে:

  1. reloadSslHostConfig (স্ট্রিং হোস্টনাম) - একটি নির্দিষ্ট হোস্ট পুনরায় লোড করতে
  2. পুনরায় লোড এসএসএলহস্টকনফিজ () - সমস্ত পুনরায় লোড করুন

তাদের বিভিন্ন উপায়ে বলা যেতে পারে:

  1. জেএমএক্স ব্যবহার করছি
  2. ব্যবস্থাপক পরিষেবা ব্যবহার করে (টমক্যাট v9.xx এ)
  3. কাস্টম প্রোটোকল তৈরি করে - আমি আমার গবেষণার সময় এইভাবে খুঁজে পেয়েছি

টমক্যাট ডক্সে উপায় 1 এবং উপায় 2 এর বিশদ সহজেই পাওয়া যায়।

উপায় 3 ব্যবহার সম্পর্কে কীভাবে যেতে হবে তার বিশদ:

  1. উদাহরণস্বরূপ আপনার পছন্দসই প্রোটোকল প্রসারিত একটি শ্রেণি করুন। Http11NioProtocol
  2. প্রয়োজনীয় পদ্ধতিগুলি ওভাররাইড করুন এবং ডিফল্ট আচরণ রাখতে কেবল তাদের মধ্যে সুপার কল করুন
  3. এই পুনরায় লোড এসএসএলહોস্টকনফিগস পদ্ধতিটি সময়ে সময়ে কল করতে এই শ্রেণিতে একটি থ্রেড তৈরি করুন
  4. এই ক্লাসটিকে একটি পাত্রে প্যাকেজ করুন এবং সেই জারটি টমক্যাটের লিব ফোল্ডারে রাখুন
  5. এই কাস্টম সংজ্ঞায়িত প্রোটোকলটি ব্যবহার করতে সার্ভার.এক্সএমএল সংযোগকারীতে প্রোটোকল সম্পাদনা করুন

নীচে নমুনা কোড খুঁজুন:

প্রধান প্রোটোকল শ্রেণি:

package com.myown.connector;

import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentMap;

import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.net.ssl.SSLSessionContext;

import org.apache.coyote.http11.Http11NioProtocol;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.modeler.Registry;
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.AbstractJsseEndpoint;
import org.apache.tomcat.util.net.GetSslConfig;
import org.apache.tomcat.util.net.SSLContext;
import org.apache.tomcat.util.net.SSLHostConfig;
import org.apache.tomcat.util.net.SSLHostConfigCertificate;
import org.apache.tomcat.util.net.SSLImplementation;
import org.apache.tomcat.util.net.SSLUtil;

public class ReloadProtocol extends Http11NioProtocol {

    private static final Log log = LogFactory.getLog(Http12ProtocolSSL.class);

    public ReloadProtocol() {
        super();
        RefreshSslConfigThread refresher = new 
              RefreshSslConfigThread(this.getEndpoint(), this);
        refresher.start();
    }

    @Override
    public void setKeystorePass(String s) {
        super.setKeystorePass(s);
    }

    @Override
    public void setKeyPass(String s) {
        super.setKeyPass(s);
    }

    @Override
    public void setTruststorePass(String p) {
        super.setTruststorePass(p);
    }

    class RefreshSslConfigThread extends Thread {

        AbstractJsseEndpoint<?> abstractJsseEndpoint = null;
        Http11NioProtocol protocol = null;

        public RefreshSslConfigThread(AbstractJsseEndpoint<?> abstractJsseEndpoint, Http11NioProtocol protocol) {
            this.abstractJsseEndpoint = abstractJsseEndpoint;
            this.protocol = protocol;
        }

        public void run() {
            int timeBetweenRefreshesInt = 1000000; // time in milli-seconds
            while (true) {
                try {
                        abstractJsseEndpoint.reloadSslHostConfigs();
                        System.out.println("Config Updated");
                } catch (Exception e) {
                    System.out.println("Problem while reloading.");
                }
                try {
                    Thread.sleep(timeBetweenRefreshesInt);
                } catch (InterruptedException e) {
                    System.out.println("Error while sleeping");
                }
            }
        }
   }
}

সার্ভার.এক্সএমএলে সংযোগকারীটিকে প্রোটোকল হিসাবে এটি উল্লেখ করা উচিত:

<Connector protocol="com.myown.connector.ReloadProtocol"
 ..........

আশাকরি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.