"জাভা.সিকিউরিটি.সার্ট.সর্টিটিএক্সেপশন: কোনও বিষয় বিকল্পের নাম উপস্থিত নেই" ত্রুটি কীভাবে ঠিক করবেন?


108

আমার একটি জাভা ওয়েব সার্ভিস ক্লায়েন্ট রয়েছে, যা এইচটিটিপিএসের মাধ্যমে একটি ওয়েব পরিষেবা গ্রহণ করে।

import javax.xml.ws.Service;

@WebServiceClient(name = "ISomeService", targetNamespace = "http://tempuri.org/", wsdlLocation = "...")
public class ISomeService
    extends Service
{

    public ISomeService() {
        super(__getWsdlLocation(), ISOMESERVICE_QNAME);
    }

যখন আমি পরিষেবা URL (সাথে সংযোগ https://AAA.BBB.CCC.DDD:9443/ISomeService), আমি ব্যতিক্রম পেতে java.security.cert.CertificateException: No subject alternative names present

এটি ঠিক করার জন্য, আমি প্রথমে দৌড়েছি openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txtএবং ফাইলটিতে নিম্নলিখিত সামগ্রী পেয়েছি certs.txt:

CONNECTED(00000003)
---
Certificate chain
 0 s:/CN=someSubdomain.someorganisation.com
   i:/CN=someSubdomain.someorganisation.com
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=someSubdomain.someorganisation.com
issuer=/CN=someSubdomain.someorganisation.com
---
No client certificate CA names sent
---
SSL handshake has read 489 bytes and written 236 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 512 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5            
    Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Session-ID-ctx:                 
    Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Key-Arg   : None
    Start Time: 1382521838
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

আফাইক, এখন আমার দরকার

  1. অংশ নিষ্কর্ষ certs.txtমধ্যে -----BEGIN CERTIFICATE-----এবং -----END CERTIFICATE-----,
  2. যাতে শংসাপত্র নাম সমান এটি পরিবর্তন AAA.BBB.CCC.DDDএবং
  3. তারপরে ফলাফলটি আমদানি করুন keytool -importcert -file fileWithModifiedCertificate(যেখানে fileWithModifiedCertificate1 এবং 2 অপারেশনের ফলাফল রয়েছে)।

এটা কি সঠিক?

যদি তা হয় তবে আইপি ভিত্তিক অ্যাড্রেস ( AAA.BBB.CCC.DDD) দিয়ে আমি কীভাবে পদক্ষেপ 1 থেকে শংসাপত্রটি তৈরি করতে পারি ?

আপডেট 1 (23.10.2013 15:37 এমএসকে): অনুরূপ প্রশ্নের উত্তরে আমি নিম্নলিখিতটি পড়ি:

আপনি যদি সেই সার্ভারের নিয়ন্ত্রণে না থাকেন তবে এর হোস্টের নামটি ব্যবহার করুন (বিদ্যমান শংসাপত্রের মধ্যে হোস্টের নামের সাথে কমপক্ষে কোনও সিএন মিল আছে)।

"ব্যবহার" এর অর্থ কী?

উত্তর:


153

আমি এখানে উপস্থাপকটি ব্যবহার করে এইচটিটিপিএস চেকগুলি অক্ষম করে সমস্যার সমাধান করেছি :

আমি ISomeServiceক্লাসে নিম্নলিখিত কোডগুলি রেখেছি :

static {
    disableSslVerification();
}

private static void disableSslVerification() {
    try
    {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
        };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }
}

যেহেতু আমি https://AAA.BBB.CCC.DDD:9443/ISomeServiceকেবল পরীক্ষার উদ্দেশ্যে ব্যবহার করছি , এটি যথেষ্ট ভাল সমাধান।


উপরে উল্লিখিত লিঙ্কে উল্লিখিত পদ্ধতিটি অবরুদ্ধ বলে মনে হচ্ছে ( nakov.com/blog/2009/07/16/… )। লিঙ্কটি কি কেউ আপডেট করতে পারবেন?
জন

আমি এই প্রক্রিয়াটি করে বৈধতা অক্ষম করার চেষ্টা করেছি তবে এসএসএল_অরর_নো_সাইপার_ওভারল্যাপটি এসএসএল প্রোটোকলগুলির (ব্রাউজারের দুর্বলতা) ব্রাউজারের বৈধতা দেয়। কোন ধারনা?
will824

হ্যালো, আমি org.springframework.web.client.HttpClientErrorException: 403 নিষিদ্ধ

73
এইচটিটিপিএস চেক অক্ষম করা কোনও "সমাধান" নয়। আপনার বলা উচিত যে আমি একটি "প্যাচ" পেয়েছি।
Jus12

2
এটি প্রাক_প্রড এবং উত্পাদনে দুর্বলতা সৃষ্টি করবে। 1. উইন্ডোজ হোস্ট ফাইলটিতে হোস্ট এন্ট্রি করুন 2. অথবা অন্যথায় শংসাপত্রগুলিতে সাবজেক্ট বিকল্প নাম ক্ষেত্রগুলিতে আইপি বা এফকিউডিএন নাম যুক্ত করুন
শঙ্কর

34

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

javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier(){

    public boolean verify(String hostname,
            javax.net.ssl.SSLSession sslSession) {
        return hostname.equals("localhost");
    }
});

