服务帐户引发 - 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的主要内容,如果未能解决你的问题,请参考以下文章