我需要在Java中创建一个WCF客户端,它应该与WCF服务器通信,该服务器使用带有wsHttpBinding和证书的消息安全性。 目前我只需要签署消息(因此不需要加密)。 我设法创建一个Java客户端,以便在没有实现消息安全性时与服务器通信,即没有涉及的证书。 我不知道如何告诉客户端使用哪个证书,但我能够为Java设置密钥库和信任库。 以下是我执行的步骤,
创建服务:首先,我在Visual Studio中创建了一个WCF服务器。 这是wsHttpBinding
使用以下行为配置对服务进行签名:
然后将该服务部署到Azure。 当我在Visual Studio中创建Web服务客户端时,一切正常,因此服务本身应该没有任何问题。
创建客户端:
2)我解压缩所有文件3)将jdk版本更改为1.8,如下所述: 如何设置JDK Netbeans运行? 4)通过incubating-netbeans-11.0-bin \\ netbeans \\ bin \\ netbeans64.exe打开Netbeans 5)通过File / New Project ... / Java Web Application /创建一个新的Web项目。 添加GlashFish服务器,选择Java EE 7 Web。 然后完成。 6)右键单击项目并选择New / Other 7)在过滤器中输入“Web Service Client”。 点击下一步。 8)在WSDL URL中输入WSDL。 9)点击完成。
我创建了一个新的java类并添加了以下代码:
package MyCode;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.xml.ws.BindingProvider;
public class NewClass {
public static void main(String in[]) {
System.out.println("Start");
setTrustStoreAndKeyStores();
MyService.Service1 ss = new MyService.Service1();
MyService.IService1 port = ss.getWSHttpBindingIService1();
BindingProvider bport = (BindingProvider)port;
Map requestContext = bport.getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "...");
int a = port.addNumbers(2, 7);
System.out.println("Result: " + a);
}
private static void setTrustStoreAndKeyStores() {
System.setProperty("javax.net.ssl.keyStore", Credentials.keystorePath);
System.setProperty("javax.net.ssl.keyStorePassword", Credentials.keystorePassword);
System.setProperty("javax.net.ssl.trustStore", Credentials.truststorePath);
System.setProperty("javax.net.ssl.trustStorePassword", Credentials.truststorePassword);
File keystore = new File(Credentials.keystorePath);
File truststore = new File(Credentials.truststorePath);
System.out.println("Keystore exists: " + keystore.exists());
System.out.println("Truststore exists: " + truststore.exists());
PrintVariable("javax.net.ssl.trustStore");
PrintVariable("javax.net.ssl.trustStorePassword");
PrintVariable("javax.net.ssl.keyStore");
PrintVariable("javax.net.ssl.keyStorePassword");
}
private static void PrintVariable(String key) {
String value = System.getProperty(key);
if (value == null) {
System.out.println(key + " is not defined");
} else {
System.out.println(key + ": " + value);
}
}
public static class Credentials {
public static String keystorePath = "C:/temp/prxyclient.jks";
public static String keystorePassword = "password";
public static String keystoreFilename = "prxyclient.jks";
public static String keystoreType = "pkcs12";
public static String keystoreAlias = "password";
public static String truststorePath = "C:/Program Files/Java/jdk1.8.0_161/jre/lib/security/cacerts";
public static String truststorePassword = "changeit";
}
}
当我运行代