এসএসএল হ্যান্ডশেক সতর্কতা: জাভা 1.7.0 এ আপগ্রেড করার পর থেকে অজানা_নামের ত্রুটি


225

আমি আজ জাভা 1.6 থেকে জাভা 1.7 এ আপগ্রেড করেছি। তার পর থেকে যখন আমি এসএসএলের মাধ্যমে আমার ওয়েবসারভারের সাথে সংযোগ স্থাপনের চেষ্টা করি তখন একটি ত্রুটি ঘটে:

javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
    at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1288)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1904)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1296)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at java.net.URL.openStream(URL.java:1035)

কোডটি এখানে:

SAXBuilder builder = new SAXBuilder();
Document document = null;

try {
    url = new URL(https://some url);
    document = (Document) builder.build(url.openStream());
} catch (NoSuchAlgorithmException ex) {
    Logger.getLogger(DownloadLoadiciousComputer.class.getName()).log(Level.SEVERE, null, ex);  
}

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

TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {

        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {
        }

        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {
        }
    }
};

try {

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {

    Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, e);
} 

আমি সফলভাবে https://google.com এ সংযোগ দেওয়ার চেষ্টা করেছি । আমার দোষ কোথায়?

ধন্যবাদ।

উত্তর:


304

জাভা 7 এসএনআই সমর্থন চালু করেছে যা ডিফল্টরূপে সক্ষম হয় enabled আমি জানতে পেরেছি যে কয়েকটি ভুল কনফিগার্ড সার্ভারগুলি এসএসএল হ্যান্ডশেকটিতে একটি "অজানা নাম" সতর্কতা প্রেরণ করে যা জাভা বাদে বেশিরভাগ ক্লায়েন্টদের দ্বারা উপেক্ষা করা হয়। @ بابি কার্নস যেমন উল্লেখ করেছেন, ওরাকল ইঞ্জিনিয়াররা এই বাগ / বৈশিষ্ট্যটিকে "ঠিক" করতে অস্বীকার করেছেন।

কর্মহীন হিসাবে, তারা jsse.enableSNIExtensionসম্পত্তি সেট করার পরামর্শ দেয় । আপনার প্রোগ্রামগুলিকে পুনরায় সংকলন না করে কাজ করার অনুমতি দেওয়ার জন্য আপনার অ্যাপ্লিকেশনটি চালনা করুন:

java -Djsse.enableSNIExtension=false yourClass

সম্পত্তিটি জাভা কোডেও সেট করা যেতে পারে তবে এটি কোনও এসএসএল ক্রিয়াকলাপের আগে সেট করে রাখতে হবে । এসএসএল লাইব্রেরিটি লোড হয়ে গেলে আপনি সম্পত্তিটি পরিবর্তন করতে পারেন, তবে এটি এসএনআই স্থিতির উপর কোনও প্রভাব ফেলবে না । রানটাইম (পূর্বোক্ত সীমাবদ্ধতা সহ) এসএনআই অক্ষম করতে, ব্যবহার করুন:

System.setProperty("jsse.enableSNIExtension", "false");

এই পতাকাটি স্থাপনের অসুবিধা হ'ল অ্যাপ্লিকেশনের যে কোনও জায়গায় এসএনআই অক্ষম। এসএনআই ব্যবহার করতে এবং এখনও ভুল কনফিগার্ড সার্ভারগুলিকে সমর্থন করার জন্য:

  1. SSLSocketআপনি সংযুক্ত হতে চান এমন হোস্টের নাম সহ একটি তৈরি করুন । এর নাম দিন sslsock
  2. চালানোর চেষ্টা করুন sslsock.startHandshake()। এটি সম্পন্ন না হওয়া পর্যন্ত এটি অবরুদ্ধ হবে বা ত্রুটিতে একটি ব্যতিক্রম ছুঁড়ে দেবে। যখনই কোনও ত্রুটি ঘটেছে startHandshake(), ব্যতিক্রম বার্তাটি পান। যদি এটির সমান হয় handshake alert: unrecognized_name, তবে আপনি একটি ভুল কনফিগার্ড সার্ভার পেয়েছেন।
  3. আপনি যখন unrecognized_nameসতর্কবার্তাটি পেয়েছেন (জাভাতে মারাত্মক), একবার খোলার চেষ্টা করুন SSLSocket, তবে এবার কোনও হোস্টের নাম ছাড়াই। এটি কার্যকরভাবে এসএনআইকে অক্ষম করে (সর্বোপরি, এসএনআই এক্সটেনশন ক্লায়েন্টহেলো বার্তায় একটি হোস্টের নাম যুক্ত করার বিষয়ে রয়েছে)।

