java - 如何使用 HttpClient 将 HttpPost 发送到 HTTPS 端点?

标签 java debugging ssl httpclient

每当我尝试发布到 https 端点时,我都会收到 javax.net.ssl.SSLException: java.lang.NullPointerException :

import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.HttpClient;

try {
    MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
    HttpClient httpClient = new HttpClient(connectionManager);
    PostMethod pm = new PostMethod("https://www.random.org");
    httpClient.executeMethod(pm);
} catch (Exception e) {
    e.printStackTrace();
}

这给了我:

javax.net.ssl.SSLException: java.lang.NullPointerException
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1692)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1675)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1601)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:94)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
    at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828)
    at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.flushRequestOutputStream(MultiThreadedHttpConnectionManager.java:1565)
    at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2116)
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
    at <My File>
Caused by: java.lang.NullPointerException
    at org.bouncycastle.jce.provider.JCEECPublicKey.<init>(Unknown Source)
    at org.bouncycastle.jce.provider.JDKKeyFactory.createPublicKeyFromPublicKeyInfo(Unknown Source)
    at org.bouncycastle.jce.provider.X509CertificateObject.getPublicKey(Unknown Source)
    at sun.security.validator.PKIXValidator.initCommon(PKIXValidator.java:92)
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:60)
    at sun.security.validator.Validator.getInstance(Validator.java:161)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:108)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:204)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:637)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:89)

我没有专门在我的机器上配置 SSL,但我运行的 JSSE 测试脚本似乎表明它已安装。我可能跳过了必要的步骤吗? NullPointerException 让我认为这可能是一个错误,而不是预期的错误。

2012 年 5 月 15 日编辑:

我已经使用 eclipse 调试器进行了深入研究,直到我可以在我的 SSLSocketFactoryImpl 中看到证书。

SchemeSocketFactory socketfac = httpClient.getConnectionManager().getSchemeRegistry().getScheme("https").getSchemeSocketFactory();
socketfac.socketfactory.context.trustManager.trustedCerts.map.table, in debugger.

我可以找到我要访问的站点的证书;事情是,在这个过程中,表中有一个空指针异常。 (见附图。)如果我使用调试器删除我的条目集中产生 NPE 的 2 个(共 183 个)条目,我的代码运行得非常好,但这似乎不是一个可行的解决方案。我认为这不是我的 keystore 本身的问题 - 如果我使用 keytool -list -keystore cacerts,它会输出 183 个条目,并且每个条目的格式似乎都正确。


Table NPE


Table Good Entry


Table BAD Entry

最佳答案

终于找到答案了。我将使用 Maven 的 bouncycaSTLe 版本 133 作为项目单独部分所需的另一个工件的一部分。我的解决方案是在我的 maven pom.xml 文件中将 bouncycaSTLe 的 versionId 升级到 140。

关于java - 如何使用 HttpClient 将 HttpPost 发送到 HTTPS 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10590102/

相关文章:

java - 失败 : alter table add constraint: Table doesn't exist on create

iphone - 检测私有(private) API 的使用

delphi - 调试dcu路径

web-services - 从经典 ASP 使用 ssl .net web 服务

ssl - 如何将有效的 SSL 添加到 heroku 自定义域

ssl - 在 SSL 握手中,数据是否在客户端 pre-master 交换之前被加密?

java - 为什么使用静态枚举?

java - 如何在 Java 中删除 ArrayList 中的一个重复项

java - GAE/J : how do I get a User object from the user-id? 替代 : how come I can't set the nickname on a User object?

python - 是否有任何 ipdb 打印寻呼机?