We help IT Professionals succeed at work.

Code for Uploading a file over https

mte01
mte01 asked
on
Medium Priority
305 Views
Last Modified: 2012-08-14
Hey experts,

   I have currently a java closed source code that can be used to upload a file over HTTP; however, I need also the capability to upload over HTTPS. Any help on providing such available code, or on how to modify my existing code to make it support https ?(I can provide any needed sections of it to the experts).

Comment
Watch Question

CERTIFIED EXPERT
Top Expert 2016

Commented:

Author

Commented:
>>CEHJ

Yes, using the classes of this package, I was able to post a file over an http server, but my problem now is that it doesn't work directly over https (which is normal); some capabilities need to be added, and I am unable to find them..any help??
CERTIFIED EXPERT
Top Expert 2016

Commented:

Author

Commented:
>>CEHJ

Yes, it gives the following error:

An IOException occurred attempting to POST the file: test.txt
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
      at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.a(DashoA12275)
      at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
      at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
      at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA12275)
      at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA12275)
      at com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA12275)
      at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
      at com.sun.net.ssl.internal.ssl.SSLSocketImpl.j(DashoA12275)
      at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
      at com.sun.net.ssl.internal.ssl.AppOutputStream.write(DashoA12275)
      at org.apache.commons.httpclient.HttpConnection$WrappedOutputStream.write(HttpConnection.java:1360)
      at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:66)
      at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:124)
      at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:790)
      at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2271)
      at org.apache.commons.httpclient.HttpMethodBase.processRequest(HttpMethodBase.java:2651)
      at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1087)
      at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:643)
      at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:497)
      at com.tangoe.cmp.tools.HttpFilePost.simplePost(HttpFilePost.java:510)
      at com.tangoe.cmp.tools.HttpFilePost.performPost(HttpFilePost.java:421)
      at com.tangoe.cmp.tools.HttpFilePost.main(HttpFilePost.java:1000)
Caused by: sun.security.validator.ValidatorException: No trusted certificate found
      at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304)
      at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107)
      at sun.security.validator.Validator.validate(Validator.java:202)
      at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(DashoA12275)
      at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(DashoA12275)
      ... 19 more

with regular http, the file uploads normally
CERTIFIED EXPERT
Top Expert 2016
Commented:
Perhaps try it in conjunction with the following


http://javaalmanac.com/egs/javax.net.ssl/TrustAll.html

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts
Mick BarryJava Developer
CERTIFIED EXPERT
Top Expert 2010

Commented:
Mick BarryJava Developer
CERTIFIED EXPERT
Top Expert 2010

Commented:
>  I have currently a java closed source code that can be used to upload a file over HTTP

depending on the interface it provides you can most likely use it for https.

Author

Commented:
>>CEHJ

This TrustManager has to be at the server servelt...right?
CERTIFIED EXPERT
Top Expert 2016

Commented:
>>This TrustManager has to be at the server servelt...right?

It should be at the box from which you're trying to upload
Mick BarryJava Developer
CERTIFIED EXPERT
Top Expert 2010
Commented:
details on using ssl with httpclient if you decide to switch libraries

http://jakarta.apache.org/commons/httpclient/sslguide.html

Author

Commented:
By the way...This is the method in which I am uploading the file:

  private int simplePost(File aFile) throws IOException
  {
    BufferedInputStream bufStream = null;
    int statusCode1               = -1;
    try
    {
      HttpClient client = new HttpClient();

      PostMethod postMethod;
      if (bKeepFilenames == false)
      {
        postMethod = new PostMethod(strUrl);
      }
      else
      {
        postMethod = new PostMethod(fullPostUrl);
      }

      if (authUrl != null)
      {
        logger.info("(authPost) Authentication to url" + authUrl);
        PostMethod authPost = new PostMethod(authUrl);
        StringBuffer strBuf = new StringBuffer(100);
        strBuf.append(contentType).append("; charset=").append(charSet);

        // set the content type and try to automatically follow redirects
        authPost.setRequestHeader("Content-type", strBuf.toString());
        authPost.setFollowRedirects(true);
        int authStatusCode = client.executeMethod(authPost);

        //put the response body in the variable so clients can retrieve it later on
        responseBody = postMethod.getResponseBodyAsString();
        if (verbose)
        {
          StatusLine statLine = authPost.getStatusLine();
          logger.info("(authPost) Status Line: " + statLine);
        }

        if ((authStatusCode < 200) || (authStatusCode > 399))
        {
          logger.info("(authPost) Authentication failed");
          return authStatusCode;
        }
      }

      client.setConnectionTimeout(8000);

      // Send any file as the body of the POST request
      if (verbose)
      {
        logger.info("(simplePost) File length: " + aFile.length());
      }

      bufStream = new BufferedInputStream(new FileInputStream(aFile));

      postMethod.setRequestBody(bufStream);
      postMethod.setRequestContentLength((int)aFile.length());

      StringBuffer strBuf = new StringBuffer(100);
      strBuf.append(contentType).append("; charset=").append(charSet);

      // set the content type and try to automatically follow redirects
      postMethod.setRequestHeader("Content-type", strBuf.toString());

      // add any custom headers
      addCustomRequestHeaders(postMethod);

      postMethod.setFollowRedirects(true);
      statusCode1 = client.executeMethod(postMethod);
      postMethod.releaseConnection();

      StatusLine statLine = postMethod.getStatusLine();
      if (verbose)
      {
        logger.info("(simplePost) Status Line: " + statLine);
      }

      logger.info(buildSummaryLine(statLine, aFile));
    }
    catch (IOException ioe)
    {
      if (bufStream != null)
      {
        bufStream.close();
      }

      throw ioe;
    }

    bufStream.close();
    return statusCode1;
  }

Author

Commented:
It turned out that the problem is that the cacerts file in which the certificate is added is inside the weblogic folders (since I am using WebLogic for my servlet); when I copied that file to the jdk cacerts folder of the one I am running the client application in, it worked...thanks for you help guys!
CERTIFIED EXPERT
Top Expert 2016

Commented:
:-)
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.