我正在寻找解析每天更新所述文件的XML文件 - 我遇到的唯一问题是他们使用自己的证书(https://..。)我无法使用该特定URL ,也没有http:// ...链接可用。
URL url = new URL("https://...");
...
Document document = db.parse(url.openStream());
此代码在运行测试时抛出以下异常:
javax.net.ssl.SSLException:java.lang.RuntimeException:意外错误:java.security.InvalidAlgorithmParameterException:trustAnchors参数必须为非空
我已经看到了各种建议,涉及创建各种类来处理这种连接或个人服务器,以及将证书添加到密钥库,然后将该密钥库添加到Java项目,但我我一直无法做到这一点,我正在寻找一种稍微简单的方式让我在网上访问XML。
答案 0 :(得分:10)
您需要一个信任库来存储SSL证书。您可以使用首选的Web浏览器下载证书。要将证书加载到信任库,您需要JDK附带的“keytool”程序。
例如,如果您的证书文件名为“certificate.crt”,并且您要创建名为“secure.ts”的信任库,则可以按如下方式调用keytool:
keytool -importcert -keystore secure.ts -storepass S3cuR3pas$! -file certificate.crt
现在,您必须告诉您的程序密钥库所在的位置以及打开它的密码,在>之前定义系统属性“javax.net.ssl.trustStore”和“javax.net.ssl.trustStorePassword” strong>打开连接
URL url = new URL("https://...");
System.setProperty("javax.net.ssl.trustStore", "secure.ts");
System.setProperty("javax.net.ssl.trustStorePassword", "S3cuR3pas$!");
...
Document document = db.parse(url.openStream());
答案 1 :(得分:3)
这个好奇的消息意味着找不到信任库。
没有任何关于XML BTW的事情。
答案 2 :(得分:1)
你可以试试这个:
String javaHomePath = System.getProperty("java.home");
String keystore = javaHomePath + "/lib/security/cacerts";
String storepass= "changeit";
String storetype= "JKS";
String[][] props = {
{ "javax.net.ssl.trustStore", keystore, },
{ "javax.net.ssl.keyStore", keystore, },
{ "javax.net.ssl.keyStorePassword", storepass, },
{ "javax.net.ssl.keyStoreType", storetype, },
};
for (int i = 0; i < props.length; i++) {
System.getProperties().setProperty(props[i][0], props[i][1]);
}
// Now you can proceed to connect to call the webservice.
// SSL will be used automatically if the service endpoint url
// starts with <a href="https://." target="_blank" rel="nofollow">https://.</a>
// The server will send its certificate signed by verisign and
// client will trust and authenticate the server as it recognizes
// verisign as one trusted root.
答案 3 :(得分:-3)
在开发Java 6应用程序时,我遇到了与我的MAC OSX(Yosemite)相同的异常。您需要下载并安装适用于OSX 2014的Apple Java: