java - 使用 DefaultHttpClient 时出现“未通过身份验证”的 SSL 证书错误

标签 java keytool

我有一个应用程序 jar,我从中使用 DefaultHTTPClient 类调用一个 HTTPS url 对象,但它给出了peer not authenticate exception,所以我想使用 keystore 对 jar 进行签名.

我有带有公钥的 .cer 文件,我可以导入到 keystore 中,但是当我使用 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'来信任证书

信任这个证书? [否]:是的 证书已添加到 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();
}

最佳答案

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

根据@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

关于java - 使用 DefaultHttpClient 时出现“未通过身份验证”的 SSL 证书错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23754081/

相关文章:

java - 初学者二维数组越界异常

java - 如何使用 Java 显示来自 Oracle 的连接?

java - 安卓 "Host is Unknown"错误

java - 合并 2 个 .jks 信任库文件

java - 在 windows 机器上生成的 keystore 可以在 unix 机器上使用

java - 从 List<Integer> 中正确删除整数

java - 我如何制作一个 "dice"每次使用它时随机生成一个数字 1-6?

java - 我们可以在 Java trustStore 的逻辑文件夹结构中组织具有多个子项的每个证书链吗

Apache Mina FTP 服务器 SFTP 配置和连接 SFTP 连接使用 FileZiza 或 WInscp 或任何 ftp 客户端接管安全通道

java - 带有客户端身份验证的 SSL 套接字连接