客户端用https连接服务器web service的一点心得

来源:互联网 发布:mac双色修容粉多少钱 编辑:程序博客网 时间:2024/04/28 22:40

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

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

-----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环境变量的话直接能在命令行调用了)。这里我们输入导入命令即可:

D:/>keytool -import -file d:/act/aa.cer -keystore D:/act/crt

输入keystore密码:  passwd
Owner: CN=adapter18, OU=tech, O=unsap, L=sh, ST=shanghai, C=zh
发照者: EMAILADDRESS=liuzhenwen@unsap.com, CN=adapter18, OU=tech, O=unsap, L=sh
, ST=shanghai, C=zh
序号: d
有效期间: Fri Sep 26 13:44:35 CST 2008 至: Sat Sep 26 13:44:35 CST 2009
认证指纹:
         MD5:  D0:01:B6:83:E7:60:CB:7D:3F:F3:F0:04:5F:69:AA:81
         SHA1: 7C:61:EA:B6:8D:1C:D8:38:35:AC:2F:01:AC:87:73:46:F7:3F:31:98
信任这个认证? [否]:  y
认证已添加至keystore中

D:/>

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

   证书是导入成功了,名字为D:/act/crt

 

在web service 的客户端程序中加入两句话:

         System.setProperty("javax.net.ssl.trustStore","d:/act/crt"); 
         System.setProperty("javax.net.ssl.trustStorePassword","passwd");

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

原创粉丝点击