ওয়েবসাইটকারব এসএসএল প্রক্সির জন্য, এই প্রতিশ্রুতি পতিত-ব্যাক সেটআপ প্রয়োগ করে।


5
এটি কাজ করে, ধন্যবাদ! এইচটিটিপিএসের মাধ্যমে সংযোগ করার সময় ইন্টেলিজ আইডিইএ সাবভার্সন ক্লায়েন্টের একই ত্রুটি ছিল। লাইনের সাথে আইডিয়া.এক্স.ইভি.মোপশন ফাইলটি আপডেট করতে হবে: -ডজেস.ইনেবল এসএনআই এক্সটেনশন = মিথ্যা
ডিমা

2
জাভা ওয়েবস্টার্টটির জন্য এটি ব্যবহার করুন: জাবাউস-জে-ডিজেসি.এনেবল এসএনআইএক্সটেনশান = মিথ্যা আপনার ক্লাস
টর্স্টেন

আমার জার্সি ক্লায়েন্টের সাথে https রেস্ট সার্ভারের সাথে আমার ঠিক একই সমস্যা ছিল। আমি আপনার কৌশলটি ব্যবহার করেছি এবং এটি কার্যকর হয়েছে! ধন্যবাদ!
শাহশি 15

4
জাভা 8 সম্পর্কে যারা ভাবছেন তাদের জন্য, ওরাকল এখনও আচরণটি পরিবর্তন করেন নি এবং এখনও প্রোগ্রামারকে এমন সার্ভারগুলি ধরার জন্য প্রয়োজন যা সঠিকভাবে এসএনআই সমর্থন করে না: ডকসস.অরাকল.com
লেকেনস্টেইন

2
@ ব্লাউহিরন আপনার ওয়েবহোস্ট সমর্থনে যোগাযোগ করুন, তাদের কনফিগারেশনটি ঠিক করা উচিত। যদি তারা অ্যাপাচি ব্যবহার করে তবে কিছু পরিবর্তন প্রয়োজন যা নীচের দিকে দেখুন।
লেকেনস্টেইন

89

আমি একই সমস্যাটি বিশ্বাস করি তা আমার ছিল। আমি দেখতে পেয়েছি যে হোস্টের জন্য একটি সার্ভারনাম বা সার্ভারএলিয়াস অন্তর্ভুক্ত করতে আমার অ্যাপাচি কনফিগারেশনটি সামঞ্জস্য করতে হবে।

এই কোড ব্যর্থ হয়েছে:

public class a {
   public static void main(String [] a) throws Exception {
      java.net.URLConnection c = new java.net.URL("https://mydomain.com/").openConnection();
      c.setDoOutput(true);
      c.getOutputStream();
   }
}

এবং এই কোডটি কাজ করেছে:

public class a {
   public static void main(String [] a) throws Exception {
      java.net.URLConnection c = new java.net.URL("https://google.com/").openConnection();
      c.setDoOutput(true);
      c.getOutputStream();
   }
}

ওয়্যারশার্ক প্রকাশ করেছেন যে টিএসএল / এসএসএল চলাকালীন সতর্কতা সতর্কতা (স্তর: সতর্কতা, বিবরণ: অজানা নাম), সার্ভার থেকে ক্লায়েন্টের কাছে সার্ভার হ্যালো পাঠানো হচ্ছিল। এটি কেবলমাত্র একটি সতর্কতা ছিল, তবে জাভা .1.১ এর সাথে সাথে একটি "মারাত্মক, বিবরণ: অপ্রত্যাশিত বার্তা" দিয়ে প্রতিক্রিয়া জানায়, যার অর্থ আমি ধরে নিয়েছি জাভা এসএসএল লাইব্রেরিগুলি অপরিচিত নামটির সতর্কতাটি দেখতে পছন্দ করে না।

