ejemplo ejecutar desde java https httpurlconnection outputstream filepicker.io

ejecutar - ¿Cómo guardar el archivo de la url de HTTPS en JAVA?



ejecutar curl desde java (2)

La causa del error es que Java no puede confirmar la validez del certificado. Esto puede solucionarse importando el certificado en el almacenamiento del certificado JAVA, o "arreglado" al deshabilitar la validación del certificado SSL.

Estoy tratando de guardar un archivo de URL usando outputstream. La URL está segura por https. Así que recibí un error cuando trato de obtener el archivo como el siguiente

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 sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source) at sun.security.ssl.Handshaker.fatalSE(Unknown Source) at sun.security.ssl.Handshaker.fatalSE(Unknown Source) at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source) at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source) at java.net.URL.openStream(Unknown Source) Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source) at java.security.cert.CertPathBuilder.build(Unknown Source) ... 60 more

Supongamos que quiero abrir el archivo desde esta URL

https://www.filepicker.io/api/file/KW9EJhYtS6y48Whm2S6D?signature=4098f262b9dba23e4766ce127353aaf4f37fde0fd726d164d944e031fd862c18&policy=eyJoYW5kbGUiOiJLVzlFSmhZdFM2eTQ4V2htMlM2RCIsImV4cGlyeSI6MTUwODE0MTUwNH0=

Entonces hago algo como:

try{ URL URL = new URL(''https://www.filepicker.io/api/file/KW9EJhYtS6y48Whm2S6D?signature=4098f262b9dba23e4766ce127353aaf4f37fde0fd726d164d944e031fd862c18&policy=eyJoYW5kbGUiOiJLVzlFSmhZdFM2eTQ4V2htMlM2RCIsImV4cGlyeSI6MTUwODE0MTUwNH0=''); String = path = "D://download/"; InputStream ins = url.openStream(); OutputStream ous = new FileOutputStream(path); final byte[] b = new byte[2048]; int length; while ((length = inputStream.read(b)) != -1) { ous.write(b, 0, length); } ins.close(); ous.close(); }

El resultado es que no pasa nada en el floder dedicado porque se muestra el error. ¿Cómo puedo obtener el archivo de la url de HTTPS?


Una conexión HTTPS requiere un apretón de manos. Es decir, se reconocen explícitamente. El servidor se identificó mediante un certificado HTTPS, pero aparentemente no tiene este certificado en su almacén de confianza y no está en ningún lugar de su código Java que reconozca explícitamente la identificación, por lo que el HttpsURLConnection (que se usa aquí debajo) se niega para continuar la solicitud HTTPS.

Como ejemplo de inicio, puede usar el siguiente fragmento de código en su clase para permitir que HttpsURLConnection acepte todos los certificados SSL, independientemente de la URL HTTPS que use.

static { final TrustManager[] trustAllCertificates = new TrustManager[] { new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; // Not relevant. } @Override public void checkClientTrusted(X509Certificate[] certs, String authType) { // Do nothing. Just allow them all. } @Override public void checkServerTrusted(X509Certificate[] certs, String authType) { // Do nothing. Just allow them all. } } }; try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCertificates, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (GeneralSecurityException e) { throw new ExceptionInInitializerError(e); } }

Sin embargo, si desea un control más detallado por certificado, implemente los métodos de acuerdo con su Javadoc .

No relacionado con el problema concreto, tienes un segundo problema en tu código. Está intentando guardar el archivo descargado como una carpeta en lugar de como un archivo.

String = path = "D://download/"; OutputStream ous = new FileOutputStream(path);

Aparte del error de sintaxis que es más probable resultado de descuido al formular la pregunta (es decir, editar el código directamente en cuestión en lugar de copiar el código de trabajo), esto no tiene ningún sentido. No debe especificar una carpeta como ubicación de guardado. Debe especificar un nombre de archivo. Si es necesario, puede extraerlo del encabezado Content-Disposition o autogenerar uno con File#createTempFile() . P.ej

File file = File.createTempFile("test-", ".jpg", new File("D:/download/")); Files.copy(url.openStream(), file.toPath(), StandardCopyOption.REPLACE_EXISTING);

(Y si ya está en Java 7, solo haga uso de Files#copy() lugar de ese texto repetitivo)