الحصول على ssl.SSLHandshakeException عند استخدام عميل REST مع الرأس ولكنه يعمل بشكل جيد مع PostMan

4

لدي مورد REST خارجي مع التفاصيل أدناه:

  1. URL: abc.com/orders (المجال مع https )
  2. أحتاج إلى تمرير UserID كعنوان HTTP مع قيمة مفتاح "المستخدم" هي "abcd"
  3. سيؤدي هذا إلى إرجاع استجابة JSON

أنا أستخدم رمز Java أدناه لهذا:

try {

            Client client = Client.create();

            WebResource webResource = client.resource("abc.com/orders");

            ClientResponse response = webResource.header("user", "abcd").accept("application/json")
                    .get(ClientResponse.class);

            if (response.getStatus() != 200) {
                throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
            }

            String output = response.getEntity(String.class);

            System.out.println("Output from Server .... \n");
            System.out.println(output);

        } catch (Exception e) {

            e.printStackTrace();

        }

لكنني أتلقى أقل من الاستثناء على الرغم من أنه يعمل بشكل جيد مع PostMan

com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:155)
    at com.sun.jersey.api.client.Client.handle(Client.java:652)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:509)

حاولت البحث عنها قليلاً ووجدت في مكان ما أنني بحاجة إلى الحصول على شهادة من عنوان URL هذا والإضافة إليه jdk/lib/security مجلد. لكني لا أعرف كيف أستمر.

مع opensl أحصل على الإخراج أدناه:

user>openssl s_client -connect  abc.com:443

CONNECTED(00000214)
7832:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error:s23_clnt.c:802:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 308 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1531657560
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

1 إجابة

4
افضل جواب

هذه هي التعليمات لجعل برنامجك يعمل. راجع للشغل ، أنا على النوافذ ، باستخدام جوجل كروم.

أنت بحاجة إلى شهادة.

1) أولاً ، انتقل إلى عنوان url (لا يهم إذا كان موقع ويب أو خدمة مريحة) ، دعنا نختار google.com. انقر بزر الماوس الأيمن على الصفحة وانقر على "فحص".

Imagen 693069

2) انتقل إلى علامة التبويب الأمان.

Imagen 693070

3) بمجرد أن تكون هناك ، انقر فوق "عرض الشهادة". Imagen 693071

ستظهر نافذة ، مع تفاصيل شهادة الموقع.

4) انتقل إلى علامة التبويب "مسار الشهادة". وانقر نقرًا مزدوجًا فوق الشهادة التي تريدها من التسلسل الهرمي. Imagen 693072

سوف نافذة جديدة يطفو على السطح:

Imagen 693073

لقد اخترت الشهادة الجذرية في هذه الحالة المسماة "Google trust services ..." ، ولكن يمكنك اختيار شهادة أكثر تحديدًا ، مثل "Google Internet Authority G3". أعتقد أنه كلما كان أكثر تحديدًا ، كلما زاد الأمان (ولكن لست متأكدًا).

5) انتقل إلى علامة التبويب "التفاصيل" واختر اسم شهادتك:

Imagen 693074

6) انقر على "نسخ إلى ملف" ، ثم اختر اسمها والمكان الذي تريد حفظه فيه. قمت بحفظ خاصتي على سطح المكتب وأطلق عليها اسم "test.cer".

الآن انتهيت من تصدير الشهادة. بعد ذلك ، تريد إضافته إلى متجر jvm's Truststore.

1) ابحث عن JRE التي يعمل عليها تطبيقك ، على سبيل المثال لدي JRE واحد فقط على جهاز الكمبيوتر الخاص بي (باستثناء الجهاز المرفق مع JDK). يقع هنا:

Imagen 693075

الملف الهدف الذي يقوم بتخزين الشهادات هو cacerts:

Imagen 693076

2) افتح كمد كمسؤول وقم به cd "C:\Program Files\Java\jre-10.0.1\lib\security" (مسار cacerts في حالتي).

3) اصدار الأمر التالي:

keytool -import -storepass changeit -noprompt -alias *alias* -keystore cacerts -trustcacerts -file *path_to_certificate*

لاحظ أن الاسم المستعار يمكن أن يكون أي شيء ، بغض النظر عن ما أطلقت عليه ملفك ، طالما أنه لا يتعارض مع الأسماء المستعارة لشهادات أخرى موجودة بالفعل في المتجر.

في حالتي أصدر هذا:

Imagen 693077

4) يمكنك الآن إصدار هذا الأمر: keytool -list -keystore cacerts -alias *alias* للتأكد من إضافة شهادتك. عند إصدار هذا الأمر ، سيطلب منك كلمة المرور الخاصة بك. في الخطوة الثالثة ، كان الأمر الذي أعطيته لك هذا الخيار: -storepass changeit ، لذلك ستكون كلمة المرور الخاصة بك changeit .

Imagen 693078

في حالتي كل شيء على ما يرام.

5) يمكنك الآن إعادة تشغيل التطبيق ويجب أن يعمل. يوصي بعض الأشخاص بإعادة تشغيل جهاز الكمبيوتر الخاص بك ، ولكن لا أعرف ما إذا كان ذلك ضروريًا.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام