Webservice 通过SSL加密传输

WebService详细解析(axis,xfire,cxf,授权认证加密解密) WebService详细解析(axis,xfire,cxf,授权认证加密解密) 很详细,有很多例子,学习必备。 立即下载

 

自签名证书的WEB服务安全应用
2008-07-01 11:20

    Java编程语言的一个杰出之处就在于开源社区可以以较低的成本或者甚至是免费地提供优秀的应用程序。其中一个例子就是Apache Tomcat,它为使用servlet或JSP技术的开发提供了一个健壮的Web服务器。现在Web服务技术正日趋成熟,所以有些应用程序就有可能利用Swing特性丰富的前端瘦客户端结合Web或ejb层已经开发出来的数据验证和业务逻辑。此类应用程序只有在受到保护的情况下才能正常运行,不过,安全性不一定意味着昂贵的成本。本文的目的就是要演示Web服务客户端如何通过安全的HTTPS协议使用自签名的安全证书。

使用自签名证书的问题

  HTTPS通常可以无缝地与不安全的HTTP协议一起使用,而不中断用户的体验。这是由于SSL被设计为由可信的第三方进行验证和签名。Verisign是一家流行的认证机构。如果您的Web应用程序要求安全的通信,那么您就可以付钱给Verisign来签名您的SSL证书。经过Verisign签名之后,您的Web站点上的用户就可以不中断地在HTTP与HTTPS之间进行切换,因为所有主流Web浏览器都信任由Verisign签名的证书。但是Verisign并不是获得签名证书的惟一选择。为了节省运作成本,或者为了个人使用方便,您也可以自签名自己的证书。但是,自签名证书会中断Web站点用户的体验。通常Web浏览器会显示一个对话框,询问您是否希望信任一个自签名证书。

  Web浏览器的这一特性很好,因为当其获得一个由未知认证机构签名的证书时,还有机会进行处理。在开发用于通过HTTPS进行通信的Web服务客户端时,这就没那么容易了。在运行Java代码时,不会出现询问是否信任一个不可信的认证机构的对话框。JRE会抛出一个异常,说明试图通过HTTPS连接到一个具有不可信证书的Web站点:

  Caused by:sun.security.validator.ValidatorException:No trusted certificate found

  无法捕获此异常并继续。要让Web服务使用自签名证书,JRE必须以某种方式将您当作认证机构信任。

解决方案概述

  为演示此问题的解决方案,我将执行以下步骤:

  • 生成并自签名我自己的证书;
  • 为Tomcat配置SSL,使其使用该证书;
  • 创建一个示例Web服务,以便通过HTTPS调用;
  • 从WSDL生成Web服务客户端代码;
  • 使用定制的密钥库解决方案演示客户端;

生成自签名证书

  JDK附带了一个工具,keytool.exe,用于管理SSL公钥/私钥。密钥在文件系统的一个二进制文件中进行添加和删除。默认的密钥库文件是JAVA_HOME/jre/lib/security/cacerts。该文件包含了JRE所信任的认证机构的列表。一个知名可信公司(比如Verisign)的列表已经存在于密钥库中了。要查看该列表,可使用口令changeit执行以下代码:

  D:/>keytool -list -rfc -keystore JAVA_HOME/jre/lib/security/cacerts

  Keytool应用程序可用于编辑此文件。但是,为了防止出错,最好还是创建一个新文件。如果不告知keytool使用哪个文件,它就会默认地创建HOME/.keystore。

  要生成自己的自签名证书,可执行:

  D:/>keytool.exe -genkey -alias Tomcat -keyalg RSA -storepass bigsecret -keypass bigsecret -dname "cn=localhost"

  执行完该命令后,就会在HOME目录下生成一个.keystore文件。下面是各种切换命令的含义:

  • genkey:告诉keytool应用程序生成新的公钥/私钥对。
  • alias:用于引用密钥的名称。记住,.keystore文件可包含多个密钥。
  • Keyalg:使用RSA算法生成公钥/私钥对。
  • Storepass:访问.keystore文件所需的口令。
  • Keypass:管理密钥所需的口令。
  • dname:该值非常重要。.我使用了localhost,因为该示例被设计为本地运行。如果一个Web应用程序被注册为http://www.myserver.com,那么该值就必须是www.myserver.com。如果名称不匹配,证书就会自动被拒绝。

  一旦keytool应用程序创建了一个新的公钥/私钥对,它就自动自签名该密钥。我们刚刚生成了自己的自签名证书,它可用于HTTPS通信。只需提取出自签名公钥。后面我将展示如何做。

