使用java将文件上传到Amazon S3失败 - sun.security.validator.ValidatorException

时间:2016-10-26 08:13:03

标签: java eclipse amazon-s3

我正在使用 eclipse 并在 java中编写了一个方法来将文件上传到amazon s3 。它从主要方法成功上传。从eclipse我从debug透视图中复制了等效的命令并在命令提示符下运行,它的工作正常。我在项目和打包的jar文件中添加了代码的那部分。当我在jar文件中调用该函数时抛出

sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标错误的有效证书路径。

我在eclipse中指出的所有依赖jar文件,同样我在打包的jar文件中指出。 Stil它没有用。

上传到亚马逊s3的方法

public static boolean saveFileToS3(File f, Long contentLength, String s3Name, String bucketName,String accessKey, String secretKey) throws FileNotFoundException, IllegalArgumentException, IOException, InterruptedException {

    AmazonS3 s3Client = null;
    try {
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        s3Client = new AmazonS3Client(credentials);
    } catch (Exception e1) {
        e1.printStackTrace();
        return false;
    }        

    List<PartETag> partETags = new ArrayList<PartETag>();
    InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, s3Name);
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(contentLength);

    initRequest.setObjectMetadata(metadata);
    initRequest.withCannedACL(CannedAccessControlList.PublicRead);
    InitiateMultipartUploadResult initResponse = null;
    try {
        initResponse = s3Client.initiateMultipartUpload(initRequest);
        if(initResponse == null){
            return false;
        }
    } catch (AmazonServiceException e) {
        e.printStackTrace();
    } catch (AmazonClientException e) {
        e.printStackTrace();
    } catch (Exception e){
        return false;
    }
    long partSize = 10485760; // Set part size to 10 MB.
    try {
        long filePosition = 0;
        for (int i = 1; filePosition < contentLength; i++) {
            partSize = Math.min(partSize, (contentLength - filePosition));

            if(initResponse == null){
                return false;
            }

            UploadPartRequest uploadRequest = new UploadPartRequest().withBucketName(bucketName).withKey(s3Name).withUploadId(initResponse.getUploadId()).withPartNumber(i).withFileOffset(filePosition).withFile(f).withPartSize(partSize);

            partETags.add(s3Client.uploadPart(uploadRequest).getPartETag());

            filePosition += partSize;
        }
        CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(bucketName, s3Name, initResponse.getUploadId(), partETags);

        s3Client.completeMultipartUpload(compRequest);
        System.out.println("Upload complete.");
    } catch (AmazonClientException amazonClientException) {
        s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(bucketName, s3Name, initResponse.getUploadId()));
        amazonClientException.printStackTrace();
        f.delete();
        return false;
    }
    f.delete();
    return true;
}

抛出异常

com.amazonaws.AmazonClientException: Unable to execute HTTP request: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:461)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:234)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3569)
at com.amazonaws.services.s3.AmazonS3Client.initiateMultipartUpload(AmazonS3Client.java:2619)
at com.virima.discoveryagentclient.ClientUtils.saveFileToS3(ClientUtils.java:2541)
at com.virima.discoveryagentclient.probes.ProbeService.runProbe(ProbeService.java:1392)
at com.virima.discoveryagentclient.probes.ProbeService.run(ProbeService.java:2187)
Caused by: 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(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1497)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:535)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:403)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:391)
... 6 more
Caused by: 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.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1479)
... 23 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 29 more

我已经包含了亚马逊s3上传功能所需的这四个罐子。 AWS-Java的SDK-1.7.8.1.jar 杰克逊的注解 - 2.1.2.jar 杰克逊核心2.2.3.jar 杰克逊 - 数据绑定-2.1.2.jar

这是我用来从main方法

