Link to home
Start Free TrialLog in
Avatar of mte01
mte01Flag for Lebanon

asked on

Code for Uploading a file over https

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).

Avatar of CEHJ
CEHJ
Flag of United Kingdom of Great Britain and Northern Ireland image

Avatar of mte01

ASKER

>>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??
Avatar of mte01

ASKER

>>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
ASKER CERTIFIED SOLUTION
Avatar of CEHJ
CEHJ
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
>  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.
Avatar of mte01

ASKER

>>CEHJ

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

It should be at the box from which you're trying to upload
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of mte01

ASKER

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;
  }
Avatar of mte01

ASKER

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!
:-)