我正在使用当前版本的 rest client builder 插件。我通过 curl 测试了 uri:
curl --user username:password https://localhost:8085/rest/api/latest/plan.json?os_authType=basic
我得到了预期的 json 作为返回。当我尝试使用这样的插件将其转换为 grails 时:
RestBuilder rb = new RestBuilder()
def response = rb.get("https://localhost:8085/rest/api/latest/plan.json?os_authType=basic"){
auth 'username', 'password'
}
response.json instanceof JSONObject
我收到这个错误:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is 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
为什么它在 curl 中工作而不是在插件中工作?我如何让它发挥作用?
谢谢!
最佳答案
您需要将根证书添加到受信任的存储中。
http://docs.oracle.com/javase/tutorial/security/toolsign/rstep2.html
将证书导入为受信任的证书
在您授予签名代码读取指定文件的权限之前,您需要将 Susan 的证书作为受信任的证书导入您的 keystore 中。
假设你收到了来自 Susan 的邮件
- 已签名的 JAR 文件
sCount.jar
,其中包含Count.class
文件,以及 - 文件
Example.cer
,其中包含与用于签署 JAR 文件的私钥相对应的公钥的公钥证书。
即使您创建了这些文件并且它们实际上并未传输到任何地方,您也可以模拟成为创建者和发送者 Susan 之外的其他人。假装你现在是雷。作为 Ray,您将创建一个名为 exampleraystore
的 keystore ,并将使用它将证书导入到别名为 susan
的条目中。
每当您使用 keytool
命令指定一个尚不存在的 keystore 时,就会创建一个 keystore 。因此,我们可以创建 exampleraystore
并通过单个 keytool
命令导入证书。在命令窗口中执行以下操作。
- 转到包含公钥证书文件
Example.cer
的目录。 (您实际上应该已经在那里了,因为本课假设您自始至终都在一个目录中。) 在一行中输入以下命令:
keytool -import -别名苏珊 -file Example.cer -keystore exampleraystore
由于 keystore 尚不存在,将创建它,并提示您输入 keystore 密码;输入您想要的任何密码。
keytool
命令将打印出证书信息并要求您对其进行验证,例如,将显示的证书指纹与从另一个(受信任的)信息源获得的指纹进行比较。 (每个指纹都是一个相对较短的数字,可以唯一且可靠地标识证书。)例如,在现实世界中,您可能会调用 Susan 并询问她的指纹应该是什么。她可以通过执行命令获取她创建的Example.cer
文件的指纹
keytool -printcert -file Example.cer
如果她看到的指纹与 keytool
报告给您的指纹相同,则证书在传输过程中没有被修改。在这种情况下,您可以让 keytool
继续在 keystore 中放置受信任的证书条目。该条目包含文件 Example.cer
中的公钥证书数据,并分配了别名 susan
。
关于rest - grails-RestClientBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23226817/