`
doingwell
  • 浏览: 34477 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何通过HTTPS(SSL加密)方式访问web service

阅读更多

web service在企业应用中常常被用作不同系统之间的接口方式。但是如果没有任何安全机制的话,显然是难以委以重任的。比较直接的web service加密方式就是使用https方式(SSL)方式加密连接,并且只允许持有信任证书的客户端连接,即SSL双向认证。这样就保证了连接来源的可信度以及数据在传输过程中没有被窃取或篡改。而且我认为这样做的开发量最小。具体方法如下
(这是去年写的,在CSDN的博客里面发过,但确实是我原创哦 。现在翻出来再继续完善一下再发。)

    本文适合对SSL加密方式不是很了解的朋友们阅读,如果你是这方面的专家,我描述的步骤就显得太罗嗦了。

0. 准备工作及环境说明

  0.1 检查JDK的环境变量是否正确(略)。我使用的是JDK 1.6
  0.2 准备web服务器,这里选用TOMCAT 6.0
  0.3 准备web service服务端和客户端(略,如果不会写的话可以用eclipse的工具生成)。

 

1. 生成证书

 

  这里用到的文件,我们存放在D:/SSL/文件夹内,其中D:/SSL/server/内的文件是要交给服务器用的,D:/SSL/client/内的文件是要交给客户端用的。

 

  1.1生成服务端证书

 

 

开始-运行-CMD-在dos窗口执行下执行命令:

 

keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:/SSL/server/tomcat.keystore -dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" -validity 3650 -storepass zljzlj -keypass zljzlj

 

说明:

 

keytool 是JDK提供的证书生成工具,所有参数的用法参见keytool –help

 

-genkey 创建新证书

 

-v 详细信息

 

-alias tomcat 以”tomcat”作为该证书的别名。这里可以根据需要修改

 

-keyalg RSA 指定算法

 

-keystore D:/SSL/server/tomcat.keystore 保存路径及文件名

 

-dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" 证书发行者身份,这里的CN要与发布后的访问域名一致。但由于我们是自己发行的证书,如果在浏览器访问,仍然会有警告提示。

 

-validity 3650证书有效期,单位为天

 

-storepass zljzlj 证书的存取密码

 

-keypass zljzlj 证书的私钥

 

 

 

    1.2 生成客户端证书 

 

    执行命令:

 

keytool ‐genkey ‐v ‐alias client ‐keyalg RSA ‐storetype PKCS12 ‐keystore D:/SSL/client/client.p12 ‐dname "CN=client,OU=zlj,O=zlj,L=bj,ST=bj,C=CN" ‐validity 3650 ‐storepass client ‐keypass client

 

说明:

 

    参数说明同上。这里的-dname 证书发行者身份可以和前面不同,到目前为止,这2个证书可以没有任何关系。下面要做的工作才是建立2者之间的信任关系。

 

    1.3 导出客户端证书 

 

    执行命令:

 

 

keytool ‐export ‐alias client ‐keystore D:/SSL/client/client.p12 ‐storetype PKCS12 ‐storepass client ‐rfc ‐file D:/SSL/client/client.cer

 

 

说明:

 

-export 执行导出

 

 

-file 导出文件的文件路径

 

    1.4 把客户端证书加入服务端证书信任列表 

 

    执行命令:

 

keytool ‐import ‐alias client ‐v ‐file D:/SSL/client/client.cer ‐keystore D:/SSL/server/tomcat.keystore ‐storepass zljzl

 

说明:

 

参数说明同前。这里提供的密码是服务端证书的存取密码。

 

    1.5 导出服务端证书 

 

    执行命令:

 

 

keytool -export -alias tomcat -keystore D:/SSL/server/tomcat.keystore -storepass zljzlj -rfc -file D:/SSL/server/tomcat.cer
 

 

说明:

 

把服务端证书导出。这里提供的密码也是服务端证书的密码。

 

    1.6 生成客户端信任列表 

 

    执行命令:

 

 

keytool -import -file D:/SSL/server/tomcat.cer -storepass zljzlj -keystore D:/SSL/client/client.truststore -alias tomcat –noprompt

 

 

说明:

 

让客户端信任服务端证书

 

2. 配置服务端为只允许HTTPS连接

 

 

    2.1 配置Tomcat 目录下的/conf/server.xml 

 

 

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
   maxThreads="150" scheme="https" secure="true" clientAuth="true"  
   sslProtocol="TLS" keystoreFile="D:/SSL/server/tomcat.keystore"  
   keystorePass="zljzlj" truststoreFile="D:/SSL/server/tomcat.keystore"  
   truststorePass="zljzlj" /> 

 

 

说明:

在server.xml里面这段内容本来是被注释掉的,如果想使用https的默认端口443,请修改这里的port参数。其中的clientAuth="true" 指定了双向证书认证。

 

 

    2.2 配置服务端项目web.xml 

 

    在<welcome-file-list>之后增加:

 

 

<security-constraint>  
   <web-resource-collection>  
     <web-resource-name>services</web-resource-name>  
     <url-pattern>/services/*</url-pattern>  
   </web-resource-collection>  
   <user-data-constraint>  
     <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
   </user-data-constraint>  
</security-constraint>  

 

 

说明:

这里限制了WEB service服务地址的访问必须为https连接。<url-pattern>要根据你的web service服务地址配置。

 

 

3. 修改客户端代码 

 

在执行访问之前,增加:

 

System.setProperty("javax.net.ssl.trustStore", "D:/SSL/client/client.truststore");  
System.setProperty("javax.net.ssl.trustStorePassword","zljzlj");  
System.setProperty("javax.net.ssl.keyStoreType","PKCS12") ;  
System.setProperty("javax.net.ssl.keyStore","D:/SSL/client/client.p12") ;  
System.setProperty("javax.net.ssl.keyStorePassword","client") ;  
  
String endPoint="https://127.0.0.1:8443/easbCut/services/ApplyFormService";  
...  

 通过设置参数来指定客户端连接时所使用的客户端证书,这里还可以采用修改JVM启动参数的的方式来执行,但出于不影响其他功能的考虑,这里采用System.setProperty的方式来设置这些参数,在使用结束后,可以还原这些参数配置。

 

做为客户端的开发者,可以把拿到的证书文件后,只执行步骤3。

 

That's all. 如有问题的话欢迎留言。

 

 

2
0
分享到:
评论
3 楼 caok 2013-01-24  
你好,配置成功后,客户端访问会报这个错误,是什么原因呢
信息: The cipher suites have been set to SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, TLS_KRB5_WITH_RC4_128_SHA, TLS_KRB5_WITH_RC4_128_MD5, TLS_KRB5_WITH_3DES_EDE_CBC_SHA, TLS_KRB5_WITH_3DES_EDE_CBC_MD5, TLS_KRB5_WITH_DES_CBC_SHA, TLS_KRB5_WITH_DES_CBC_MD5, TLS_KRB5_EXPORT_WITH_RC4_40_SHA, TLS_KRB5_EXPORT_WITH_RC4_40_MD5, TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA, TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5. 
2013-1-24 17:12:25 org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
警告: Interceptor for {http://export.com/}IqueryService#{http://export.com/}GetKsdm2 has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:484)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:310)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:262)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
at $Proxy47.GetKsdm(Unknown Source)
at com.test.TestServiceClient.main(TestServiceClient.java:31)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.Socket.connect(Socket.java:507)
at sun.net.NetworkClient.doConnect(NetworkClient.java:152)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:278)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:335)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:176)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:744)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:162)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:836)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1954)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1906)
at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:42)
at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1972)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:640)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
... 8 more
Exception in thread "main" javax.xml.ws.WebServiceException: Could not send Message.
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
at $Proxy47.GetKsdm(Unknown Source)
at com.test.TestServiceClient.main(TestServiceClient.java:31)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.Socket.connect(Socket.java:507)
at sun.net.NetworkClient.doConnect(NetworkClient.java:152)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:278)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:335)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:176)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:744)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:162)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:836)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1954)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1906)
at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:42)
at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1972)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:640)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:484)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:310)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:262)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
... 2 more
2 楼 doingwell 2011-09-04  
edi-one 写道
<security-constraint>   
   <web-resource-collection>   
     <web-resource-name>services</web-resource-name>   
     <url-pattern>/services/*</url-pattern>   
   </web-resource-collection>   
   <user-data-constraint>   
     <transport-guarantee>CONFIDENTIAL</transport-guarantee>   
   </user-data-constraint>   
</security-constraint>  

这段配置并不能限制该WS服务只能以https访问
我尝试了一下  http:8080仍然能够访问


这段配置是根据url-pattern跳转的,如果你的webservice的访问地址不是在/services/下的话,就不能限制,可以检查一下你的webservice的访问路径,再做相应配置。
1 楼 edi-one 2011-08-30  
<security-constraint>   
   <web-resource-collection>   
     <web-resource-name>services</web-resource-name>   
     <url-pattern>/services/*</url-pattern>   
   </web-resource-collection>   
   <user-data-constraint>   
     <transport-guarantee>CONFIDENTIAL</transport-guarantee>   
   </user-data-constraint>   
</security-constraint>  

这段配置并不能限制该WS服务只能以https访问
我尝试了一下  http:8080仍然能够访问

相关推荐

    c#如何调用SSl(https)加密的java写的Web Services例子

    net去调用java端写的https webservices 1)浏览器导入服务器cer证书 2)c#客户端引入证书

    web service第一次启动慢

    - 预热web service:可以通过脚本或其他方式在web service部署后立即进行一些操作,以预热服务,使得JIT编译等过程提前完成。 - 优化DNS解析:如果确认是DNS解析导致的延迟,可以使用DNS缓存服务或设置静态DNS条目...

    如何启用IIS的SSL加密

    完成以上步骤后,你的IIS服务器将启用SSL加密,提供安全的HTTP连接。请注意,虽然自签名证书可以用于测试环境,但在生产环境中,建议使用权威的公共CA签发的证书,以获得浏览器广泛认可和信任。同时,定期更新和审核...

    web service reference

    **Web Service**是一种支持软件间通信的网络服务形式,它提供了一种标准化的方式使得一个应用程序可以通过HTTP等网络协议调用另一个应用程序的功能,就像本地调用一样。简单地说,Web Service就是一个应用向其他应用...

    XML Web Service开发

    XML Web Service的安全性是关键问题,常见的安全措施包括SSL/TLS加密、WS-Security(Web Services Security)提供消息级安全,以及身份验证和授权机制。 七、Web Service的集成 Web Service常被用于系统集成,例如...

    用vfp编写Web Service

    7. **安全考虑**:Web Service的安全性是至关重要的,VFP可以通过设置访问控制、SSL加密等方式提升Web Service的安全水平。 8. **集成与调用**:了解了如何在VFP中创建Web Service后,还需要知道如何在其他语言或...

    配置SSL服务加密传输

    在本场景中,我们需要为一个已经建立的Web Service工程配置SSL(Secure Socket Layer)服务,以实现从HTTP到HTTPS的自动跳转,并完成服务器和客户端之间的安全通信。 首先,我们需要在`web.xml`文件中配置HTTP到...

    nginx配置ssl实现https访问的步骤(适合新手)

    首先,我们需要理解HTTPS的重要性,它通过SSL协议在HTTP基础上增加了数据加密和服务器身份验证,确保了数据传输的安全性。 在开始配置之前,你需要先申请SSL证书。这里以腾讯云的免费证书为例,该证书适用于单个...

    通向架构师的道路(第十三天)Axis2 Web Service安全初步.docx

    通向架构师的道路(第十三天)Axis2 Web Service安全初步 Axis2 Web Service安全是Web服务成功的必要保证。...通过 Axis2 Web Service安全机制,可以确保Web服务的安全性和可靠性,满足企业级应用的安全要求。

    调用https协议的webservice,以及证书手动加载

    首先,HTTPS(Hypertext Transfer Protocol Secure)是一种基于HTTP的安全协议,它通过SSL/TLS(Secure Sockets Layer/Transport Layer Security)提供加密处理、服务器身份验证和消息完整性检查,确保数据在网络间...

    Web Service XFire框架开发指南

    - **安全性**:XFire提供了基本的安全特性,如SOAP消息认证和SSL加密,确保Web Service的安全通信。 - **拦截器和插件**:XFire的插件架构允许开发者添加自定义功能,如日志记录、性能监控等。 ### 3. XFire的安装...

    Web Service的安全机制

    Web Service作为一种分布式计算模型,通过松散耦合的方式将不同的计算服务整合在一起,成为现代电子商务、企业应用系统集成等分布式计算环境中不可或缺的一部分。随着Web Service应用范围的不断扩大,安全问题日益...

    web.config加密工具

    通过运行特定的命令,可以对`web.config`文件中的部分或全部内容进行加密。例如,可以使用以下命令对`web.config`的`connectionStrings`节点进行加密: ``` aspnet_regiis.exe -pef "connectionStrings" 应用程序...

    oracle adf web service 案例

    - **安全性**:ADF支持多种安全模型,如基本认证、SSL加密等,以确保Web服务的安全调用。 - **事务管理**:当Web服务操作需要在事务边界内执行时,ADF支持JTA(Java Transaction API),可以进行分布式事务处理。 ...

    java 调用https webservice实例及axis包

    首先,理解HTTPS(超文本传输安全协议)是HTTP的安全版本,它通过SSL/TLS协议对数据进行加密,以确保数据在传输过程中的隐私和完整性。在Java中,通过`javax.net.ssl`包提供的类可以支持HTTPS连接。 Apache Axis是...

    WebService加密 for SoapHeader

    WebService加密在IT行业中是一个重要的议题,特别是在Web服务的交互中,数据的安全传输是不可或缺的一环。SoapHeader作为SOAP消息的一部分,常被用于传递额外的控制信息,如认证、授权等,因此,对它进行加密是确保...

Global site tag (gtag.js) - Google Analytics