এটি সহজ এবং সূক্ষ্ম কাজ করে।

এখানে আসল উত্স।


3
বা আপনি return hostname.equals("localhost");যা করতে চান তা যদি আপনি কেবল যাচাই () ফাংশনটির পুরো শরীরটি প্রতিস্থাপন করতে পারেন। ifসম্পূর্ণরূপে প্রযোজন নেই।
সিভিএন

এটি ছিল একটি সহজ এবং দ্রুত সমাধান যা আমাদের কোনও বিক্রেতার পরীক্ষার পরিবেশে পরীক্ষার কাছাকাছি নিয়ে এসেছিল যার সঠিক শংসাপত্র নেই। অসংখ্য ধন্যবাদ!
ডাকডেভ

@ জুয়ানএম.হিডালগো যা আমার পক্ষে কাজ করেছিল, কল করার আগে ঠিক উপরে কোডটি রেখেছিল HttpsURLConnection connection = (HttpsURLConnection) obj.openConnection();। এছাড়াও, এটি কি প্রতিটি শংসাপত্র উপেক্ষা করে? যেহেতু আমি দেখেছি যে এই জাতীয় কাজটি সুরক্ষার পক্ষে ঝুঁকিপূর্ণ। ধন্যবাদ!
থান্ডারওয়্যারিং

এই উত্তরটি আমার এসএসএল শংসাপত্রের ব্যতিক্রম এবং এলডিএইচ অক্ষরের সমস্যা সমাধান করেছে, আমি দেখতে পেয়েছি খোলা জেডিকে
আখিল এস কামাথ

28

এটি একটি পুরানো প্রশ্ন, তবুও জেডিকে 1.8.0_144 থেকে জেডকে 1.8.0_191 এ যাওয়ার সময় আমার একই সমস্যা ছিল

চেঞ্জলগে আমরা একটি ইঙ্গিত পেয়েছি:

পরিবর্তণের

আমরা নিম্নলিখিত অতিরিক্ত সিস্টেম সম্পত্তি যুক্ত করেছি, যা আমাদের ক্ষেত্রে এই সমস্যাটি সমাধান করতে সহায়তা করেছে:

-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true

25

শংসাপত্র পরিচয়ের যাচাইকরণ ক্লায়েন্ট যা অনুরোধ করে তার বিপরীতে সম্পাদিত হয়।

যখন আপনার ক্লায়েন্ট ব্যবহার করে https://xxx.xxx.xxx.xxx/something(যেখানেxxx.xxx.xxx.xxx একটি আইপি ঠিকানা রয়েছে), শংসাপত্রের পরিচয়টি এই আইপি ঠিকানার বিরুদ্ধে পরীক্ষা করা হয় (তাত্ত্বিকভাবে, কেবল একটি আইপি এসএএন এক্সটেনশন ব্যবহার করে)।

যদি আপনার শংসাপত্রের কোনও আইপি সান না থাকে তবে ডিএনএস সান (বা যদি ডিএনএস সান নয়, সাবজেক্ট ডিএন-তে একটি সাধারণ নাম) থাকে তবে আপনি আপনার ক্লায়েন্টকে তার হোস্টের নামের পরিবর্তে (বা একটি হোস্টের নাম) দিয়ে ইউআরএল ব্যবহার করে এটি কাজ করতে পারেন যার জন্য শংসাপত্রটি বৈধ হবে, যদি একাধিক সম্ভাব্য মান থাকে)। উদাহরণস্বরূপ, যদি আপনার শংসাপত্রের একটি নাম থাকে তবে www.example.comব্যবহার করুন https://www.example.com/something

