Конвертировать HTTP-сообщение из рубина в Java или Groovy - PullRequest
0 голосов
/ 29 августа 2018

У меня есть некоторый код поста ruby ​​http для использования API, но сейчас мне нужно преобразовать его в java или groovy

это мой код на ruby ​​

def loginWithEmailPassword(str_email, str_password)
  uri = URI(url)

  req = Net::HTTP::Post.new(uri)
  req['Content-Type'] = 'application/json'
  req['x-request-id'] = "xyz-#{SecureRandom.hex}"
  req['user-agent'] = 'xyz'

  req.body = { 
  email: str_email, 
  password: str_password
  }.to_json

  Net::HTTP.start(uri.host, uri.port,
    :use_ssl => uri.scheme == 'https',
    :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
    response = http.request(req) # Net::HTTPResponse object

    if(response.code != '200')
      puts response.body # Show response body
      raise ("ERROR: login error... error code #{response.code}")
    end
    return response.body
  end
end

Это мой код на Java

    def loginApiWithEmailPassword(String sEmail, String sPassword){
            URL url = new URL(m_url + "/login/password");
            JSONObject json = new JSONObject();
            json.put("email", sEmail);
            json.put("password", sPassword);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// set header
            conn.setRequestMethod("POST")
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("user-agent", aaa);
            conn.setRequestProperty("x-request-id", getSecureRandom(s))
            conn.setDoOutput(true);
            conn.setDoInput(true);

            OutputStream os = conn.getOutputStream();

            os.write(json.toJSONString().getBytes());
            os.close();

            // read the response
            InputStream input = new BufferedInputStream(conn.getInputStream());
            String result = org.apache.commons.io.IOUtils.toString(input, "UTF-8");
            JSONObject jsonObject = new JSONObject(result);


            input.close();
            conn.disconnect();

            return jsonObject;
        }

Я пытался преобразовать его в Java, но не удалось, застрял на ошибки "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"

И если не удастся продолжить проверку следующей функции, пусть кто-нибудь сможет помочь мне завершить http-пост для java или groovy

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Итак, ваша главная проблема в том, что Java не доверяет вашему сертификату из коробки. Решение, упомянутое Югом Сингхом для изменения TrustManager, должно работать, если все сделано правильно, но оно ИМХО не очень чистое.

Лучшее решение - получить сертификат, которому вы хотите доверять (обычно вы можете скачать его через браузер, щелкнув по маленькому символу блокировки в URL), и добавить его в java trustStore вашего компьютера или, если вы только хотите доверить его этому коду, создайте новый trustStore и дайте команду java использовать этот trustStore.

Информация о том, как использовать trsutStore, может быть найдена в нескольких местах, таких как документы оракула: https://docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html и https://docs.oracle.com/cd/E19830-01/819-4712/ablqw/index.html

По сути, вы создаете хранилище доверия через

keytool -import -file theCertificateToBeTrusted.cert -alias justSomeAlias -keystore myTrustStore

и вы не используете Java для использования этого хранилища ключей, запустив его с некоторыми дополнительными параметрами

-Djavax.net.ssl.trustStore=/path/toYour/myTrustStore

(я думаю, вам не нужно устанавливать пароль в trustStore для этого варианта использования)

также взгляните на этот SO-ответ: Использование сертификата браузера в java-программе

0 голосов
/ 29 августа 2018

Вы можете использовать упомянутое решение здесь . Согласно этому решению вы можете реализовать метод doTrustToCertificates() и затем вызвать этот метод перед установкой соединения:

public void doTrustToCertificates() throws Exception {
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }

                    public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }

                    public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }
                }
        };

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                    System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
                }
                return true;
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }

Позвоните doTrustToCertificates(), прежде чем пытаться подключиться к URL, как показано ниже:

    public void loginApiWithEmailPassword(String sEmail, String sPassword){
            URL url = new URL(m_url + "/login/password");
            JSONObject json = new JSONObject();
            json.put("email", sEmail);
            json.put("password", sPassword);
            doTrustToCertificates();/
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// set header
            conn.setRequestMethod("POST")
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("user-agent", aaa);
            conn.setRequestProperty("x-request-id", getSecureRandom(s))
            conn.setDoOutput(true);
            conn.setDoInput(true);

            OutputStream os = conn.getOutputStream();

            os.write(json.toJSONString().getBytes());
            os.close();

            // read the response
            InputStream input = new BufferedInputStream(conn.getInputStream());
            String result = org.apache.commons.io.IOUtils.toString(input, "UTF-8");
            JSONObject jsonObject = new JSONObject(result);


            input.close();
            conn.disconnect();

            return jsonObject;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...