这个问题类似于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。我必须创建.cacert.pem文件以使curl调用正常工作,以避免此消息(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 certs文件导入jks来创建信任库不幸的是,当我尝试通过java测试类读取wsdl时,我得到了403. Where-因为它通过curl调用工作。我怀疑我做的事情很傻,或者误解了一些事情。但我想知道是否有人可以指出我正确的方向?
答案 0 :(得分:1)
听起来你的密钥库没有正确转换。
直接从OpenSSL构建PKCS#12文件可能更容易:
openssl pkcs12 -export -in file.crt -inkey file.key -out file.p12
然后,直接使用PKCS12
作为密钥库类型(或使用keytool
将其转换为JKS)。
如果有here所述的中间证书,您可能需要检查链是否正确。