উইকি অন ট্রান্সপোর্ট লেয়ার সিকিউরিটি (টিএলএস) থেকে:

112 অচেনা নাম সতর্কতা কেবল টিএলএস; ক্লায়েন্টের সার্ভার নাম সূচকটি একটি হোস্টনাম নির্দিষ্ট করেছে যা সার্ভার দ্বারা সমর্থিত নয়

এটি আমাকে আমার অ্যাপাচি কনফিগারেশন ফাইলগুলি সন্ধান করতে পরিচালিত করেছিল এবং আমি দেখতে পেলাম যে আমি ক্লায়েন্ট / জাভা দিক থেকে প্রেরিত নামের জন্য কোনও সার্ভারনাম বা সার্ভারএলিয়াস যুক্ত করেছি, এটি কোনও ত্রুটি ছাড়াই সঠিকভাবে কাজ করেছে।

<VirtualHost mydomain.com:443>
  ServerName mydomain.com
  ServerAlias www.mydomain.com

3
এটি জাভার টিএলএস বাস্তবায়নের ক্ষেত্রে বাগের মতো দেখাচ্ছে।
পাওলো ইবারম্যান

1
আমি আসলে এটির জন্য একটি বাগ খোলাম। আমি এই নম্বরটি নির্ধারিত হয়েছি (এখনও দৃশ্যমান নয়): bugs.sun.com/bugdatedia/view_bug.do?bug_id=7127374
16

1
ধন্যবাদ, ServerAliasআমার জন্য একটি কাজ যুক্ত । আমি ওয়্যারশার্কে একই টিএলএস সতর্কতা দেখেছি।
জারেড বেক

2
এটি আমার পক্ষেও কাজ করেছিল। (আমি যদি এটি বিশ্বাস করি এবং অন্য কোনও পথের শিকার না করে আরও ভাল কাজ করতে পারি)
শেষ-ব্যবহারকারী

10
@ জোসেফশ্রেইবম্যান বলেছেন, ওরাকল কর্মচারী বোকা অনুচিত। আপনি যখন দুটি ব্যবহার করেন ServerName, আপাচি unrecognized_name সতর্কতা সতর্কতার সাথে প্রতিক্রিয়া জানায় (এটি একটি মারাত্মক সতর্কতাও হতে পারে )। আরএফসি 6066 যথাযথভাবে এই বিষয়টিতে এটি বলেছে: " সতর্কতা-স্তরের অজ্ঞাতনামা (112) সতর্কতা প্রেরণ করার প্রস্তাব দেওয়া হয় না, কারণ সতর্কতা-স্তরের সতর্কতার প্রতিক্রিয়াতে ক্লায়েন্টের আচরণ অনাকাঙ্ক্ষিত " " এই কর্মচারীর দ্বারা করা ভুলটি হ'ল এটি একটি মারাত্মক সতর্কতা ছিল। এটি যতটা জেআরই বাগ তেমনি এটি অ্যাপাচি এক।
ব্রুনো

36

আপনি সিস্টেম সম্পত্তি jsse.enableSNIExistance = মিথ্যা দিয়ে এসএনআই রেকর্ডগুলি প্রেরণ নিষ্ক্রিয় করতে পারেন।

আপনি যদি কোডটি পরিবর্তন করতে পারেন তবে এটি ব্যবহার করতে সহায়তা করে SSLCocketFactory#createSocket()(কোনও হোস্ট প্যারামিটার বা সংযুক্ত সকেট সহ নয়)। এই ক্ষেত্রে এটি কোনও সার্ভার_নাম ইঙ্গিত প্রেরণ করবে না।


11
যা System.setProperty ("jsse.enableSNIExtension", "false");
এরকমভাবে করা হয়

আমি খুঁজে পেয়েছি যে সবসময় কাজ করে না। আমি জানি না কেন এটি কিছু ক্ষেত্রে কাজ করে অন্যকে নয়।
জোসেফ শ্রাইবমান

2
আমার সাথে কাজ করে -Djsse.enableSNIExtension=false। তবে আর কী করে? এটি জাভাসের বাকী সুরক্ষার জন্য ক্ষতিকারক?
সিলিং