为Tomcat配置SSL

  现在必须配置Tomcat,使其使用自签名证书。我使用的是Tomcat 5.0.30。编辑TOMCAT/conf/server.xml文件。在文件中搜索“8443”,并取消绑定到该端口的<Connector.../>注释。然后必须向<Connector.../>添加下属属性:

  keystorePass="bigsecret"

  当JRE启动时,它将自动找到HOME/.keystore文件,并且Tomcat会试着使用口令“bigsecret”访问它。在Tomcat启动时,控制台应该有如下输出:

  Feb 4, 2006 3:11:23 PM org.apache.coyote.http11.Http11Protocol start

  INFO:Starting Coyote HTTP/1.1 on http-8443

  这意味着<Connector.../>成功地读取了.keystore文件,现在可以通过8443端口进行安全的HTTPS连接了。打开Web浏览器,并在地址栏输入https://localhost:8443/。因为该证书是自签名的,所以Web浏览器将显示一个对话框,询问是否信任该连接。如果接受,则所有的通信都将通过HTTPS进行,从而成为安全的。

创建Web服务

  我将使用Apache Axis项目创建一个非常简单的Web服务。该Web服务将模拟检查新的电子邮件消息。Web服务客户端传递一个惟一地识别一个用户的令牌。Web服务返回一个新电子邮件消息的列表(参见清单1)。

清单1

 

import java.util.*;

public class Email {
 
 public List 
 getNewMessages(String id)
 {
   List l = new ArrayList(3);
   l.add("1");
   l.add("2");
   l.add("3");
   return l;
 }
}

  要获取已部署的Web服务,执行以下步骤:

  • 从清单1剪切并粘贴代码到Webapp的根目录下的Email.jws文件。
  • 编辑Web.xml文件,添加Axis servlet以及一个*.jws映射(清单2)。
  • 将Axis jar文件放入WEB-INF/lib。请参见文章末尾的“参考资料”部分,获取Axis项目URL。

清单2

 

<servlet>
  <servlet-name>
    AxisServlet
  </servlet-name>
  <display-name>
    Apache-Axis Servlet
  </display-name>
  <servlet-class>
    org.apache.axis.transport.http.AxisServlet
  </servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>
    AxisServlet
  </servlet-name>
  <url-pattern>
    *.jws
  </url-pattern>
</servlet-mapping>

  在部署了本文所附带的WAR文件(并为Tomcat配置SSL)之后,Web就可以安全地通过HTTPS使用下面的URL来访问了:

  https://localhost:8443/JDJArticleWebService/Email.jws

使用WSDL2Java

  Axis项目提供了一个名为WSDL2Java的工具,它获取一个Web服务WSDL并自动创建使用该Web服务所需的Java源代码。参见清单3中用于生成Email.jws Web服务代码的命令行。

清单3

java 
 -classpath 
  .;axis.jar;log4j-1.2.8.jar
  ;commons-logging-1.0.4.jar
  ;commons-discovery-0.2.jar
  ;jaxrpc.jar;saaj.jar
  ;wsdl4j-1.5.1.jar 
 org.apache.axis.wsdl.WSDL2Java 
  -p jdj.wsclient.shared
  http://localhost:8080/JDJArticle/Email.jws?wsdl

  注意清单3中用于访问WSDL的URL。它在8080端口使用了不安全的HTTP协议。为什么不在8443端口使用HTTPS呢?这是因为自签名证书,WSDL2Java工具将遇到与本文所试图解决的证书问题完全相同的问题。所以现在必须使用使用不安全的协议。这意味着生成的代码必须有一点改变,使用“https”和“8443”替换“http”和“8080”引用。本文所附带的客户端zip文件包含了更改后的代码。

