วันนี้จะมาเล่าเรื่องงานอีกแล้ว เนื้องจากเรียก webservice ผ่าน https แล้วได้ Error ดังนี้
javax.xml.ws.WebServiceException: The following WSDL exception occurred: WSDLException: faultCode=WSDL4JWrapper : : WSDLException: faultCode=WSDL4JWrapper : : sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
org.apache.axis2.jaxws.ExceptionFactory.createWebServiceException(ExceptionFactory.java:173)
org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:70)
org.apache.axis2.jaxws.description.impl.ServiceDescriptionImpl.setupWsdlDefinition(ServiceDescriptionImpl.java:1054)
org.apache.axis2.jaxws.description.impl.ServiceDescriptionImpl.(ServiceDescriptionImpl.java:226)
org.apache.axis2.jaxws.description.impl.ServiceDescriptionImpl.(ServiceDescriptionImpl.java:156)
org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl.createServiceDescription(DescriptionFactoryImpl.java:133)
org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl.createServiceDescription(DescriptionFactoryImpl.java:79)
org.apache.axis2.jaxws.description.DescriptionFactory.createServiceDescription(DescriptionFactory.java:76)
org.apache.axis2.jaxws.spi.ServiceDelegate.(ServiceDelegate.java:212)
org.apache.axis2.jaxws.spi.Provider.createServiceDelegate(Provider.java:59)
javax.xml.ws.Service.(Unknown Source)
org.apache.jsp.index_jsp._jspService(index_jsp.java:87)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
สาเหตุ : เนื่องจาก เรียก webservice ผ่าน https (ssl) แล้ว handshake ไม่ผ่านเนื่องจากไม่ได้ trust นั่นเอง
แก้ปัญหา :
1. ไป export cert ออกมาโดยผม ใช้ firefox เข้า url ของ webservice ที่เป็น wsdl แล้วก็ export ออกมา save เป็น file ชื่อ myservice.cert
2. นำ myservice.cert ไป import ที่ keystore ซึ่ง keystore มีสองที่คือ
2.1 C:\Documents and Settings\username\.keystore ใน windows xp
2.2 $JAVA_HOME\jre\lib\security\cacerts
ซึ่งผมก็งงว่าต้องไป import ลงที่ตัวไหน จากการมั่วก็สรุปได้ว่าไป import ลงที่ ข้อ 2.2
3. ใช้คำสั่ง
keytool -import -trustcacerts -alias "myservice" -file /path/to/certfile/myservice.cert -keystore cacerts
เสร็จแระ
4. ลองแสดงดูใช้คำสั่ง
keytool -list -v -alias myservice -keystore cacerts
จะมี output ประมาณนี้
Alias name: myservice Creation date: Apr 11, 2011 Entry type: trustedCertEntry Owner: CN=setopap6, OU=Sun Java System Application Server, O=Sun Microsystems, L =Santa Clara, ST=California, C=US Issuer: CN=setopap6, OU=Sun Java System Application Server, O=Sun Microsystems, L=Santa Clara, ST=California, C=US .............
reference:
http://shib.kuleuven.be/docs/ssl_commands.shtml#keytool