2
না এটির অর্থ হ'ল কিছু সাইট (বিশেষত ওয়েব সার্ভার) যা ভাগ করা আইপির পিছনে একাধিক হোস্টনাম ব্যবহার করে তা কী শংসাপত্র প্রেরণ করতে হবে তা জানে না। তবে যতক্ষণ না আপনার জাভা অ্যাপ্লিকেশনটিকে লক্ষ লক্ষ ওয়েবসাইটের সাথে সংযোগ স্থাপন করতে হবে তবে আপনার সেই বৈশিষ্ট্যের প্রয়োজন নেই। যদি আপনি এই জাতীয় সার্ভারের মুখোমুখি হন তবে আপনার শংসাপত্রের বৈধতা ব্যর্থ হতে পারে এবং সংযোগটি বাতিল হয়ে যায়। সুতরাং কোনও সুরক্ষা সমস্যা প্রত্যাশিত নয়।
eckes

17

আমরা একটি নতুন অ্যাপাচি সার্ভার বিল্ডেও এই ত্রুটিটি ছড়িয়েছি।

আমাদের ক্ষেত্রে ফিক্স একটি সংজ্ঞায়িত করতে ছিল ServerAliasমধ্যে httpd.confযে হোস্টনেম যে জাভা সংযোগ করার চেষ্টা করেছে অনুরূপ। আমাদেরServerName অভ্যন্তরীণ হোস্টের নাম সেট করা হয়েছিল। আমাদের এসএসএল শংসাপত্রটি বাহ্যিক হোস্টের নামটি ব্যবহার করছিল, তবে সতর্কতা এড়াতে এটি যথেষ্ট ছিল না।

ডিবাগ সাহায্য করতে, আপনি এই ssl কমান্ডটি ব্যবহার করতে পারেন:

openssl s_client -servername <hostname> -connect <hostname>:443 -state

যদি সেই হোস্টনামের সাথে সমস্যা হয়, তবে এটি বার্তাটি আউটপুটটির শীর্ষের নিকটে প্রিন্ট করবে:

SSL3 alert read: warning:unrecognized name

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


6
কীভাবে সমস্যাটি ব্যবহার করে পুনরুত্পাদন করতে হবে তার উদাহরণ অন্তর্ভুক্ত করার জন্য ধন্যবাদ openssl। এটা খুব সহায়ক।
sideshowbarker

2
কোনও ওপেনসেল ক্লায়েন্টের পক্ষে এই বার্তাটির উত্সের নামের পার্থক্যটি দেখার কোনও উপায় আছে কি SSL3 alert read: warning:unrecognized name? আমি সতর্কতাটি মুদ্রিত দেখতে পাচ্ছি, তবে আউটপুট আমাকে এই নামকরণের পার্থক্যটি দেখতে আসলে সহায়তা করে না
mox601

এটি আমার পক্ষে কাজ করে না। পরীক্ষিতOpenSSL 1.0.1e-fips 11 Feb 2013 , OpenSSL 1.0.2k-fips 26 Jan 2017এবং LibreSSL 2.6.5
গ্রেগ দুবিকি

15

অ্যাপাচে ডিফল্ট ভার্চুয়াল হোস্ট পদ্ধতিতে নির্ভর করার পরিবর্তে আপনি একটি সর্বশেষ ক্যাচল ভার্চুয়ালহোস্ট সংজ্ঞা দিতে পারেন যা একটি স্বেচ্ছাসেবক সার্ভারনাম এবং একটি ওয়াইল্ডকার্ড সার্ভারআলিয়াস ব্যবহার করে, যেমন

ServerName catchall.mydomain.com
ServerAlias *.mydomain.com

এইভাবে আপনি এসএনআই ব্যবহার করতে পারেন এবং অ্যাপাচি এসএসএল সতর্কতা ফিরে পাঠাবে না।

অবশ্যই, এটি কেবলমাত্র তখনই কার্যকর হয় যদি আপনি ওয়াইল্ডকার্ড সিনট্যাক্স ব্যবহার করে আপনার সমস্ত ডোমেন সহজেই বর্ণনা করতে পারেন।


