0

这个问题类似于How to use PEM file to create a SSL socket in Java? 但是,我似乎无法从该问题中获得建议的解决方案。我曾经能够连接到 .Net Web 服务,但现在他们已经通过证书实现了 SLL,我无法再访问它。服务器团队为我提供了一个证书,使我能够再次连接到 Web 服务。我已经确认这是使用 curl 工作的:

curl -E cer_file.pem:password https://hostname/servicename.svc?wsdl

所以,上面正确地返回了 wsdl。我必须为 curl 调用创建 .cacert.pem 文件才能正常工作,以避免出现此消息(curl:(77)错误设置证书验证位置):

curl http://curl.haxx.se/ca/cacert.pem > .cacert.pem
export SSL_CERT_FILE=/Users/jcran/.cacert.pem

现在,当我尝试使用下面的 Java 时,我仍然得到 403。我想知道是否有人能发现我做错了什么?

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSocketFactory;


public class TestSSL {

private static final String WS_URL 
    = "https://hostname/servicename.svc?wsdl";
private static final String KS_FILE 
    = "C:/tstfolder/client_side_keystore.jks";
private static final String TS_FILE 
    = "C:/tstfolder/curl_trusted_ca.jks";

public static void main(String... args) throws Exception {
    testConn();
}

public static void testConn() throws Exception {
    System.setProperty("javax.net.ssl.keyStore", KS_FILE);
    System.setProperty("javax.net.ssl.keyStoreType", "jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "importkey");
    System.setProperty("javax.net.ssl.trustStoreType", "jks");
    System.setProperty("javax.net.ssl.trustStore", TS_FILE);
    System.setProperty("javax.net.ssl.trustStorePassword", "password");
    System.setProperty("javax.net.debug", "all");

    SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
    URL url = new URL(WS_URL);
    HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
    conn.setSSLSocketFactory(sslsocketfactory);

    InputStream inputstream = conn.getInputStream();
    InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
    BufferedReader bufferedreader = new BufferedReader(inputstreamreader);


    String string = null;
    while ((string = bufferedreader.readLine()) != null) {
        System.out.println("Received " + string);
    }
}
}

以下是我用来创建信任库和密钥库的步骤。将 cer_file.pem 分解为单独的 cert.pem 和 key.pem。然后使用以下链接http://www.agentbob.info/agentbob/79-AB.html中的说明,我创建了 client_side_keystore.jks。然后我通过使用http://code.google.com/p/java-keyutil/上的实用程序将 curl 证书文件导入 jks 来创建信任库

不幸的是,当我尝试通过 java 测试类读取 wsdl 时,我得到一个 403。当它通过 curl 调用工作时。我怀疑我在做一些愚蠢的事情,或者误解了某些事情。但我想知道是否有人能指出我正确的方向?

4

1 回答 1

1

听起来您的密钥库没有正确转换。

直接从 OpenSSL 构建 PKCS#12 文件可能更容易:

openssl pkcs12 -export -in file.crt -inkey file.key -out file.p12

然后,PKCS12直接用作密钥库类型(或使用 将其转换为 JKS keytool)。

如果有中间证书,您可能需要检查链是否正确,如此处所述

于 2012-11-16T16:40:35.907 回答