我有一个应用程序 jar,我从中使用 DefaultHTTPClient 类对象调用HTTPS url,但它给对等方未验证异常,所以我想使用密钥库对 jar 进行签名。
我有一个带有公钥的 .cer 文件,我可以导入到密钥库中,但是当我使用 jarsigner 工具时,它说没有找到证书链。你必须有私钥和关联公钥。
我也有 .pfx 文件,它假设是一个私钥,但我不知道如何导入它。谁能告诉我如何导入 .pfx 文件并在 jarsigner 中使用的步骤。
如果我在某处错了,请纠正我..
更新
根据@Duncan,我可以通过引用此链接在 JVM 中导入 .cer 文件。. 我使用 bellowed 命令将 .cer 导入 cacerts
c:\Program Files\Java\jre7\bin>keytool -importcert -alias esbcert -file "e:\Desktop\esbcert\esb.cer" -keystore "c:\Program Files\Java\jre7\lib\security\cacerts"
-storepass changeit
在此之后,我输入“y”以信任证书
Trust this certificate? [no]: y
Certificate was added to keystore
之后我运行我的应用程序,但它仍然给我 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
堆栈如下:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(Unknown Source)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.jav
a:126)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFact
ory.java:572)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnect
ion(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedCli
entConnectionImpl.java:294)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(Default
RequestDirector.java:645)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultReq
uestDirector.java:480)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpCl
ient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpCl
ient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpCl
ient.java:784)
at testhttps.TestHTTPS.testWithMKCLHTTPClient(TestHTTPS.java:95)
at testhttps.TestHTTPS.main(TestHTTPS.java:49)
Run Code Online (Sandbox Code Playgroud)
我的代码是:
String url = "https://domain.org/webapp/transformer/doTransformer/doReg";
try {
HttpPost postRequest = new HttpPost(url);
HttpResponse httpResponse = null;
DefaultHttpClient httpClient = new DefaultHttpClient();
httpResponse = httpClient.execute(postRequest);
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
此异常表明对服务器 URL 的连接不是来自经过身份验证的客户端。要解决此问题,我们必须将服务器的公共证书导入jre其中 java 应用程序正在运行以导入证书,请执行以下步骤:
根据@Duncan(评论),我可以通过引用此链接在 JVM 中导入 .cer 文件。我使用 bellowed 命令将 .cer 导入到 cacerts
c:\Program Files\Java\jre7\bin>keytool -importcert -alias esbcert -file "e:\Desktop\esbcert\esb.cer" -keystore "c:\Program Files\Java\jre7\lib\security\cacerts " -storepass changeit
在此之后,我输入“y”以信任证书
信任这个证书?[no]:y 证书已添加到密钥库
| 归档时间: |
|
| 查看次数: |
36144 次 |
| 最近记录: |