الاتصال بالخادم الآمن في Java باستخدام Apache Commons HttpClient 3.1 من خلال طرح ValidatorException

StackOverflow https://stackoverflow.com/questions/1623924

  •  06-07-2019
  •  | 
  •  

سؤال

أحاول الاتصال بخادم آمن باستخدام Apache Commons HttpClient 3.1.
المشكلة هي في كل مرة يتصل التطبيق فإنه يلقي ملف

sun.security.validator.ValidatorException.

هنا هو تتبع المكدس:

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:فشل التحقق من صحة مسار PKIX:java.security.cert.CertPathValidatorException:فشل التحقق من اسم الموضوع/المُصدر الفاشل javax.net.ssl.sslhandshakeException:sun.security.validator.ValidatorException:فشل التحقق من صحة مسار PKIX:java.security.cert.CertPathValidatorException:فشل التحقق من اسم الموضوع/المُصدر في com.sun.net.ssl.internal.ssl.alerts.getsslexception (Alerts.java:174) على com.sun.net.ssl.internal.ssl.sslsocketimpl.fatal (sslsocketimpl.java : 1611) في com.sun.net.ssl.internal.ssl.handshaker.fatalse (handshaker.java:187) at com.sun.net.ssl.internal.ssl.handshaker.fatalse (handshaker.java:181) at at com.sun.net.ssl.internal.ssl.clienthandshaker.servercertificate (clienthandshaker.java:1035) في com.sun.net.ssl.internal.ssl.clienthandshaker.processmessage (clienthandshaker.java:124) في com.ssun. net.ssl.internal.ssl.handshaker.processloop (Handshaker.java:516) في com.sun.net.ssl.internal.ssl.handshaker.process_record (Handshaker.java:454) في com.sun.net.ssl. internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112) at com.sun.net.ssl.internal.ssl. sslsocketimpl.writerecord (sslsocketimpl.java:63) في com.sun.net.ssl.internal.ssl.appoutputstream.write (appoutputstream.java:59) في java.io.bufferedouttream.flushbuffer .io.bufferedoutputstream.flush (bufferedoutputstream.java:123) at org.apache.commons.httpclient.methods.entityencloseMethod.writeRequestbody (entityenclosesmethod.java:506) methodbase.java : 2114) at org.apache.commons.httpclient.httpmethodbase.execute (httpmethodbase.java:1096) في org.apache.commons.httpclient.httpmethodeCturector.executWithretry TTPClient. HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323) at balanceschecker .connector.connector.conn (connector.java:27) في BANANCESCHECKER.Connector.Connector.Rawpost (Connector.java:99) في BANANCESCHECKER.Connector.connector.post (Connector.java:111) في BOANCESCHERCER.LOGIN.LOGIN.LOGIN. login (login.java:87) في Badanceschecker.main.main (main.java:21) بسبب:sun.security.validator.ValidatorException:فشل التحقق من صحة مسار PKIX:java.security.cert.CertPathValidatorException:فشل التحقق من اسم الموضوع/المصدر في Sun.Security.validator.pkixvalidator.dovalidate (pkixvalidator.java:251) في sun.security.validator.pkixvalidator.dovalidate (pkixvalidator.java:234) at sun.secutory.validator.pkixvalidate. EngineValidate (pkixvalidator.java:158) في sun.security.validator.validator.validate (adadator.java:218) في com.sun.net.ssl.internal.ssl.x509trustmanagpl.validevied .sun.net.ssl.internal.ssl.x509trustmanagerimpl.CheckserverTrusted (x509trustmanagerimpl.java:209) في com.sun.net.ssl.internal.ssl.x509trustmanagerimpl.checksertrusted ( شبكة .ssl.internal.ssl.clienthandshaker.servercertificate (ClientHandshaker.java:1014) ...21 سببًا آخر:java.security.cert.CertPathValidatorException:فشل الاختيار المُصدر/المُصدر في Sun.Security.provider.certpath.pkixmastercertCertPathvalIdator.validate (PkixMasterCertCertPathvalidator.java:139) في sun.security.provider.certpath.pkixcertvalidator.dovalidate (pkixcertpathatpath.java. Provider.certpath.pkixcertpathvalidator.enginevalidate (pkixcertpathvalidator.java:178) في java.security.cert.certpathvalidator.validate (ceratpathvalidator.java:250) في sun.security.validator.pkixvalidate. .28 أكثر

إليك الكود الذي أستخدمه (تم تحريره وضغطه قليلاً)

installAllTrustManager();

PostMethod post = new PostMethod(server_path);
NameValuePair[] data = new NameValuePair {
   new NameValuePair("Username", username), 
   new NameValuePair("Password", password) 
};
        post.setRequestBody(data);
        post.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
try {
            HttpClient hc = new HttpClient();
            int result2 = hc.executeMethod(post);
            if (result2 != HttpStatus.SC_OK) {
                throw new IOException("HTTP Status Not OK: " + result2);
            }
            return post.getResponseBodyAsStream();
        } finally {
            post.releaseConnection();
        }

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

ما الخطأ الذي افعله؟
كيف يمكنني الاتصال بالخادم بنجاح؟

هل كانت مفيدة؟

المحلول

يعني هذا الخطأ أنه لا يمكن التحقق من صحة سلسلة الشهادات.الأسباب المحتملة هي،

  1. المرجع المصدق الجذري غير موثوق به بواسطة JRE الخاص بك.
  2. تم توقيع الشهادة بواسطة شهادة متوسطة ولكن الخادم لا يرسلها مع الشهادة.

إليك كيفية الحصول على قائمة بشهادات الجذر،

keytool -list -keystore $JAVA_HOME/lib/security/cacerts -v

لا أعرف أي طريقة Java للتحقق من إرسال الشهادة المتوسطة.أستخدم opensl لذلك ،

openssl s_client -host example.com -port 443

سوف تظهر لك جميع الشهادات المرسلة من قبل الخادم.انتبه إلى "سلسلة الشهادات".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top