অবশ্যই, সেই আইপি ঠিকানার সমাধান করার জন্য আপনার সেই হোস্টের নাম দরকার।

এছাড়াও, যদি কোনও ডিএনএস সান থাকে তবে সাবজেক্ট ডিএন-এর সিএন উপেক্ষা করা হবে, সুতরাং এই ক্ষেত্রে ডিএনএস স্যানগুলির সাথে মেলে এমন একটি নাম ব্যবহার করুন।


1
আমি পরিষেবাটি অ্যাক্সেস করতে পারি না http://www.example.com/someservice। এটা IP- ভিত্তিক ঠিকানা (সাথে কাজ করার জন্য সার্টিফিকেটের জন্য এটা কি ঠিক অনুক্রমে https://AAA.BBB.CCC.DDD:9443/ISomeService), আমি সব সেট প্রয়োজন CNক্ষেত্র AAA.BBB.CCC.DDD(প্রতিস্থাপন someSubdomain.someorganisation.comদ্বারা AAA.BBB.CCC.DDDউপরে ফাইলে) এবং তার ফলে শংসাপত্র ফাইল আমদানি করবেন?
মন্টিফ্লেটেক্স

আপনি সার্ভারের নিয়ন্ত্রণে না থাকলে আপনি সিএন বা শংসাপত্র সম্পর্কে কিছু করতে পারবেন না।
ব্রুনো

পরীক্ষার উদ্দেশ্যে আইপি ঠিকানায় অ্যাক্সেস পেতে আপনি অস্থায়ীভাবে নিজের /etc/hostsফাইল বা সমতুল্য সংশোধন করতে পারেন
tyoc213

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

15

শংসাপত্রটি আমদানি করতে:

  1. সার্ভার থেকে শংসাপত্রটি বের করুন, যেমন openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt এটি পিইএম ফর্ম্যাটে শংসাপত্রগুলি বের করবে।
  2. সার্টিফিকেটটি ডিইআর ফর্ম্যাটে রূপান্তর করুন কারণ কীটোলটি এটি প্রত্যাশা করে openssl x509 -in certs.txt -out certs.der -outform DER
  3. এখন আপনি এই ডিগ্রিটি সিস্টেম ডিফল্ট 'ক্যাজার্ট' ফাইলটিতে আমদানি করতে চান। আপনার জাভা ইন্সটলেশনের জন্য সিস্টেম ডিফল্ট 'ক্যাশেটারস' ফাইলটি সন্ধান করুন। ডিফল্ট জাভা ইনস্টলেশনটির ক্যাসর্টের অবস্থান কীভাবে পাবেন তা একবার দেখুন ?
  4. সেই ক্যাটার্টস ফাইলে শংসাপত্রগুলি আমদানি করুন: sudo keytool -importcert -file certs.der -keystore <path-to-cacerts>ডিফল্ট ক্যা্যাসার্টের পাসওয়ার্ডটি 'চেঞ্জিট'।

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


"যদি এফকিউডিএন আপনার ডেভ মেশিনে সমাধানযোগ্য না হয়, কেবল এটি আপনার হোস্ট ফাইলে যুক্ত করুন" - সহায়তা। অনেক ধন্যবাদ!
ওোল্যান্ড

আমি একই জিনিসটি করেছি তবে তবুও, সমস্যাটি অব্যাহত রয়েছে। এই পদ্ধতির ব্যবহার করে আরও কিছু করা যেতে পারে?
pkgajulapalli

9

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