আমি যতদূর বুঝতে পেরেছি, ক্লায়েন্ট সার্ভারনাম বা সার্ভারএলিয়াস হিসাবে কনফিগার না করা নামটি ব্যবহার করলে অ্যাপাচি কেবল এই সতর্কতাটি প্রেরণ করে। সুতরাং আপনার যদি ওয়াইল্ড কার্ড শংসাপত্র থাকে, হয় সমস্ত ব্যবহৃত সাব ডোমেন নির্দিষ্ট করে দিন বা *.mydomain.comসার্ভারআলিয়াসের জন্য বাক্য গঠন ব্যবহার করুন। মনে রাখবেন যে আপনি একাধিক উপকরণ ব্যবহার করে ServerAliasউদাহরণস্বরূপ যুক্ত করতে পারেন ServerAlias *.mydomain.com mydomain.com *.myotherdomain.com
মাইকেল প্যাসোল্ড

13

এটি দরকারী হতে হবে। অ্যাপাচি এইচটিটিপিপ্লায়েন্ট ৪.৪-এ একটি এসএনআই ত্রুটি পুনরায় চেষ্টা করার জন্য - আমরা সবচেয়ে সহজ উপায়টি নিয়ে এলাম ( HTTPCLIENT-1522 দেখুন ):

public class SniHttpClientConnectionOperator extends DefaultHttpClientConnectionOperator {

    public SniHttpClientConnectionOperator(Lookup<ConnectionSocketFactory> socketFactoryRegistry) {
        super(socketFactoryRegistry, null, null);
    }

    @Override
    public void connect(
            final ManagedHttpClientConnection conn,
            final HttpHost host,
            final InetSocketAddress localAddress,
            final int connectTimeout,
            final SocketConfig socketConfig,
            final HttpContext context) throws IOException {
        try {
            super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
        } catch (SSLProtocolException e) {
            Boolean enableSniValue = (Boolean) context.getAttribute(SniSSLSocketFactory.ENABLE_SNI);
            boolean enableSni = enableSniValue == null || enableSniValue;
            if (enableSni && e.getMessage() != null && e.getMessage().equals("handshake alert:  unrecognized_name")) {
                TimesLoggers.httpworker.warn("Server received saw wrong SNI host, retrying without SNI");
                context.setAttribute(SniSSLSocketFactory.ENABLE_SNI, false);
                super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
            } else {
                throw e;
            }
        }
    }
}

এবং

public class SniSSLSocketFactory extends SSLConnectionSocketFactory {

    public static final String ENABLE_SNI = "__enable_sni__";

    /*
     * Implement any constructor you need for your particular application -
     * SSLConnectionSocketFactory has many variants
     */
    public SniSSLSocketFactory(final SSLContext sslContext, final HostnameVerifier verifier) {
        super(sslContext, verifier);
    }

    @Override
    public Socket createLayeredSocket(
            final Socket socket,
            final String target,
            final int port,
            final HttpContext context) throws IOException {
        Boolean enableSniValue = (Boolean) context.getAttribute(ENABLE_SNI);
        boolean enableSni = enableSniValue == null || enableSniValue;
        return super.createLayeredSocket(socket, enableSni ? target : "", port, context);
    }
}

এবং

cm = new PoolingHttpClientConnectionManager(new SniHttpClientConnectionOperator(socketFactoryRegistry), null, -1, TimeUnit.MILLISECONDS);

আপনি যদি এইভাবে এটি করেন। আপনি কিভাবে মোকাবেলা করবেন verifyHostname(sslsock, target)মধ্যে SSLConnectionSocketFactory.createLayeredSocket? যেহেতু targetখালি স্ট্রিংয়ে পরিবর্তন করা হয়েছে, verifyHostnameসফল হতে যাচ্ছে না। আমি কি এখানে স্পষ্ট কিছু মিস করছি?
হাওজুন

2
এটি ঠিক ছিল, আমি যা খুঁজছিলাম, আপনাকে অনেক ধন্যবাদ! এসএনআই এবং সার্ভারগুলিকে সমর্থন করার মতো অন্য কোনও উপায় আমি খুঁজে পাইনি যা একই সাথে এই "অবিজ্ঞাত_নাম" সতর্কতার সাথে সাড়া দেয়।
করপ

