因为需要对自己的后端访问请求,做性能分析,其中有部分接口是调用了第三方的网络资源。现在想通过抓包,能够抓到从自己的本地的服务中,向外发送请求之间的关系。
使用Charles请求,来抓去Java应用程序。当我配置好Charles之后,Java程序 爆出如下的错误:
{
"httpStatusCode": 500,
"errorMessage": "I/O error on POST request for \"https://第三方请求链接\": 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"
}
然后Google了一番,想着应该是没有配置好应用程序的证书。然后找到charles 的官网上面,去寻找如何配置SSL证书。
SSL Certificates • Charles Web Debugging Proxy
官网上有专门针对Java Application 的说明。这里只说明下,在Mac下的操作。
先从Charles软件的 Help --> SSL Proxying > Save Charles Root Certificate. 将证书文件保存在Desktop文件夹下。
- 首先就是确定自己的$JAVA_HOME。Mac下通过执行
/usr/libexec/java_home
可以得到路径; - 然后执行证书的导入命令。(官网有些时候不能显示完整的命令)
sudo keytool -import -alias charles -file ~/Desktop/charles-ssl-proxying-certificate.pem -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
其中 “changeit” 是java虚拟机中的cacerts文件的密码。
- 通常这时候就成功了,可以输入命令查看
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit