服务帐户引发 - SSLHandshakeException

Posted

技术标签:

【中文标题】服务帐户引发 - SSLHandshakeException【英文标题】:Service account Throws - SSLHandshakeException 【发布时间】:2016-06-19 00:03:27 【问题描述】:

非常感谢您阅读这篇文章,任何帮助将不胜感激!

我正在尝试使用服务帐户在云端硬盘中列出和创建一个文本文件。已生成服务帐户,下载 p12 文件还为该帐户启用了 Drive api。但我得到了 SSLHandshakeException。

Googleapi 版本: libs-sources/google-api-services-drive-v2-rev168-1.20.0-sources.jar

java 版本:“1.7.0_79” Java(TM) SE 运行时环境 (build 1.7.0_79-b15) Java HotSpot(TM) 64 位服务器 VM(内部版本 24.79-b02,混合模式)

已将下载的 p12 文件加载到 \jdk1.7.0_79\jre\lib\security 下的 cacerts 文件中。

发生错误:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 线程“主”javax.net.ssl.SSLHandshakeException 中的异常:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 在 sun.security.ssl.Alerts.getSSLException(未知来源) ............ 原因:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 在 sun.security.validator.PKIXValidator.doBuild(未知来源) ...... 原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 在 sun.security.provider.certpath.SunCertPathBuilder.engineBuild(未知来源)

这是我的源代码:

private static void getSomethingFromDrive() throws Exception 

    String emailAddress ="XXXXXtest@XXXXX.iam.gserviceaccount.com";
    JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    GoogleCredential.Builder credBuilder = new GoogleCredential.Builder();
    credBuilder.setTransport(httpTransport);
    credBuilder.setJsonFactory(JSON_FACTORY);
    credBuilder.setServiceAccountId(emailAddress);
    credBuilder.setServiceAccountPrivateKeyFromP12File(new File("XXXXX.p12"));
    credBuilder.setServiceAccountScopes(Arrays.asList(DriveScopes.DRIVE));
    GoogleCredential credential = credBuilder.build();

      Drive service = new Drive.Builder(httpTransport, JSON_FACTORY, credential).build();
      DriveOperation.printAbout(service);
        //Insert a file  
      com.google.api.services.drive.model.File body = new com.google.api.services.drive.model.File();
        body.setTitle("My document");
        body.setDescription("A test document");
        body.setMimeType("text/plain");

        java.io.File fileContent = new java.io.File("C:/Personal/document.txt");
        FileContent mediaContent = new FileContent("text/plain", fileContent);

        com.google.api.services.drive.model.File file = service.files().insert(body, mediaContent).execute();
        System.out.println("File ID: " + file.getId());


【问题讨论】:

【参考方案1】:

听起来像是密钥库问题。您是否将证书导入到 .jks 文件中?

嗯。我做了一些快速的研究,听起来应该可以。您可以查看您在 cacerts 中添加的证书吗?

或者它是否可能指向 jre cacerts 而不是 jdk cacerts?

【讨论】:

我的所有 C 盘中有 3 个 cacerts 文件。我已将 p12 文件添加到所有 cacerts 文件中,但仍然没有运气。我确实在 cacerts 文件中看到了私钥。 Neal,我已将 p12 文件添加到所有 cacerts(jdk 和 jre 并且还添加到 32 jre。)当我列出密钥库时,我可以看到私钥如下别名:privatekey Creation日期:2016 年 3 月 4 日 条目类型:PrivateKeyEntry 证书链长度:1 证书[1]:所有者:CN=111996787216743957705 颁发者:CN=111996787216743957705 序列号:7b5bc826c2aaa1ff 有效期:2016 年 3 月 4 日星期五 19:13:50 PST 星期一至: 2026 年 3 月 2 日 19:13:50 PST 证书指纹:MD5: E7:BF:.... SHA1: 60:... SHA256: 1A:8D:5D...:...... 签名算法名称: SHA1withRSA 版本:3 我唯一的其他建议是:1)创建一个密钥库(用于验证自己)并查看它是否有效,以及 2)检查以确保您将证书作为正确类型的证书导入。关于第 2 点,我不记得证书类型之间的差异,因为我很少这样做,但是我在工作中遇到了导入证书但我仍然无法进行身份验证的问题,因为我添加了证书作为类型错误。【参考方案2】:

解决了!!!!!! 我正在使用我的工作笔记本电脑,没想到我的工作电脑在 MIM 领域:) 当我尝试通过单击浏览器地址栏上的锁定图标来获取 accounts.google.com 的证书时,我发现了这一点。 我将代码移到了我的个人设备上,它可以正常工作。该死的大军团!!!!!!...

【讨论】:

以上是关于服务帐户引发 - SSLHandshakeException的主要内容,如果未能解决你的问题,请参考以下文章

如何使用服务帐户访问 Google Doc Api?

在 Relay 中创建嵌套突变会引发未知字段

ADAM/AzMan 中的并发更新引发了一个奇怪的错误

当它是存储帐户连接字符串时,如何使用输出变量?

PHP 精度计算引发的灾难性Bug

具有 Azure 存储的 Azure 函数 - 函数引发异常