• Webservice:客户端用https


    来自http://www.cnblogs.com/genghechuang/archive/2011/10/26/2225042.html 

    项目需要用https与服务器进行连接,获取系统需要的一些配置参数。以前是用http进行连接的,客户端代码比较简单,直接使用URL类进行连接并获取输入流即可。试着在浏览器中输入相应的https连接地址,提示证书确认,确认以后就访问到内容了。 

       改 成https以后碰到了一些问题。原以为Java可能已经封装好了,所以把直接把原来的http连接改成https,结果抛出异 常:java.lang.UnsupportedClassVersionError: test/url/URLTest (Unsupported major.minor version 49.0)。查了一下,是JVM不支持这个协议(《java网络编程》上有说明)。换了一个jdk,这个问题好了。调用 vurl.getProtocol()可以获取相应的协议了。 

       接着出现 了第二个异常:javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty。没办法,接着google,发现这个问题跟安全连接的证书有关(安全方面的东西不是很了解,只知道这个公钥,用于验证)。查了一 下,jdk果然提供了跟证书相关的东西。首先要从服务器那得到证书,想了一下,ie好像可以。试着用ie连接地址,然后出现了证书确认的提示框,点击查看 证书-详细信息,点击复制到文件,选择base64编码,导出后就可以用记事本打开了,大概样子如下: 

    -----BEGIN CERTIFICATE----- 
    MIIDITCCAoqgAwIBAgIQS6WuWd7dHMeAfIkikfDiQzANBgkqhkiG9w0BAQQFADBM 
    MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg 
    THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wNjA1MTUyMzE4MTFaFw0w 
    j8thQJ7StDhAISTBTx/LE0qPlQLfkT3WQOsRb5sQoW/OkV4w9m0TXhWkLsIYngDD 
    2DJnR/y4HprZmo7M/3wStwO/UiDPIfTzd90SFfCU+pDV41logQ== 
    -----END CERTIFICATE----- 

    不用动这个文件,以后直接导入即可。 

    PS: 如果已经点击了证书的确认,可能浏览器就直接打开链接了。这样情况下,可以接着点击ie有下脚的“锁”形符号,即可看见证书。证书搞到手了,接着要然 Java环境能够认识它。这里调用的是jdk带的一个exe,keytool.exe(%JAVA_HOME%/bin下有,所以配了java环境变量的 话直接能在命令行调用了)。这里我们输入导入命令即可: 

    %JAVA_HOME%\bin\keytool -import -file service.crt -keystore D:/test/urltest/crt 

    三个参数分别代表:导入操作,导入的证书文件,导入证书存放的位置(PS:这个路径可以使用相对路径也可以是绝对路径,但是相对路径我没有实验成功)。导入过程中会提示用户输入密码,这个密码随便就行,不过位数不能太少:) 

       证书是导入成功了,但是问题ms还是没解决,新的异常出现了: 

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

    没 辙,接着google,还好问题不是很麻烦。上面虽然生成了证书,但是还要告诉程序证书的具体位置,涉及一个系统变量要配置。在程序中加入一句话即 可:System.setProperty("javax.net.ssl.trustStore","D:/test/urltest/crt");或 者在运行java时加入参数:-Djavax.net.ssl.trustStore=D:/test/urltest/crt. 

       做了这么多,这个时候是黎明前最黑暗的时候。最后这个问题搞了2小时....... 

       异常:java.net.UnknownHostException: 222.222.222.222。 没啥好说了的,google。找来找去,找到一个blog说了这么一句:在生成证书的时候会提示你“你的姓名”,这里别写你的名字,而要写一个ip或者一 个你对应网站的网址。抛出的异常提示的错误确实是我的https请求中的ip,这样的话可能是此ip和证书中的“名字”不相同造成的。再次使用ie打开证 书,在“常规”里面,看到这么一个东西(我直接用https://mail.google.com试的,因为连它的时候没有出现任何证书确认) 

       颁发给:www.google.com 

    找到url了,打开我的证书,哈哈,确实也有这么一个东西,爽。 

       更 郁闷的来了,url是找到了,可是,此url是个无效的地址.......输入到ie中返回无法连接。这下知道为什么google不用确认而这个证书需要 确认了。因为此url连不通。怎么办?天无绝人之路,还是让我找到了。其实现在我要做的就是一个域名和ip绑定的问题,但是这个绑定不是DNS来做,而是 本机(windows系统)来做。查了一下,果然有,就在C:\WINDOWS\system32\drivers\etc下有一个host文件,打开 它,可以看到这么一行 

    127.0.0.1 localhost 

    ^_^,原来localhost是这样绑定127.0.0.1的啊,如此就好。我试着加入一行 

    222.222.222.222 www.sample.test 

    把原来的https连接的ip换成了那个域名,OK!问题搞定,连接成功。 



    后记: 

    在整个调试过程中我一直使用 https://mail.google.com 做为参照来调试。使用这个url的话至于jvm支持,就能直接连接。出现上面的后几个异常,估计都是与域名有关。因为这个域名是一个DNS不能识别的。 
    这两天朋友使用时又发现这样一个异常:sun.security.validator.ValidatorException: No trusted certificate found   这个异常也是由于没有找到证书造成的,看看证书的路径设置对不对 



    Java客户端调用Https Webservice 
    出处地址:http://hi.baidu.com/sunshibing/blog/item/08f873f0d41e67c37931aa84.html 
    Java 要调用远程Https webservice 必需具用远程服务器提供的客户端信任书及密钥. 
    将client.keystore和client.truststore拷贝到classes\test目录下. 
    package test; 
    import org.apache.axis.client.Call; 
    import org.apache.axis.client.Service; 
       public class TestEcVoteNotice 
       { 
          public static void main(String [] args) throws Exception { 
           System.setProperty("javax.net.ssl.keyStore", "test\\client.keystore"); 
            System.setProperty("javax.net.ssl.keyStorePassword", "abc"); 
            System.setProperty("javax.net.ssl.trustStore", "test\\client.truststore"); 
            System.setProperty("javax.net.ssl.trustStorePassword", "abc"); 
            //System.setProperty("javax.net.debug", "ssl"); 
            //System.setProperty("https.protocols", "TLSv1"); 
            //System.setProperty("java.protocol.handler.pkgs","javax.net.ssl"); 
          String endpoint = "https://localhost:" +"8443"+ "/axis/services/EcVoteNotice"; 
          //String endpoint = "http://localhost:" +"8080"+ "/axis/services/EcVoteNotice"; 
              Service  service = new Service(); 
              Call     call    = (Call) service.createCall(); 
            call.setTargetEndpointAddress( new java.net.URL(endpoint) ); 
            call.setOperationName("toStringP"); 
            String res = (String) call.invoke( new Object[] {"Box"} ); 
            call.setOperationName("toString"); 
            String res2 = (String) call.invoke( new Object[] {} ); 
          
            System.out.println( res+"/"+res2 ); 
          } 
       } 
    在classes目录下执行. 
    java -cp %AXISCLASSPATH% test.TestEcVoteNotice 



    Java客户端如何调用Https Webservice 

    来自:http://qq0819.blog.hexun.com/11419409_d.html 

    最近在做系统改造,服务器增加了SSL访问,那么对于通过https访问Webservice接口,java应该如何实现呢。通过查找相关资料,好不容易找到了解决方法,大体步骤如下。 

    1、获取加密数字证书 

    因为是自己设备颁发的证书,所以先获取数字证书,访问https://+域名,根据提示安装证书,然后导出证书,保存为*.cer文件; 

    2、安装jdk,我使用的是jdk1.4的; 

    3、执行keytool命令,生成keystore文件 

    打开windows命令符窗口,执行如下命令 

    keytool -import -alias aliasname -file *.cer -keystore *.keystore 

    keytool命令可以从网上查找,或者使用keytool -h命令获取说明。 

    4、添加代码 

    在调用接口方法之前,添加如下代码: 

    System.setProperty("javax.net.ssl.trustStore", "*.keystore");        

    System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol"); 

    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 

    如果没有上述3条语句,会报如下异常错误:java.security.cert.CertificateException: Couldn't find trusted certificate 

    好了,一切OK, 通过以上步骤即可实现调用https webservice。
  • 相关阅读:
    周末复习所接触到的知识点
    新增一些需要记住的知识点和坑
    讨厌烦人的编码问题''
    dictionary 字典相关操作
    一些列表的基础知识和操作
    简单字符串语句
    一些简单的str语句
    c#学习之前言
    第六课时之HTML标题
    第五课时之HTML属性
  • 原文地址:https://www.cnblogs.com/y0umer/p/3838985.html
Copyright © 2020-2023  润新知