আপনি যদি প্রক্সি সার্ভার ব্যবহার না করেন তবে এই সমাধানটি কাজ করে।
মোগল

ভেরিচোস্টনেস্ট () দিয়ে আরম্ভ করে অ্যাপাচি ক্লায়েন্ট কোডটি দিয়ে একটি সবেমাত্র দ্রুত ডিবাগ করার পরে, আমি দেখতে পাচ্ছি না যে এটি কীভাবে ডিফল্ট হোস্টনাম ভেরিফায়ার ব্যবহার করে কাজ করতে পারে। আমি সন্দেহ করি যে এই সমাধানটির জন্য হোস্টনাম যাচাইকরণ অক্ষম করা দরকার (যেমন একটি নুপহোস্টনেম ভেরিফায়ার ব্যবহার করা), যা ম্যান-ইন-মধ্য-আক্রমণের অনুমতি দেয় বলে কোনও ধারণা ভাল।
ফ্লাইংশিপ


6

বসন্ত বুট দিয়ে এই ইস্যুতে দৌড়ে এবং jvm 1.7 এবং 1.8 এর । এডাব্লুএস-তে, আমাদের কাছে সার্ভারনাম এবং সার্ভারআলিয়াসের সাথে মেলে পরিবর্তন করার বিকল্প নেই (তারা আলাদা) তাই আমরা নিম্নলিখিতটি করলাম:

ইন build.gradle আমরা নিম্নলিখিত যোগ করেছেন:

System.setProperty("jsse.enableSNIExtension", "false")
bootRun.systemProperties = System.properties

এটি আমাদের "অজানা নাম" দিয়ে সমস্যাটিকে বাইপাস করার অনুমতি দিয়েছে।


5

দুর্ভাগ্যক্রমে, আপনি jarsigner.exe সরঞ্জামে সিস্টেমের বৈশিষ্ট্য সরবরাহ করতে পারবেন না।

@ সেকস এর ত্রুটি 7127374 উল্লেখ করে এবং কেন এটি ভুল করে বন্ধ করা হয়েছে তা ব্যাখ্যা করে আমি 7177232 ত্রুটি জমা দিয়েছি ।

আমার ত্রুটিটি জার্সাইনার সরঞ্জামের উপর প্রভাব সম্পর্কে বিশেষত, তবে সম্ভবত এটি তাদের অন্যান্য ত্রুটি পুনরায় চালু করতে এবং সঠিকভাবে সমস্যাটি সমাধান করার দিকে পরিচালিত করবে।

আপডেট: প্রকৃতপক্ষে, দেখা যাচ্ছে যে আপনি জারসিগনার সরঞ্জামে সিস্টেমের বৈশিষ্ট্য সরবরাহ করতে পারেন, এটি কেবল সহায়তা বার্তায় নেই। ব্যবহারjarsigner -J-Djsse.enableSNIExtension=false


1
ফলোআপের জন্য ধন্যবাদ বব। দুঃখজনকভাবে ওরাকল এখনও পুরো বিষয়টি বুঝতে পারে না। এসএনআই সতর্কতা মারাত্মক নয়, এটি বিশ্বাসঘাতক হতে পারে মারাত্মক। তবে বেশিরভাগ সাধারণ এসএসএল ক্লায়েন্ট (যেমন ব্রাউজারগুলি) এটি এড়িয়ে যাওয়ার পছন্দ করে যেহেতু এটি সত্যিকারের সুরক্ষা সমস্যা নয় (কারণ আপনার এখনও সার্ভার শংসাপত্রটি পরীক্ষা করে দেখতে হবে এবং ভুল শেষ চিহ্নগুলি সনাক্ত করতে হবে) অবশ্যই এটি দুঃখের বিষয় যে কোনও সিএ সেট করতে অক্ষম is একটি সঠিকভাবে কনফিগার করা https সার্ভার আপ করুন।
26 এ উপস্থাপিত

2
প্রকৃতপক্ষে, দেখা যাচ্ছে যে আপনি জার্সাইনার সরঞ্জামে সিস্টেমের বৈশিষ্ট্য সরবরাহ করতে পারেন, এটি কেবল সহায়তা বার্তায় নয়। এটি নথিভুক্ত করা হয়েছে। অনলাইন পাঠ্য বিশ্বাস করার জন্য আমাকে বোকা। অবশ্যই, তারা এটি ঠিক না করার অজুহাত হিসাবে ব্যবহার করেছেন।
বব কার্নস