ধাপে ধাপে বুঝতে এই লিঙ্কটি দেখুন ।

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

  1. ওপেনস্ল.সিএনএফ একটি বর্তমান ডিরেক্টরিতে অনুলিপি করুন
  2. echo '[ subject_alt_name ]' >> openssl.cnf
  3. echo 'subjectAltName = DNS:example.mydomain1.com, DNS:example.mydomain2.com, DNS:example.mydomain3.com, DNS: localhost'>> openssl.cnf
  4. openssl req -x509 -nodes -newkey rsa:2048 -config openssl.cnf -extensions subject_alt_name -keyout private.key -out self-signed.pem -subj '/C=gb/ST=edinburgh/L=edinburgh/O=mygroup/OU=servicing/CN=www.example.com/emailAddress=postmaster@example.com' -days 365
  5. সর্বজনীন কী (.pem) ফাইলটি PKS12 ফর্ম্যাটে রফতানি করুন। এটি আপনাকে পাসওয়ার্ডের জন্য অনুরোধ করবে

    openssl pkcs12 -export -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -in
    self-signed.pem -inkey private.key -name myalias -out keystore.p12
  6. স্ব-স্বাক্ষরিত পিইএম (কীস্টোর) থেকে a.JKS তৈরি করুন

    keytool -importkeystore -destkeystore keystore.jks -deststoretype PKCS12 -srcstoretype PKCS12 -srckeystore keystore.p12
  7. উপরের কীস্টোর বা জেকেএস ফাইল থেকে একটি শংসাপত্র তৈরি করুন

    keytool -export -keystore keystore.jks -alias myalias -file selfsigned.crt
  8. যেহেতু উপরের শংসাপত্রটি স্বাক্ষরযুক্ত এবং সিএ দ্বারা বৈধ নয়, এটি ট্রাস্টস্টোরে যুক্ত করা দরকার (উইন্ডোজের জন্য ম্যাকের জন্য নীচে অবস্থানে থাকা ক্যা্যাসার্টস ফাইলটি আপনার জেডিকে কোথায় ইনস্টল করা আছে তা সন্ধান করুন))

    sudo keytool -importcert -file selfsigned.crt -alias myalias -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

মূল উত্তরটি এখানে এই লিঙ্কটিতে পোস্ট করা হয়েছে


4

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

HttpsURLConnection.setDefaultHostnameVerifier(
    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

[Edit]

Conapart3 দ্বারা উল্লিখিত হিসাবে SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERএখন হ্রাস করা হয়েছে, সুতরাং এটি পরবর্তী সংস্করণে মুছে ফেলা হতে পারে, সুতরাং ভবিষ্যতে আপনাকে নিজের রোল করতে বাধ্য করা যেতে পারে, যদিও আমি এখনও বলব যে যেখানে আমি যাচাইকরণ বন্ধ করে দেওয়া হয়েছে সেখানে আমি কোনও সমাধান থেকে দূরে সরে যাব।


2
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERএখন অবচয় করা হয়েছে।
কনপার্ট 3

3

এই ত্রুটিটি পেয়ে আমার সমস্যাটি কেবলমাত্র "কিস্টেস্ট / ওয়েব সার্ভিস" এর পরিবর্তে সম্পূর্ণ ইউআরএল "qiest.ourCompany.com/webService" ব্যবহার করে সমাধান করা হয়েছে। কারণটি ছিল আমাদের সুরক্ষা শংসাপত্রের একটি ওয়াইল্ডকার্ড অর্থাৎ "* .ourCompany.com" ছিল। আমি একবার পুরো ঠিকানা রাখলে ব্যতিক্রম চলে গেল went আশাকরি এটা সাহায্য করবে.


2

ইতিমধ্যে https://stackoverflow.com/a/53491151/1909708 এ এর উত্তর দিয়েছেন ।

এটি ব্যর্থ হয় কারণ শংসাপত্রের সাধারণ নাম ( CNশংসাপত্রের মধ্যে Subject) বা বিকল্প নামের কোনও ( Subject Alternative Nameশংসাপত্রের মধ্যে) লক্ষ্য হোস্টনাম বা আইপি অ্যাড্রেসের সাথে মেলে না।

উদাহরণস্বরূপ, কোনও জেভিএম থেকে, কোনও আইপি ঠিকানা ( WW.XX.YY.ZZ) এবং ডিএনএস নাম ( https://stackoverflow.com ) এর সাথে সংযুক্ত করার চেষ্টা করার সময় , এইচটিটিপিএস সংযোগ ব্যর্থ হবে কারণ জাভা ট্রাস্টস্টোরে সংরক্ষিত শংসাপত্রটি cacertsসাধারণ নাম আশা করে (বা শংসাপত্রের বিকল্প নাম যেমন স্ট্যাকেক্সচেঞ্জ.কম বা * .stackoverflow.com ইত্যাদি) লক্ষ্য ঠিকানার সাথে মেলে।

দয়া করে চেক করুন: https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html# হোস্টনাম ভেরিফায়ার

    HttpsURLConnection urlConnection = (HttpsURLConnection) new URL("https://WW.XX.YY.ZZ/api/verify").openConnection();
    urlConnection.setSSLSocketFactory(socketFactory());
    urlConnection.setDoOutput(true);
    urlConnection.setRequestMethod("GET");
    urlConnection.setUseCaches(false);
    urlConnection.setHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession sslSession) {
            return true;
        }
    });
    urlConnection.getOutputStream();

