如何在HttpsURLConnection中正确导入认证?

时间:2013-12-03 07:05:54

标签: java ssl https openssl ssl-certificate

我使用HttpsURLConnection向服务器发送请求。 第一次,我使用一种简单的方法在Java https连接中传递证书验证,它可以工作。 (根据网站: http://www.nakov.com/blog/2009/07/16/disable-certificate-validation-in-java-ssl-connections/

但是现在,我得到了一个.pem文件,我需要将它导入我的JVM。 我试图通过.pemkeytool -import -file E:\server.pem -alias SERVER -keystore "C:\Program Files\Java\jre7\lib\security\cacerts"文件导入我的JVM,但我收到错误java.lang.Exception: not X.509

因此,我使用openssl将.pem转移到.der。然后我通过.derkeytool -import -file E:\server.der -alias SERVER -keystore "C:\Program Files\Java\jre7\lib\security\cacerts"导入了我的JVM。

但是当我在没有通过证书验证的情况下执行代码时,它出现了关于"javax.net.ssl.SSLHandshakeException: ...: PKIX path building failed: java.security.cert.CertPathBuilderException:"

的错误

我该如何解决?我自己将.pem转移到.der会导致错误吗?服务器是否也必须使用.der

谢谢!

通过证书验证

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
SSLContext.setDefault(ctx);

// HttpsURLConnection
URL url = new URL(newUrl);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");

connection.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String arg0, SSLSession arg1) {
        return true;
    }
});

connection.connect();
BufferedReader reader = null;
String json;

// read the output from the server
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
json = reader.readLine();
connection.disconnect();

导入证书

我可以在导入认证后删除一些代码,例如SSLContext...吗?

// HttpsURLConnection
URL url = new URL(newUrl);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");

connection.connect();
BufferedReader reader = null;
String json;

// read the output from the server
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
json = reader.readLine();
connection.disconnect();

server.pem的一部分

-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhk
....
....
4QOYP5BR7kze/gY=
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICSjCCAbOgAwIBAgIJAL9cT+
....
....
bfnoA/x+53HmG0w6fu
x8HXcTCrgsgnYwoMl9A=
-----END CERTIFICATE-----

1 个答案:

答案 0 :(得分:0)

如果您的服务器具有自签名证书,并且您想忽略检查证书验证,则可以this code (ignoring-self-signed-certificates-in-java) :)。对我来说很完美。