বিটিডাব্লু: আমি বর্তমানে সুরক্ষা-দেব @ ওপেনজেডকে এই সমস্যাটি নিয়ে আলোচনা করছি এবং এই মুহূর্তে আমি এটি মূল্যায়ন করার সময় দেখে মনে হচ্ছে সিম্যানটেক জিওটিস্ট্রাস্ট টাইমস্ট্যাম্পিং সার্ভারটি ঠিক করেছে, এটি এখন কোনও সতর্কীকরণ ছাড়াই URL টি সঠিকভাবে গ্রহণ করে। তবে আমি এখনও মনে করি এটি ঠিক করা উচিত। আপনি যদি একবার দেখতে চান, একটি পরীক্ষার ক্লায়েন্ট প্রকল্প এবং আলোচনা :
21:21

3

আমি একই সমস্যাটি আঘাত করেছি এবং এটি প্রমাণিত হয়েছে যে বিপরীত ডিএনএস সেটআপ সঠিক ছিল না, এটি আইপিটির জন্য ভুল হোস্টনামের দিকে ইঙ্গিত করেছে। আমি বিপরীত ডিএনএস সংশোধন করে এবং httpd পুনরায় চালু করার পরে, সতর্কতা চলে গেছে। (যদি আমি বিপরীত ডিএনএস সংশোধন না করি, সার্ভারনাম যুক্ত করে আমার জন্যও কৌশলটি করেছে)



2

আপনি যদি রিস্টেমপ্লেট দিয়ে ক্লায়েন্ট তৈরি করে থাকেন তবে আপনি কেবল এর মতো শেষ পয়েন্টটি সেট করতে পারেন: https: // IP / path_to_service এবং অনুরোধের ফ্যাক্টরি সেট করতে পারেন।
এই সমাধানের সাথে আপনার নিজের টমকেট বা অ্যাপাচি পুনরায় চালু করার দরকার নেই:

public static HttpComponentsClientHttpRequestFactory requestFactory(CloseableHttpClient httpClient) {
    TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
        @Override
        public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            return true;
        }
    };

    SSLContext sslContext = null;
    try {
        sslContext = org.apache.http.ssl.SSLContexts.custom()
                .loadTrustMaterial(null, acceptingTrustStrategy)
                .build();
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }   

    HostnameVerifier hostnameVerifier = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    final SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext,hostnameVerifier);

    final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", new PlainConnectionSocketFactory())
            .register("https", csf)
            .build();

    final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
    cm.setMaxTotal(100);
    httpClient = HttpClients.custom()
            .setSSLSocketFactory(csf)
            .setConnectionManager(cm)
            .build();

    HttpComponentsClientHttpRequestFactory requestFactory =
            new HttpComponentsClientHttpRequestFactory();

    requestFactory.setHttpClient(httpClient);

    return requestFactory;
}

1

আমি জাভা 1.6_29 থেকে 1.7 এ আপগ্রেড করার সময়ও এই সমস্যাটি জুড়ে এসেছি।

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

অ্যাডভান্সড ট্যাবে আপনি 'এসএসএল ২.০ ব্যবহারযোগ্য ক্লায়েন্টহেলো ফর্ম্যাটটি ব্যবহার করতে পারেন' তা পরীক্ষা করতে পারেন।

এটি সমস্যার সমাধান বলে মনে হচ্ছে।

আমরা একটি ইন্টারনেট এক্সপ্লোরার ব্রাউজারে জাভা অ্যাপলেট ব্যবহার করছি।

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


0

যখন গ্রহনের মাধ্যমে অ্যাক্সেস করা হয়েছিল তখন উবুন্টু লিনাক্স সার্ভারে সাবভারশন চলমান আমার একই সমস্যা ছিল।

এটি দেখিয়েছে যে অ্যাপাচি (পুনরায়) শুরু করার সময় সমস্যাটি একটি সতর্কতার সাথে করতে হয়েছিল:

[Mon Jun 30 22:27:10 2014] [warn] NameVirtualHost *:80 has no VirtualHosts