উপরে, একটি বাস্তবায়িত HostnameVerifierবস্তুটি পাস করে যা সর্বদা ফিরে আসে true:

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

1

স্প্রিং বুট জন্য RestTemplate:

  • অ্যাড org.apache.httpcomponents.httpcoreনির্ভরতা
  • NoopHostnameVerifierএসএসএল কারখানার জন্য ব্যবহার করুন :

    SSLContext sslContext = new SSLContextBuilder()
            .loadTrustMaterial(new URL("file:pathToServerKeyStore"), storePassword)
    //        .loadKeyMaterial(new URL("file:pathToClientKeyStore"), storePassword, storePassword)
            .build();
    SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
    CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client);
    RestTemplate restTemplate = new RestTemplate(factory);

0

এই একই ত্রুটি বার্তা পেলে আমি এই প্রশ্নটি পেয়েছি। তবে আমার ক্ষেত্রে আমাদের দুটি সাব-ডোমেন ( http://example1.xxx.com/someservice এবং http://example2.yyy.com/someservice) এর সাথে দুটি ইউআরএল ছিল ) যা একই সার্ভারে পরিচালিত হয়েছিল। এই সার্ভারে * .xxx.com ডোমেনের জন্য কেবল একটি ওয়াইল্ডকার্ড শংসাপত্র ছিল। দ্বিতীয় ডোমেনের মাধ্যমে পরিষেবাটি ব্যবহার করার সময়, প্রাপ্ত শংসাপত্র (* .xxx.com) অনুরোধ করা ডোমেন (* .yyy.com) এর সাথে মেলে না এবং ত্রুটি ঘটে।

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


0
public class RESTfulClientSSL {

    static TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            // TODO Auto-generated method stub
        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            // TODO Auto-generated method stub
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            // TODO Auto-generated method stub
            return null;
        }
    }};

    public class NullHostNameVerifier implements HostnameVerifier {
        /*
         * (non-Javadoc)
         *
         * @see javax.net.ssl.HostnameVerifier#verify(java.lang.String,
         * javax.net.ssl.SSLSession)
         */
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            // TODO Auto-generated method stub
            return true;
        }
    }

    public static void main(String[] args) {

        HttpURLConnection connection = null;
        try {

            HttpsURLConnection.setDefaultHostnameVerifier(new RESTfulwalkthroughCer().new NullHostNameVerifier());
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());


            String uriString = "https://172.20.20.12:9443/rest/hr/exposed/service";
            URL url = new URL(uriString);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            //connection.setRequestMethod("POST");

            BASE64Encoder encoder = new BASE64Encoder();
            String username = "admin";
            String password = "admin";
            String encodedCredential = encoder.encode((username + ":" + password).getBytes());
            connection.setRequestProperty("Authorization", "Basic " + encodedCredential);

            connection.connect();
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                StringBuffer stringBuffer = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    stringBuffer.append(line);
                }
                String content = stringBuffer.toString();
                System.out.println(content);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}

1
দয়া করে আপনার কোডটিতে ব্যাখ্যামূলক পাঠ্য যুক্ত করুন। দেখুন stackoverflow.com/help/how-to-answer
jasie

1
এটি একটি সুরক্ষা ত্রুটি। এইভাবে একজন প্রথম স্থানে শংসাপত্র যাচাইকরণ অক্ষম করে। এই সমাধানটির অনুলিপি করা প্রত্যেক ব্যক্তিই তাদের সফ্টওয়্যারটিতে একটি সুরক্ষা বাগ তৈরি করবে।
মারেক পুচালস্কি

0

আমি স্প্রিংবুটে 2 ওয়ে এসএসএল দিয়ে যাচ্ছিলাম। আমি সমস্ত সঠিক কনফিগারেশন পরিষেবা টমক্যাট সার্ভার এবং পরিষেবা কলার রেস্টটেম্পলেট তৈরি করেছি। তবে "java.security.cert.Cerર્ટateException: কোনও বিষয় বিকল্পের নাম উপস্থিত নেই" হিসাবে আমি ত্রুটি পাচ্ছিলাম

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

এখন, কীভাবে এটি জেভিএম-এ যুক্ত করবেন।

jre / lib / সিকিউরিটি / ক্যাশেটার্স ফাইলে যান। আমাদের এই সার্ভিস শংসাপত্রের ফাইলটি জেভিএমের এই ক্যাসের্টস ফাইলে যুক্ত করতে হবে।

