【问题标题】:'peer not authenticated' SSL certificate error usng DefaultHttpClient'peer not authenticated' SSL 证书错误使用 DefaultHttpClient
【发布时间】:2014-07-08 09:03:41
【问题描述】:

我有一个应用程序 jar,我从中调用 HTTPS url 使用 DefaultHTTPClient 类 对象,但它给 peer not authenticate 异常,所以我想使用密钥库签署 jar .

我有带有公钥的 .cer 文件,我可以导入密钥库,但是当我使用 jarsigner 工具时,它说找不到证书链。您必须拥有私钥并关联公钥。

我也有 .pfx 文件,假设是私钥,但我不知道如何导入它。谁能告诉我如何导入 .pfx 文件并在 jarsigner 中使用的步骤。

如果我在某处错了,请纠正我..

更新

根据@Duncan,我可以通过引用This Link. 在 JVM 中导入 .cer 文件。我使用以下命令将 .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)

我的代码是:

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();
}

【问题讨论】:

  • 您无需签署 代码 即可建立 https 连接,您需要设置正确的密钥库,以便 https 客户端知道信任服务器证书,如果服务器需要客户端身份验证,可能会提供自己的证书。
  • 签名 jar 文件与 SSL 的“peer not authenticated”完全无关。
  • @IanRoberts 哦!!!如何设置密钥库?

标签: java keytool


【解决方案1】:

此异常表明与服务器 URL 的连接不是来自经过身份验证的客户端。要解决这个问题,我们必须在 jre 中导入服务器的公共证书,java 应用程序正在运行该证书以导入证书,请按照以下步骤操作:

根据@Duncan(评论)我可以通过引用This Link在JVM中导入.cer文件。我使用以下命令将.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”以信任证书

信任此证书? [否]:是 证书已添加到密钥库

【讨论】:

  • 链接不可用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
相关资源
最近更新 更多