具有定制密钥库的客户端

  JRE的默认密钥库是JAVA_HOME/jre/lib/security/cacerts。只要出现自签名证书,Java应用程序就会抛出异常,因为该证书不在密钥库中。因此,在开发客户端时有两种选择。第一种选择是将自签名证书放入该JRE的默认密钥库中。虽然这种方法有效,但是它并不是一个好的解决方案,因为需要在每个客户端机器上进行定制化。第二种选择是生成一个定制的密钥库,将自签名证书放入其中,并将定制密钥库作为应用程序的一部分分发(通常在一个jar文件中)。

  要为客户端创建定制密钥库,需要执行以下步骤:

  • 从HOME/.keystore导出自签名公钥。
  • 将自签名公钥导入到为客户端创建的新密钥库中。

  要从HOME/.keystore导出自签名公钥,可执行以下代码:

  D:/>keytool.exe -genkey -alias Tomcat -keyalg RSA -storepass bigsecret -keypass bigsecret -dname "cn=localhost"

  现在通过导入Tomcat.cer,为客户端创建定制密钥库:

  D:>keytool.exe -import -noprompt -trustcacerts -alias Tomcat -file Tomcat.cer -keystore CustomKeystore -storepass littlesecret

  使用“-keystore CustomKeystore”,将会在当前工作目录中创建一个名为CustomKeystore的新密钥库文件。可以在本文的客户端zip文件的/classpath/resources/keystore目录下找到CustomKeystore文件。使用刚刚生成的文件替换该文件。

  现在只剩下创建一个使用该定制密钥库的客户端了。.我将演示两种实现方法。

  第一种方法是使用Java系统属性javax.net.ssl.trustStore和javax.net.ssl.trustStorePassword来指向CustomKeystore文件,并提供访问该文件的口令。jdj.wsclient.truststore包中的示例Web服务客户端使用的就是这种方法(参见清单4)。

清单4

public static 
void main(String[] args) 
throws Exception
{
  System.setProperty(
   "javax.net.ssl.trustStore",
   "classpath/resources/keystore/CustomKeystore");

  System.setProperty(
   "javax.net.ssl.trustStorePassword", 
   "littlesecret");

  EmailServiceLocator wsl = 
   new EmailServiceLocator();

  Email_PortType ews = 
   wsl.getEmail();

  Object [] objects = 
   ews.getNewMessages("12345");

  out("Msg Count: " + objects.length);
}

  main()方法设置系统属性,然后创建使用该Web服务的对象。当JRE需要访问密钥库时,它就在文件系统中寻找classpath/resources/keystore/CustomKeystore文件。虽然这只是一个简单的解决方案,但它还是存在问题,因为密钥库文件必须放在文件系统中,而客户端代码也必须知道在哪里找到它。

  第二种解决方案具有更好的可移植性,它将资源放在jar文件中,从而避免了文件系统问题。客户端代码负责读取CustomKeystore文件,并以某种方式使用它创建到服务器的安全连接。jdj.wsclient.socketfactory包中的示例Web服务客户端使用的就是这种方法(参见清单5)。

清单5

public MySocketFactory(Hashtable table)
throws Exception
{
  out("Created!");
  KeyStore ks = 
   KeyStore.getInstance(
    KeyStore.getDefaultType()
   );

  char [] password = 
   "littlesecret".toCharArray();

  String keystore = 
   "/resources/keystore/CustomKeystore";

  Class tclass = 
   this.getClass();
  
  InputStream is = 
   tclass.getResourceAsStream(
    keystore
   );

  ks.load(is, password);

  KeyManagerFactory kmf = 
   KeyManagerFactory.getInstance("SunX509");

  kmf.init(ks,password);

  TrustManagerFactory tmf = 
   TrustManagerFactory.getInstance("SunX509");

  tmf.init(ks);

  SSLContext context = 
   SSLContext.getInstance("SSL");

  context.init(
   kmf.getKeyManagers(), 
   tmf.getTrustManagers(), 
   new SecureRandom()
  );

  factory = 
   context.getSocketFactory();
}

  清单5显示了如何将CustomKeystore文件作为资源读取,并使用它来创建javax.net.ssl.SSLSocketFactory。配置Axis可插入架构,然后可使用MySocketFactory类从该工厂创建安全的Socket对象。

结束语

  本文以一个简单的问题开始:我希望使用自签名的证书保护通过HTTPS的Web服务通信。默认情况下,JRE会拒绝应用程序的自签名证书,因为它不是来自于可信的认证机构。要让安全的通信可运行,必须让Web服务客户端JRE信任自签名证书。为此,我使用keytool应用程序生成一个新的公钥/私钥对,提取出自签名公钥,然后创建一个新的密钥库,并导入该自签名证书。然后我创建一个不需要任何客户端配置的、完全自包含的Web服务客户端。

 

客户端获取服务端webservice接口内容的六种方式(含sm3,sm4加密解密方式) WebService就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web调用来实现某个功能的应用程序。从深层次上看,Web Service是一种新的Web应用程序分支,它们是自包含、自描述、模块化的应用,可以在网络(通常为Web)中被描述、发布、查找以及通过Web来调用,Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。它可以使用标准的互联网协议,像超文本传输协议HTTP和XML,将功能体现在互联网和企业内部网上。WebService平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用你喜欢的任何语言,在你喜欢的任何平台上写。Web Service的标准:SOAP,UDDI, WSDL。Web Service客户端获取服务端webservice接口内容的六种方式(含sm3,sm4加密解密方式) 立即下载

