‘peer not authenticated’SSL证书错误使用DefaultHttpClient
我有一个应用程序jar,我使用DefaultHTTPClient类对象调用HTTPS url,但是它给对等 体validation exception ,所以我想使用keystore对jar进行签名。
我有.cer文件有公钥我可以导入密钥库但是当我使用jarsigner工具时它说没有找到证书链。你必须有私钥和关联公钥。
我也有.pfx文件,这是假设私钥,但我不知道如何导入它。任何人都能告诉我如何导入.pfx文件和在jarsigner中使用的步骤。
如果我在某处错了,请纠正我
UPDATE
根据@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)
我的代码是:
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(); }
此exception表明与服务器URL的连接不是来自经过身份validation的客户端。 要解决此问题,我们必须在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证书已添加到密钥库