运行的命令
"C:\Program Files\Java\jre1.8.0_51\bin\javaw.exe" -Dfile.encoding=Cp1252 -classpath C:\Workspace\bin;C:\Workspace\modules\lib\servlet-api.jar;C:\Workspace\modules\lib\rztbase.jar;C:\Workspace\modules\lib\mongo-2.10.1.jar;C:\Workspace\modules\lib\json_simple-1.1.jar;C:\Workspace\modules\lib\log4j-1.2.16.jar;C:\Workspace\modules\lib\commons-beanutils-1.8.3.jar;C:\Workspace\modules\lib\guava-14.0.1.jar;C:\Workspace\modules\lib\commons-httpclient-3.1.jar;C:\Workspace\modules\lib\jedis-2.8.0.jar;C:\Workspace\modules\lib\commons-pool2-2.4.2.jar;C:\Workspace\buildconfig\gen\out;C:\Workspace\modules\lib\cglib-nodep-2.2.3.jar;C:\Workspace\modules\lib\geocode.jar;C:\Workspace\modules\lib\json-org.jar;C:\Workspace\modules\lib\eclipselink.jar;C:\Workspace\modules\lib\dom4j-1.6.1.jar;C:\Workspace\modules\lib\poi-ooxml-schemas-3.7.jar;C:\Workspace\modules\lib\jaxb-api.jar;C:\Workspace\modules\lib\jaxb-core.jar;C:\Workspace\modules\lib\jaxb-impl.jar;C:\Workspace\modules\lib\jaxb-xjc.jar;C:\Workspace\modules\lib\jaxb-jxc.jar;C:\Workspace\modules\lib\gson-2.2.4.jar;C:\Workspace\modules\lib\velocity-1.7.jar;C:\Workspace\modules\lib\commons-lang-2.4.jar;C:\Workspace\modules\lib\poi-3.10-beta2.jar;C:\Workspace\modules\lib\mpxj.jar;C:\Workspace\modules\lib\shiro-core-1.2.3.jar;C:\Workspace\modules\lib\slf4j-api-1.7.6.jar;C:\Workspace\config\email\templates;C:\Workspace\modules\lib\shiro-ehcache-1.2.3.jar;C:\Workspace\modules\lib\ehcache-2.8.1.jar;C:\Workspace\modules\lib\hibernate-c3p0-4.3.4.Final.jar;C:\Workspace\modules\lib\rztbuild.jar;C:\Workspace\modules\lib\quartz-2.2.1.jar;C:\Workspace\modules\lib\aws-java-sdk-1.7.8.1.jar;C:\Workspace\modules\lib\jackson-annotations-2.1.2.jar;C:\Workspace\modules\lib\jackson-databind-2.1.2.jar;C:\Workspace\modules\lib\jackson-core-2.2.3.jar;C:\Workspace\modules\lib\Rhino_1_7R4.jar;C:\Workspace\modules\lib\poi-ooxml-3.9.jar;C:\Workspace\modules\lib\xmlbeans-2.3.0.jar;C:\Workspace\modules\lib\opencsv-2.3.jar;C:\Workspace\modules\lib\BASE64Decoder.jar;C:\Workspace\modules\lib\commons-net-3.3.jar;C:\Workspace\modules\lib\mybatis-3.2.8.jar;C:\Workspace\modules\lib\elasticsearch-1.7.1.jar;C:\Workspace\modules\lib\lucene-core-4.10.4.jar;C:\Workspace\modules\lib\commons-math3-3.5.jar;C:\Workspace\modules\lib\lucene\lucene-core-4.9.0.jar;C:\Workspace\modules\lib\itextpdf-5.5.6.jar;C:\Workspace\modules\lib\joda-time-2.8.jar;C:\Workspace\modules\lib\jcommon-1.0.0.jar;C:\Workspace\modules\lib\jfreechart-1.0.1.jar;C:\Workspace\modules\lib\mysql-connector-java-5.1.37-bin.jar;C:\Workspace\modules\lib\jsoup-1.8.3.jar;C:\Workspace\modules\lib\diffutils-1.3.0.jar;C:\Workspace\modules\lib\grammatica-1.5.jar;C:\Workspace\modules\lib\mibble-mibs-2.9.3.jar;C:\Workspace\modules\lib\mibble-parser-2.9.3.jar;C:\Workspace\modules\lib\snmp6_0.jar;C:\Workspace\modules\lib\concurrent-trees-2.4.0.jar;C:\Workspace\modules\lib\thumbnailator-0.4.8.jar;C:\Workspace\modules\lib\batik-all-1.7.jar;C:\Workspace\modules\lib\xml-apis-ext-1.3.04.jar;C:\Workspace\modules\lib\evo-inflector-1.0.1.jar;C:\Workspace\modules\lib\xmlsec-1.3.0.jar;C:\Workspace\modules\lib\sqlite-jdbc-3.7.2.jar com.em.core.services.impl.DiscoveryService

我的问题是,

  1. 当我从eclipse main方法运行时,我能够上传,当我从命令提示符运行时,我能够上传。但是当我在jar中打包时,相同的代码失败了,即使我在类路径中也添加了所有jar。为什么呢?

  2. 如何修复此错误?

2 个答案:

答案 0 :(得分:0)

默认情况下,Java附带一组非常有限的根CA证书,问题是您的运行系统中缺少amazon s3 ca证书

答案 1 :(得分:0)

你能提到用来触发main方法的命令吗?问题清楚地表明您遇到了握手异常,因此我假设在通过您的命令运行jar时证书路径无效。