2

我想连接到一个短信网关。我找到了以下代码。

public void smsSender(String username, String password, String to,
        String text) throws IOException {

    try {
        String data = "username=" + username + "&password=" + password
                + "&to=" + to + "&text=" + text;

        URL url = new URL("https://sendsms.abc.com:1010/sms.php");

        HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
        urlc.setRequestMethod("POST");
        urlc.setDoOutput(true);
        urlc.setRequestProperty("Content-type",
                "application/x-www-form-urlencoded");

        BufferedWriter br = new BufferedWriter(new OutputStreamWriter(
                urlc.getOutputStream()));

        br.write(data);
        br.flush();

        BufferedReader rd = new BufferedReader(new InputStreamReader(
                urlc.getInputStream()));
        String line;
        while (null != ((line = rd.readLine()))) {
            output = line;
            System.out.println(output);
        }

        rd.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

当我尝试使用此方法进行连接时,Eclipse 会发送一条错误消息。

无法找到到所请求目标的有效认证路径

我试图访问的服务器正在使用自签名证书。我是这个领域的新手。我怎么解决这个问题。提前致谢 :)

4

1 回答 1

2

要通过 SSL 进行远程方法调用,客户端需要信任服务器的证书。正如您所说,服务器具有自签名证书,您的客户端需要明确配置为信任证书,否则连接失败。要在客户端和服务器的自签名证书之间创建信任关系,请按照以下步骤操作,

  1. 首先,您应该在客户端获取服务器证书。
    为此,我知道的方式是,即在浏览器中点击服务器 url 并获取服务器的证书并将其导入浏览器。可能还有其他获取服务器证书的方法,但您必须探索。

  2. 现在将公钥作为证书从浏览器导出到客户端。让它成为 server.cer。

  3. 现在,创建客户端密钥库

    keytool -genkey -alias clientkeys -keyalg RSA -keystore client.keystore -storepass 123456 -keypass 123456 -dname "CN=localhost, OU=MYOU, O=MYORG, L=MYCITY, S=MYSTATE, C=MY"

  4. 创建客户端证书

    keytool -export -alias clientkeys -keystore client.keystore -storepass 123456 -file client.cer

  5. 现在,将服务器证书导入客户端信任库。

    keytool -import -alias serverCert -keystore client.truststore -storepass clientcert -file server.cer

  6. 现在加载客户端密钥库,如Werner 提供的链接中 erickson 的评论中所述。

如果事情还不清楚,请告诉我。但我建议您阅读一些有关客户端和服务器之间 SSL 握手的 google 文档。

于 2012-10-22T17:07:51.013 回答