... waiting [Mon Jun 30 22:27:11 2014] [warn] NameVirtualHost *:80 has no VirtualHosts

এটি নতুন প্রবেশের কারণে ঘটেছে ports.conf, যেখানে NameVirtualHostনির্দেশের পাশাপাশি অন্য নির্দেশিকা প্রবেশ করা হয়েছিলsites-enabled/000-default

নির্দেশিকাটি সরানোর পরে ports.conf, সমস্যাটি অদৃশ্য হয়ে গেছে (প্রাকৃতিকভাবে অ্যাপাচি পুনরায় চালু করার পরে)


0

এখানে কেবল একটি সমাধান যুক্ত করতে। এটি ল্যাম্প ব্যবহারকারীদের জন্য সহায়তা করতে পারে

Options +FollowSymLinks -SymLinksIfOwnerMatch

ভার্চুয়াল হোস্ট কনফিগারেশনে উল্লিখিত লাইনটি ছিল অপরাধী।

ত্রুটি হলে ভার্চুয়াল হোস্ট কনফিগারেশন

<VirtualHost *:80>
    DocumentRoot /var/www/html/load/web
    ServerName dev.load.com
    <Directory "/var/www/html/load/web">
        Options +FollowSymLinks -SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
        Order Allow,Deny
        Allow from All
    </Directory>
     RewriteEngine on
     RewriteCond %{SERVER_PORT} !^443$
     RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]
</VirtualHost>

ওয়ার্কিং কনফিগারেশন

<VirtualHost *:80>
    DocumentRoot /var/www/html/load/web

   ServerName dev.load.com
   <Directory "/var/www/html/load/web">

        AllowOverride All

        Options All

        Order Allow,Deny

        Allow from All

    </Directory>

    # To allow authorization header
    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

   # RewriteCond %{SERVER_PORT} !^443$
   # RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]


</VirtualHost>

0

এখানে অ্যাপাচি httpclient 4.5.11 এর সমাধান রয়েছে। আমার সার্টে সমস্যা হয়েছে যা সাবজেক্ট ওয়াইল্ডকার্ড করেছে *.hostname.com। এটি আমাকে একই ব্যতিক্রম ফিরিয়ে দিয়েছে, তবে আমি সম্পত্তি দ্বারা অক্ষম করা ব্যবহার করি না System.setProperty("jsse.enableSNIExtension", "false");কারণ এটি গুগল অবস্থানের ক্লায়েন্টে ত্রুটি করেছে।

আমি সহজ সমাধান পেয়েছি (কেবলমাত্র সকেট সংশোধন করে):

import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;

import javax.inject.Named;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.util.List;

@Factory
public class BeanFactory {

    @Bean
    @Named("without_verify")
    public HttpClient provideHttpClient() {
        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(SSLContexts.createDefault(), NoopHostnameVerifier.INSTANCE) {
            @Override
            protected void prepareSocket(SSLSocket socket) throws IOException {
                SSLParameters parameters = socket.getSSLParameters();
                parameters.setServerNames(List.of());
                socket.setSSLParameters(parameters);
                super.prepareSocket(socket);
            }
        };

        return HttpClients.custom()
                .setSSLSocketFactory(connectionSocketFactory)
                .build();
    }


}

-1

একটি সহজ উপায় আছে যেখানে আপনি নির্দিষ্ট সংযোগগুলিকে সুস্পষ্টভাবে বিশ্বাস করতে কেবল নিজের নিজস্ব হোস্টনাম ভেরিফায়ার ব্যবহার করতে পারেন। সমস্যাটি জাভা ১.7 নিয়ে আসে যেখানে এসএনআই এক্সটেনশানগুলি যুক্ত করা হয়েছে এবং সার্ভারের ভুল কনফিগারেশনের কারণে আপনার ত্রুটি is

আপনি পুরো JVM জুড়ে SNI অক্ষম করতে "-Djsse.enableSNIExistance = মিথ্যা" ব্যবহার করতে পারেন বা আমার ব্লগটি পড়তে পারেন যেখানে আমি ইউআরএল সংযোগের শীর্ষে একটি কাস্টম ভেরিফায়ার কীভাবে প্রয়োগ করব explain

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