相关推荐

基于Arduino的智能垃圾桶

通过本次简单的Arduino智能垃圾桶小实验可以快速了解Arduino的基本用法 1、材料准备 Arduino UNO HC-SR04超声波模块 SG90舵机 杜邦线 电源 电脑 2、代码分析 电机的控制 #include<Servo.h> #define duoji D5 Servo myduoji; void setup() { myduoji.attach(duoji); //舵机连接 Serial.begin(115200); } void loop() { myduoji.w

weixin_41679960的博客 1万+

本地测试使用自签名证书以开启网站https(例子说明:Nginx、Tomcat)

数字证书是由证书颁发机构(CA)签名并颁发的电子文件,用于建立网络连接的身份认证和加密通信。SSL证书是数字证书的一种。

菜鸡的博客 1558

油气井管柱力学发展

油气井管柱力学发展 1 石油管柱力学问题的发复杂性 1)油气管柱动力学的非线性 钻井中钻柱在重力、钻压、扭矩、钻井液浮力和井壁约束等作用下,产生三维变形。一方面随井眼轴线的弯曲而弯曲,这一变形被称为管柱的初位移;另一方面,管柱在运动过程中相对井眼轴线也有变形,这种变形被称为计算位移。管柱大变形主要表现在初位移部分,计算位移相对很小。大曲率井眼中管柱产生大挠度,但管柱很长且柔软性较好,变形一般仍保持...

weixin_43831995的博客 950

Web Service的加密

(转载)因为Web Service是靠SOAP协议进行传输信息的,所以对Web Service的加密就是对SOAP消息进行加密,通过SOAP协议扩展,可以实现这一点。数据在网络上传输,重要的一点是保证它的正确 性和完整性,并且要防止被无意或恶意的修改,窃取。Web Service中提供的加密模式有多少呢?怎样实现的呢?加密将防止数据被查看或修改,并在原本不安全的信道上提供安全的通讯信道。例

阿南的有趣吧 7006

OpenIddict实战:5步搞定.NET Core应用的OIDC单点登录集成

本文详细介绍了如何使用OpenIddict在.NET Core应用中快速实现OIDC单点登录集成。通过五个关键步骤,包括环境准备、数据库集成、客户端注册、令牌配置和多应用SSO集成,帮助开发者高效构建安全的企业级单点登录解决方案。

lambda的博客 727

光模块的封装工艺有哪些?

COB封装传统的单路10Gb/s或25Gb/s速率的光模块采用SFP封装将电芯片和TO封装的光收发组件焊接到PCB板上组成光模块。但对于40G及以上速率的高速光模块,受激光器速率限制(多为25G),主要通过多通道并行实现,如40G由4×10G实现,而100G则由4×25G实现。蝶形封装:壳体通常为长方体,结构及实现功能通常比较复杂,可以内置制冷器、热沉、陶瓷基块、芯片、热敏电阻、背光监控,并且可以支持所有以上部件的键合引线。BOX封装属于蝶形封装的一种,用于多通道并行封装。

WaytoICT- Explore ICT Technology, Build Your Tech Path 3810

webservice接口调用安全证书

最近在在调用webservice接口,对方的协议是https、自然也就出现了安全证书的问题: Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at su

just love code 1740

从零构建:如何用MATLAB和SDR硬件搭建你的第一个OFDM卫星通信原型系统

本文详细介绍了如何利用MATLAB和SDR硬件从零构建OFDM卫星通信原型系统。通过核心组件选型、开发环境配置、OFDM算法实现到系统集成与优化的完整流程,帮助通信工程学生和DIY爱好者快速掌握软件无线电技术在卫星通信中的应用。特别推荐使用HackRF One和MATLAB工具箱实现高性价比的OFDM系统验证。

pz890123456的博客 378

webservice 安全和加密的方法

众所周知,WebService访问API是公开的,知道其URL者均可以研究与调用。那么,在只允许注册用户的WebService应用中,如何确保API访问和通信的安全性呢?本文所指的访问与通信安全性包括: 访问安全性:当前访问者是注册合法用户 通信安全性:客户端与服务器之间的消息即使被第三方窃取也不能解密 本文安全的基本思路是: 注册用户登录时使用RSA加密 WebAPI调用参数使用DES加密(速度快) WebAPI调用中包含一个身份票据Ticket Web服务器保存当前Ticket的Session,包括..

