0

我在我的 PC 上运行了一个 Java 主应用程序,它可以将 XML 数据发送到一个 serverlet 并接收回 XML 数据。 http://iamt.wisconsin.gov/IAM-WiEntUser/WiEntUserService?xml=

我可以使用IE 和 Firefox 中的https://iamt.wisconsin.gov/IAM-WiEntUser/WiEntUserService?xml=因为他们允许我加载私有证书。

我想使用 Java 主应用程序中的 https,因为某些数据很敏感。我得到一个带有 MSG=unkown 证书的 IOException。好的,这是有道理的,Java 不知道私有证书。

我希望它会像告诉 Java 信任 FireFox 证书一样简单。System.setProperty("javax.net.ssl.trustStore", "C:/Documents and Settings/kendajm/Application Data/Mozilla/Firefox/Profiles/6f8ggdi7.default/cert8.db"); 但这给出了一个带有 MSG=Invalid keystore 格式的 IOException。

SSL通信,到底有多难?我花了八个小时试图找出如何做到这一点。似乎这很容易,以至于没有记录或非常困难,而且没有人有一个很好的例子。

帮助。

4

4 回答 4

4

默认情况下,Mozilla cert8.db 密钥存储格式不可读(尽管可以“插入”一个可以解析它的提供程序。)将证书导入默认支持的密钥存储是最简单的。

首先,您需要一份证书副本。

在 Firefox 中,访问相关页面。单击窗口右下角状态栏上的“锁定”图标。在出现的对话框中,单击“查看证书”按钮。将出现一个新对话框;选择其“详细信息”选项卡。单击窗口底部的“导出”按钮,将证书保存到文件中(使用 DER 或 PEM 格式)。

现在,您需要将证书转换为 Java 使用的密钥存储格式。

使用 JDK 的keytool实用程序:

keytool -import -keystore mykeystore.jks -alias iamt -file iamt.wisconsin.gov

当提示输入密码时,请选择一个新密码,以便稍后验证密钥库中的证书没有被篡改。接下来keytool会提示你是否信任新证书——输入yes!您应该有一个名为“mykeystore.jks”(或您选择的任何内容)的新 Java 密钥存储文件。

现在,运行您的程序,将您的新密钥存储文件指定为“javax.net.ssl.trustStore”属性的值。


顺便说一句,我注意到您正在XMLEncoder从服务返回 Java Beans 输出。这种“Long Term Persistence”格式是 JDK 中一个被忽视的瑰宝,但解析不受信任的内容并不安全。使用这种语法,可以在 JVM 中调用任何方法进行解析。这有点像带有不受信任的 JSON 的“eval”。因此,如果我正在实现一个客户端服务,我可能不愿意在没有大量额外工作的情况下解析来自服务的结果以将解析“沙盒”为不受信任的代码。而且我假设服务解析请求中的相同格式,这对服务器同样危险。


当您询问有关错误消息的问题时,最好发布整个消息,包括堆栈跟踪(除非它实际上是一个java.lang.StackOverflowError!)。它对您来说可能毫无意义,但它通常具有立即发现问题所需的信息。

于 2009-03-04T15:42:05.620 回答
1

据我了解,问题在于 Java 不会接受自签名证书。如果我错了,请纠正我!

您是否尝试过使用Commons-HttpClient?这有更多选项,并且在此页面上有接受自签名证书的指南。另请参阅此示例代码

编辑:这里有关于如何将证书导入 Java 的指南-显然,您需要在运行 Java 应用程序的每台机器上执行此操作。HttpClient 选项可能更灵活,具体取决于您的需要。

于 2009-03-04T14:53:52.913 回答
1

一旦我使用 keytool 在 Java 中正确注册了自签名证书,我就能够使用它。

请参阅本指南:http: //java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html

本质上,您: 1. 创建自签名证书 2. 将其导出到文件 3. 将其导入默认密钥库

但是,您尝试与之集成的政府网站可能会拒绝此类自签名证书。

于 2009-03-04T14:58:50.560 回答
0
  1. 从 IE 将证书导出为 Base-64 编码的 X.509 (.CER)
  2. 在导出的证书上运行 keytool。提供 trustStore 文件和密码。对信任问题回答“是”。keytool -import -v -trustcacerts -alias IamtCert -file C:\Work\IAM\Acceptance\IamAcceptanceCertificate.cer -keystore N:\WEB\DEG\Ca​​Cert.dat
  3. 添加两行代码。System.setProperty("javax.net.ssl.trustStore","N:\WEB\DEG\Ca​​Cert.dat"); System.setProperty("javax.net.ssl.trustStorePassword","xxxxxx");

一旦你知道该怎么做就不难了。其余代码保持不变。(Servlet 有另一种验证调用者的方法,不涉及证书。)

    urlAddress += encodedXmlData;
    URL  url = null;
    HttpURLConnection connection = null;
    StringBuffer result = new StringBuffer();
    try {
        url = new URL( urlAddress );
        connection = (HttpURLConnection)url.openConnection();
    }
    catch( IOException ioe ) {
        System.out.println(classMethod+": IOException: URL Msg="+ioe.getMessage() );
        return(null);
    }           
    connection.setDoInput(true);    // Default value.
    connection.setDoOutput(true);   // Not the default value.
    connection.setUseCaches(false); // Not the default value.
    try {
        connection.setRequestMethod("POST");  // Large pay load.
    }
    catch( ProtocolException pe ){
        System.out.println(classMethod+": ProtocolException: URL Msg="+pe.getMessage() );
        return(null);
    }
    // If true, this URL is being examined in a context in which it makes
    // sense to allow user interactions such as popping up an 
    // authentication dialog.
    connection.setAllowUserInteraction(false);
    try {
        connection.connect();
        BufferedReader bufferedReader = new BufferedReader( new
                InputStreamReader( connection.getInputStream() ) );

        // Retrieve the response
        String inputLine = null;
        while ( (inputLine = bufferedReader.readLine() ) != null ) {
            if ( inputLine.indexOf("</void>") > -1 ) inputLine+='\n';
            result.append(inputLine);
        }
        bufferedReader.close();
        connection.disconnect();
    }
    catch( IOException ioe) {
        System.out.println(classMethod+": IOException: Read Msg="+ioe.getMessage() );
        return(null);
    }
于 2009-03-04T17:35:55.440 回答