উইন্ডোতে কমান্ড লাইনের মাধ্যমে ক্যাসার্টস ফাইলটিতে সার্ভার শংসাপত্র যুক্ত করার আদেশ।

সি: \ প্রোগ্রাম ফাইলসমূহ জাভা \ jdk1.8.0_191 re jre \ lib \ সুরক্ষা> কীটুল-আমদানি -নোপ্রোম্ট-ট্রাস্টক্যাসার্টস -ালিয়াস স্লাসভার-ফাইল ই: \ বসন্ত_ক্লাউড_স্যাচিন s এসএসএল_কিজ \স্ল্যাসার.সিসার-স্টোর কিসরিটসরিটসরিটসরিট

সার্ভার সার্টিটি ইনস্টল করা আছে কিনা তা যাচাই করুন:

সি: \ প্রোগ্রাম ফাইলসমূহ জাভা \ jdk1.8.0_191 re jre \ lib \ সুরক্ষা> keytool-list -keystore cacerts

আপনি ইনস্টল করা শংসাপত্রগুলির তালিকা দেখতে পারেন:

আরো বিস্তারিত জানার জন্য: https://sachin4java.blogspot.com/2019/08/javasecuritycertcerર્ટateateexception-no.html


0

শংসাপত্রের সিএন-র সাথে সম্পর্কিত আইপি সহ হোস্ট এন্ট্রি যুক্ত করুন

সিএন = someSubdomain.someorganisation.com

আপনি যেখানে ইউআরএল অ্যাক্সেস করার চেষ্টা করছেন সেখানে সিএন নাম দিয়ে এখন আইপি আপডেট করুন।

এটা আমার জন্য কাজ করে।


0

এই কোডটি কবজের মতো কাজ করবে এবং কোডটির বিশ্রামের জন্য রেস্ট টেম্পল অবজেক্টটি ব্যবহার করবে।

  RestTemplate restTemplate = new RestTemplate();   
  TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
            @Override
            public boolean isTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {
                return true;
            }

        };

        SSLContext sslContext = null;
        try {
            sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy)
                    .build();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);

        restTemplate.setRequestFactory(requestFactory);
}

0

যখন আপনার সিএন এবং বিষয় বিকল্প নাম (এসএএন) উভয়ের সাথে শংসাপত্র রয়েছে, আপনি যদি সিএন বিষয়বস্তুর উপর ভিত্তি করে আপনার অনুরোধটি করেন, তবে সেই নির্দিষ্ট বিষয়বস্তুটি অবশ্যই স্যানের অধীনে উপস্থিত থাকতে হবে, অন্যথায় এটি ত্রুটিযুক্ত প্রশ্নে ব্যর্থ হবে।

আমার ক্ষেত্রে সিএন এর কিছু ছিল, সানের কাছে অন্য কিছু ছিল। আমাকে সান ইউআরএল ব্যবহার করতে হয়েছিল, এবং তারপরে এটি ঠিক কাজ করেছে।


-3

হোস্ট ফাইলগুলিতে আপনার আইপি ঠিকানা যুক্ত করুন C যা সি: \ উইন্ডোজ \ সিস্টেম 32 \ ড্রাইভার \ ইত্যাদি ফোল্ডারে রয়েছে। আইপি ঠিকানার আইপি এবং ডোমেন নাম যুক্ত করুন। উদাহরণ: aaa.bbb.ccc.ddd abc@def.com


-5

আমি নিম্নলিখিত উপায়ে সমস্যাটি সমাধান করেছি।

1. একটি ক্লাস তৈরি করা। শ্রেণীর কিছু ফাঁকা বাস্তবায়ন রয়েছে

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

public void checkClientTrusted(X509Certificate[] certs, String authType) {
}

public void checkServerTrusted(X509Certificate[] certs, String authType) {
}

@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString)
        throws CertificateException {
    // TODO Auto-generated method stub

}

@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString)
        throws CertificateException {
    // TODO Auto-generated method stub

}

২. একটি পদ্ধতি তৈরি করা

private static void disableSSL() {
    try {
        TrustManager[] trustAllCerts = new TrustManager[] { new MyTrustManager() };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

  1. ব্যতিক্রম ছুঁড়ে দেওয়া যেখানে অক্ষম এসএসএল () পদ্ধতিটি কল করুন। এটা ভাল কাজ করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.