JAVA怎样调用https类型的webservice

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA怎样调用https类型的webservice相关的知识,希望对你有一定的参考价值。

第一步按照Axis生成本地访问客户端,完成正常的webservice调用的开发,这里的细节我就不再描述,重点说明和http不同的地方-证书的生成和使用。这里假设需要访问的网址是https://www.abc.com ,那么就需要生成网址的安全证书设置到系统属性中,并且需要在调用代码前。
第二步
第二步就是介绍怎样生成证书,先写一个InstallCert.java类放到自己电脑的D盘根目录下,(注意这个类是没有包名的)类中代码如下:
/**
*
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class InstallCert
public static void main(String[] args) throws Exception
String host;
int port;
char[] passphrase;
if ((args.length == 1) || (args.length == 2))
String[] c = args[0].split(":");
host = c[0];
port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
String p = (args.length == 1) ? "changeit" : args[1];
passphrase = p.toCharArray();
else
System.out
.println("Usage: java InstallCert <host>[:port] [passphrase]");
return;


File file = new File("jssecacerts");
if (file.isFile() == false)
char SEP = File.separatorChar;
File dir = new File(System.getProperty("java.home") + SEP + "lib"
+ SEP + "security");
file = new File(dir, "jssecacerts");
if (file.isFile() == false)
file = new File(dir, "cacerts");


System.out.println("Loading KeyStore " + file + "...");
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
in.close();

SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf
.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[] tm , null);
SSLSocketFactory factory = context.getSocketFactory();

System.out
.println("Opening connection to " + host + ":" + port + "...");
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setSoTimeout(10000);
try
System.out.println("Starting SSL handshake...");
socket.startHandshake();
socket.close();
System.out.println();
System.out.println("No errors, certificate is already trusted");
catch (SSLException e)
System.out.println();
e.printStackTrace(System.out);


X509Certificate[] chain = tm.chain;
if (chain == null)
System.out.println("Could not obtain server certificate chain");
return;


BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));

System.out.println();
System.out.println("Server sent " + chain.length + " certificate(s):");
System.out.println();
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
for (int i = 0; i < chain.length; i++)
X509Certificate cert = chain[i];
System.out.println(" " + (i + 1) + " Subject "
+ cert.getSubjectDN());
System.out.println(" Issuer " + cert.getIssuerDN());
sha1.update(cert.getEncoded());
System.out.println(" sha1 " + toHexString(sha1.digest()));
md5.update(cert.getEncoded());
System.out.println(" md5 " + toHexString(md5.digest()));
System.out.println();


System.out
.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
String line = reader.readLine().trim();
int k;
try
k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
catch (NumberFormatException e)
System.out.println("KeyStore not changed");
return;


X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
ks.setCertificateEntry(alias, cert);

OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();

System.out.println();
System.out.println(cert);
System.out.println();
System.out
.println("Added certificate to keystore 'jssecacerts' using alias '"
+ alias + "'");


private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

private static String toHexString(byte[] bytes)
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int b : bytes)
b &= 0xff;
sb.append(HEXDIGITS[b >> 4]);
sb.append(HEXDIGITS[b & 15]);
sb.append(' ');

return sb.toString();


private static class SavingTrustManager implements X509TrustManager

private final X509TrustManager tm;
private X509Certificate[] chain;

SavingTrustManager(X509TrustManager tm)
this.tm = tm;


public X509Certificate[] getAcceptedIssuers()
throw new UnsupportedOperationException();


public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException
throw new UnsupportedOperationException();


public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException
this.chain = chain;
tm.checkServerTrusted(chain, authType);




第三
将上面的InstallCert.java编译成InstallCert.class文件放到自己电脑的D盘根目录下。这是正常的情况下D盘根目录下会有3个文件
第四
打开cmd进入到d盘开始执行生成证书命令,我这里不便于那我的网址测试我用支付宝的网址来测试的
当出现了:Enter certificate to add to trusted keystore or 'q' to quit: [1]
这行代码时,输入1,回车。正常执行完后在D盘根目录下就会出现证书“jssecacerts”文件
得到证书后将证书拷贝到$JAVA_HOME/jre/lib/security目录下,我这里是win7系统,在尝试的过程中需要将证书重命名为:cacerts 放进去才会有用。
去年在ITjob刘老师那边听他说过,你试试看行不行。
参考技术A 1.打开webService链接,右键属性—》证书—》详细信息—》复制到文件,保存cer格式的文件。

2. 复制下面的cmd命令,执行keytool命令,生成keystore文件,例如
c:\nciic.keystore

keytool -import -alias nciic -file c:\jswszx.cer -keystore c:\nciic.keystore

它会提示输入密码,随便输入,例如:123456,回车
4.他会提示是否信任这个认证,输入Y,回车,指定目录下就会生成nciic.keystore文件

它会提示输入密码,随便输入,例如:123456,回车
4.他会提示是否信任这个认证,输入Y,回车,指定目录下就会生成nciic.keystore文件

5.修改Java代码
在调用接口方法之前,添加如下代码:
System.setProperty("javax.NET.ssl.trustStore","c://nciic.keystore"); System.setProperty("java.protocol.handler.pkgs","com.sun.Net.ssl.internal.www.protocol");
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
参考技术B 我这里有一个利用axis2 来实现 WEBService操作XML 接收、解析、传输的一个实例。下面贴出部分代码,你可以先看下,再看下我的采纳率,觉得可以就追问我。
private static EndpointReference targetEPR = new EndpointReference(" ");

public static OMElement getPricePayload(String username)

OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(" ", "tns");

OMElement method = fac.createOMElement("getReportForm", omNs);
OMElement value = fac.createOMElement("username", omNs);

value.addChild(fac.createOMText(value, username));

method.addChild(value);

return method;


public static void main(String[] args)

try
OMElement getPricePayload=getPricePayload("admin");
Options options=new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
ServiceClient sender;
sender = new ServiceClient();
sender.setOptions(options);
Thread.sleep(3000);

OMElement result=sender.sendReceive(getPricePayload);

System.out.println(result);
catch (Exception e)
e.printStackTrace();


GET类型接口调用

参考技术A ···
import requests
import json

upGradeUrl = ' https://api.test.cn/restt'

def requestsMethodForPost(param):
url = upGradeUrl + '?'
print(param)
request = requests.post(url, data=param)
response = request.text
print('API返回:')
respDic = json.loads(response)
print(json.dumps(respDic, ensure_ascii=False))
return respDic
···

以上是关于JAVA怎样调用https类型的webservice的主要内容,如果未能解决你的问题,请参考以下文章

JAVA怎样调用https类型的webservice

JAVA怎样调用https类型的webservice

C#调用Webserver自定义类型方法的接口

怎样用java调用https接口

如何在调用webserver的时候直接返回一个json的数据

用java编写实现从键盘输入一个字符串,判断其是不是为浮点数?