Завершение HTTPS в Java - PullRequest
       4

Завершение HTTPS в Java

1 голос
/ 20 апреля 2011

Как мне преобразовать этот код PHP в Java? Как мне установить соединение HTTPS?

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $to_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 40);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

Я использую это для HTTP, я не могу использовать что-то подобное

URL url = new URL("http://XZX");
            URLConnection con = url.openConnection();
            con.setDoInput(true);
            con.setConnectTimeout(40000);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setDefaultUseCaches(false);
            // tell the web server what we are sending
            con.setRequestProperty("Content-Type", "text/xml;charset=\"utf-8\"");
            con.setRequestProperty("Accept", "text/xml");
            con.setRequestProperty("Cache-Control", "no-cache");
            con.setRequestProperty("Pragma", "no-cache");
            con.setRequestProperty("SOAPAction", "\"run\"");
            con.setRequestProperty("Content-length", String.valueOf(requestXml.length()));
            OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
            writer.write(requestXml);
            writer.flush();
            writer.close();
            InputStreamReader reader = new InputStreamReader(con.getInputStream());

Ответы [ 3 ]

2 голосов
/ 20 апреля 2011

Вы захотите изучить использование Apache HTTP Components . В нем есть все функции, необходимые для создания веб-запросов на Java.

Если вы не хотите использовать библиотеку Apache, Java имеет встроенный класс HttpsURConnection для подключения по HTTPS.

1 голос
/ 07 февраля 2014

Вы должны использовать класс HttpsURLConnection

Но, поскольку вы используете следующие опции в curl

curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, 0);

curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, 0);

Вам также необходимо установить HostNameVerifier, который не проверяет имя хоста, и SSlSocketFactory, который не проверяет действительность сертификата сервера.

Это можно сделать с помощью этого небольшого примера:

// creating all trust manager. It will accept as valid any certificate.
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) {
        }
    }
};
SSLContext sslContext = SSLContext.getInstance("SSL");
// set our friendly trust manager to ssl context. we pass it to connection later
sslContext.init(null, trustAllCerts, null); 
HttpsURLConnection connection = (HttpsURLConnection) (url).openConnection();
// set all trust manager to connection
connection.setSSLSocketFactory(sslContext.getSocketFactory());
// here we say not to check host name
connection.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });

после того, как вы можете установить заголовки, тайм-ауты, например как вы уже делаете для URLConnection

0 голосов
/ 04 февраля 2014

Я не шаманец PHP, но, похоже, в вашем примере кода есть некоторые привязки PHP libcurl. Вы можете сделать то же самое в Java с небольшими изменениями, используя привязку libcurl Java , которую можно скачать здесь .

Образец из test.java выглядит так:

test cw = new test();

// Register callback write function
cg = new CurlGlue();
cg.setopt(CurlGlue.CURLOPT_WRITEFUNCTION, cw);

// Login to the bank's secure Web site, posting account number and PIN code
cg.setopt(CurlGlue.CURLOPT_URL, "https://www.santander.com.mx/SuperNetII/servlet/Login");
cg.setopt(CurlGlue.CURLOPT_SSLVERSION, iSSLVersion);
cg.setopt(CurlGlue.CURLOPT_SSL_VERIFYPEER, bInsecureMode ? 0 : 1);
cg.setopt(CurlGlue.CURLOPT_VERBOSE, bVerboseMode ? 1 : 0);
cg.setopt(CurlGlue.CURLOPT_FOLLOWLOCATION, 1);
cg.setopt(CurlGlue.CURLOPT_POST, 1);
cg.setopt(CurlGlue.CURLOPT_COOKIEJAR, "cookie.txt");
cg.setopt(CurlGlue.CURLOPT_POSTFIELDS, "pag=login&pagErr=/index.html&usuario="+account+"&clave="+pinCode+"&irAmodulo=1");
cg.perform();

Хотя это выглядит немного грубо. README упоминает, что реализован только простой API, и может потребоваться указать несколько значений int вручную. Может потребоваться некоторое усилие для правильной настройки среды для привязок, так как вам необходимо убедиться, что библиотеки curl и ssl находятся в PATH вашей среды. Похоже, что myset сценарии предназначены для решения этой проблемы.

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