ใช้ Keytool import cert

วันนี้จะมาเล่าเรื่องงานอีกแล้ว เนื้องจากเรียก 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

About WK

Kajook is a Senior Software Engineer. Job is Design & Develop in Java EE environment on Glassfish. I'm Interested in Agile software development ,iOS and Android.
This entry was posted in knowledge and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s