matinal 當冬夜漸暖 。公众号:matinal 1500

UWB灵犀遥控器方案介绍

UWB灵犀指向遥控器的技术原理和方案介绍

xiongdauwb的博客 3899

2、系统建模、状态估计与故障诊断中的滤波设计与故障诊断方法

本文综述了系统建模、状态估计与故障诊断中的滤波设计与故障诊断方法。首先介绍了基于分析模型、知识和信号处理的三类故障诊断方法及其特点;随后总结了传统滤波方法(如维纳滤波、卡尔曼滤波)与非概率的集员滤波方法,重点阐述了在未知但有界噪声假设下的椭球、立方、多面体、区间和Zonotope等集员滤波算法原理与发展。文章还展示了各类集员滤波算法的应用实例与流程图,并对比了其计算复杂性与准确性。最后指出,根据不同系统特性选择合适的故障诊断与滤波方法至关重要,未来趋势将趋向于多方法融合与实际工程应用深化。

kmeans3miner的博客 137

WebService 设置访问加密(soap方式)

文章中使用了soap验证为webservice中的方法添加一层保护的教程方法

a1231233434453的博客 821

C# MVVM的“核武器”:CommunityToolkit.Mvvm的RelayCommand实战全解

你默默打开VS:“该用RelayCommand的‘量子纠缠’魔法了!用户点击按钮无响应,调试器显示命令未绑定,但代码看起来完美无缺。“我的MVVM应用?那可是能穿越线程的命令量子计算机!异步操作阻塞了UI线程,用户界面变成“加载中”死循环。:UI与业务逻辑通过命令“量子隧道”解耦。:所有长时间操作自动进入“量子跃迁”模式。:携带任意上下文的“量子信封”传递。:命令可用性随数据变化实时同步。

java专栏 663

webservice 采用SSL实现加密传输

本文转自:http://book.51cto.com/art/200906/129770.htmhttp://yeweiyun868.blog.163.com/blog/static/563784432011112985215397/7.9.2  采用SSL实现加密传输(1)在默认情况下,IIS使用HTTP协议以明文形式传输数据,Web Service就是使用HTTP协议进行数据传输的。Web S...

tianzongnihao的博客 1040

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[转]webservice 采用SSL实现加密传输

本文转自:http://book.51cto.com/art/200906/129770.htm http://yeweiyun868.blog.163.com/blog/static/563784432011112985215397/ 7.9.2 采用SSL实现加密传输(1) 在默认情况下,IIS使用HTTP协议以明文形式传输数据,Web Service就是使用HTTP协议进行数据传输的...

weixin_30455067的博客 446

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

如何保证Web Service的安全

转载自:http://www.cnblogs.com/jiapengliang2005/articles/1619233.html   要以安全的方式访问Web服务方法,可以考虑以下安全措施:l         是谁调用?——SoapHeader身份认证。l         来自哪里?——访问IP认证。l         加密传输 ——SSL安全访问。这些安全保护措施常常是配合使用的。7.9.1 ...

weixin_34187862的博客 291

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C#远程调用技术WebService葵花宝典

一、课程介绍直接开门见山吧,在学习之前阿笨想问大家一句,关于WebService远程过程调用技术(RPC) 你真的会了吗?不要跟老夫扯什么WebService技术已经过时,如果你的内心有在偷偷告诉你其实我是真的不会WebService的话,那么恭喜你,因为你在这茫茫的IT编程世界里找到了这本《C#远程调用技术WebService葵花宝典》!曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不...

跟着阿笨一起玩NET 417

java webservice ssl_Http Https Webservice

1.Http作为web服务的首选协议,居有4大优点:1)http非常简单,以纯文本(超文本)形式编码的请求和响应组成2)http是无状态的。一旦发送了一个http请求,客户和服务器之间的连接信息就会被释放,有利于减少服务器资源的消耗。3)http的运行端口80,在大多数防火墙上是公开的4)行业认可。但是Http的缺点:1)缺少对异步消息的支持2)消息传输的不可靠性web service相对http...

weixin_36296325的博客 444
上一篇: keytool+tomcat配置HTTPS双向证书认证(无openssl)
下一篇: WebService 采用SSL/HTTPS协议来传输
TechChan
博客等级 码龄18年 140粉丝 85原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值