如何使用 AuthorizeNet 连接避免 java.security.cert.CertificateException?

How to avoid java.security.cert.CertificateException with AuthorizeNet connection?

我需要连接 AuthorizeNet 但我得到:

javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:未找到与 certification.authorize.net 匹配的主题备用 DNS 名称(请参阅下面的错误跟踪)。

我用的URL是https://certification.authorize.net/gateway/transact.dll

我的classAuthorizeNet中的连接代码如下:

        URL url = new URL(“https://certification.authorize.net/gateway/transact.dll”);
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);
        connection.setUseCaches(false);
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());

错误轨迹如下:

2015-04-06 13:00:52,592 [ajp-bio-8009-exec-1] 错误 com.aaa.AuthorizeNet:541 - javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:未找到与 certification.authorize.net 匹配的主题备用 DNS 名称。 在 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 在 sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270) 在 sun.security.ssl.ClientHandshaker.serverCertificate(客户Handshaker.java:1341) 在 sun.security.ssl.ClientHandshaker.processMessage(客户Handshaker.java:153) 在 sun.security.ssl.Handshaker.processLoop(Handshaker.java:868) 在 sun.security.ssl.Handshaker.process_record(Handshaker.java:804) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) 在 sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 在 sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1091) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) 在 com.aaa.AuthorizeNet.startNetConnection(AuthorizeNet.java:533)

我使用旧的 URL 进行连接,这给出了错误。新的真实 URL 是 https://secure.authorize.net/gateway/transact.dll。然后需要从 AuthorizeNet 获取 LoginID 和 transaction Key。如果您是商家,您可以获得 LoginID/TransactionKey 允许您测试交易

由 运行 客户使用这些额外参数解决了它:-Djavax.net.debug=ssl,handshake 参考:Paypal SSLHandshakeException

在另一种情况下,以下代码片段帮助我解决了问题:

urlCon.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session){
        return true;
    }
});