高端品牌网站建设兴田德润在哪儿,代理登录网站,网站怎么做pc端盒子,怎么免费申请网站域名目录[-] 最简单的安全方案 专门针对WebService的安全方案 对称密钥用户认证 原理 必备软件 创建账户 创建服务器端数字证书 导出证书 创建WebService 创建客户端 最简单的安全方案 J2EE容器端的WebService#xff0c;是由Servlet来提供的#xff0c;以Metro为例#xff0c;所… 目录[-] 最简单的安全方案 专门针对WebService的安全方案 对称密钥用户认证 原理 必备软件 创建账户 创建服务器端数字证书 导出证书 创建WebService 创建客户端 最简单的安全方案 J2EE容器端的WebService是由Servlet来提供的以Metro为例所有的webservice请求都是由com.sun.xml.ws.transport.http.servlet.WSServlet处理的。所以最简单的方法便是将安全问题交给web容器来处理。比如使用HTTPs保证消息传输安全使用BA来保证认证与授权。 使用此种方案首先需要配置容器开启SSL端口如http://my.oschina.net/xpbug/blog/204794#OSC_h3_5 一段展示了如何开启tomcat的SSL端口 。其次需要配置容器BA认证与授权机制如http://my.oschina.net/xpbug/blog/198765文章展示了如何配置tomcat容器的安全 。前面均是针对容器所做的配置针对WebServiceClient我们还需要按照BA的格式将用户名和密码放置到HTTP header中。 下面一段代码展示了如何将用户名和密码以BA的形式放入HTTP header中。 public class WsClient{//Because of BA, we cant parse wsdl http://localhost:8080/WebServiceExample/user.wsdl directly//save it as local file, and parse itprivate static final String WS_URL file:c://user.wsdl;public static void main(String[] args) throws Exception {URL url new URL(WS_URL);QName qname new QName(http://mycompany.com/, TestImplService);Service service Service.create(url, qname);Test port service.getPort(Test.class);//add username and password for container authenticationBindingProvider bp (BindingProvider) port;bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, mkyong);bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, 123456);System.out.println(port.doSth());}
} 最简单的安全存在着很多缺陷无法发挥webservice的全部特性缺陷有下 方案依托的是HTTP容器要求SOAP必须通过HTTP传输且依托HTTP heander。这使SOAP消息无法独立。如果想使用SMTP发送SOAP消息需要重新设计安全机制。 HTTPS的非对称秘钥使得SOAP消息只能是两个端之间传输无法被直接转发到第三端除非经过处理重新解密然后用第三端证书加密。这很混乱。 HTTPS只保证了传输安全被接收以后就无法再保证安全。SOAP消息在Proxy端解密再被转发之前被恶意修改。如何保证SOAP消息在中转的时候不会被修改甚至不被解析泄露内容也是安全的一个重要性。 SOAP消息可能会分发给各种服务商我们只希望消息中的某一部分可以被相应的服务商所解析其它部分都是加密的。这需要消息中的需要部分加密且可以使用不同的加密算法。 综上所述最简单的安全方案可以用在消息并不敏感的服务商中如果针对银行那还是需要更加复杂的安全方案。 专门针对WebService的安全方案 Metro实现了WS-SecurityWS-SecureConversation和WS-Trust等设计安全的规范。其复杂性自不必说我对此也是一知半解。需要深入了解的时候还是需要去读文档说明。但安全总是无外乎这么一个过程 1 签名接收端可以验证签名以检验消息是否被修改过。 2 加密对消息整体进行加密保证消息不会泄露。任何中介都无法解析原始消息。如果有恶意中介篡改加密后的消息但它却给出正确的加密签名。使用第一项便可验证处消息被篡改过。 3 用户名与密码验证。在传输过程中将用户名密码放入header中再进行加密。服务器端可以拿到用户密码并加以验证。 4 使用证书。 WS-Security可以不依赖传输协议完全实现SOAP消息的自包含式安全它对SOAP消息体签名把签名放到SOAP header中可以把用户信息放入SOAP header中最后可以对部分SOAP消系进行加密。WS-Security很复杂它也提供了非常繁多的安全解决机制。不过好在NetBeans帮我们简化了这部分的开发。 首先看下Metro提供了多少安全组合方案 服务端 客户端 各种组合的解释可以在这个网站获得https://metro.java.net/guide/ch12.html#ahicu 我们不可能在真正使用之前全部掌握所有的安全机制只可能了解每一个机制的特点当真正需要用到时再一边看文档一边实现。 接下来我选取上面安全机制中的第一个来做一个实验。使用Username Authentication with Symmetric Key (UA)。 对称密钥用户认证 原理 原英文名叫Username Authentication with Symmetric Key (UA)我把它翻译成使用对称密钥及用户认证的安全机制 作为WS-Security安全机制的一种此种机制是一种最常见的加密方法。其效率要比非对称加密算法要高很多。它的原理如下 服务器端需要先生成一对公钥和密钥。 客户端安装服务器的公钥。 当客户端发起请求的时候其必须输入用户名和密码。 客户端动态随机生成一个对称密钥。 客户端使用服务器公钥加密对称密钥放到SOAP头中。 客户端使用对称密钥加密用户名密码放到SOAP头中。 客户端使用对称密钥加密消息体放到SOAP体中。 客户端发出SOAP消息。 服务器接收SOAP消息使用密钥可以解析出对称密钥。此时服务器和客户端共享了对称密钥。 服务器使用对称密钥解析用户名密码消息体。 先验证账户再执行消息。 服务器使用对称密钥加密返回的消息。 接下来我将对此做实现。 必备软件 最新NetBeans IDE. Glassfish4 JDK7 由于Glassfish4本身就自带Metro2.3比Tomcat更容易使用所以选择Glassfish4作为服务器。而NetBeans又是开发Metro WebService的利器。 创建账户 向Glassfish中添加账号。启动Glassfish, 打开控制台http://localhost:4848/ 展开Configurations-Default Config - Security -Realms-File 在此页面上点击Manage Users按钮添加一个用户{name: xpbug, group: test, password: test} 确保Glassfish使用的是File Realm做认证。 创建服务器端数字证书 Glassfish的keystore和trustStore在domain下的config目录中例如C:\glassfish4\glassfish\domains\domain1\config。 其中keystore为keystore.jks, 而trustStore为cacerts.jks. 对于服务器端我们不需要去管trustStore。 在glassfish keystore目录下面使用命令创建证书 keytool -genkey -alias myWebService -keyalg RSA -keysize 1024 -keystore keystore.jks -validity 365 keystore.jks的默认密码为changeit 注意在填写First and Last name或者是Common name的时候需要填写网站的域名。否则证书无法工作。 注意生成数字证书的密码必须使用跟keystore相同的密码这是glassfish的一个limitation否则glassfish会启动失败。这里有解释http://weblogs.java.net/blog/kumarjayanti/archive/2007/11/ssl_and_crl_che.html 导出证书 需要将服务器端的数字证书导出证书中含有公钥。此证书将为客户端所用。在服务器的keystore目录下运行命令 keytool -export -alias myWebService -file my.cer -keystore keystore.jks 创建WebService 使用NetBeans创建一个Java Web项目取名为Test。 然后右键点击项目创建一个Web Service。取名为Say。SEI中将默认产生一个hello方法。我们就用它做实验。 右键点击生成的webservice选择Edit Web Service Attributes. 按照下图填写 点击Keystore按钮在弹出的对话框中填写你的keystore密码证书alias以及证书的密码 右键点击项目点击deploy。 访问http://localhost:8080/Test/Say 看WebService是否部署成功。运行http://localhost:8080/Test/Say?Tester 网站会报告webservice被加密无法运行tester的信息。 创建客户端 在NetBeans中创建一个Java项目。然后再项目中创建Web Service Client。WSDL的地址为 http://localhost:8080/Test/Say?wsdl 当项目编译完成以后客户端endport的java 类已经完全在项目中了接下来在Library中加入Metro2 在main函数中调用endport。 public class JavaApplication1 {public static void main(String[] args) {Say port new Say_Service().getSayPort();System.out.println(port.hello(test));}
} 运行项目会发现运行错误。SOAP header无法解析。 原因在于我还没有导入server的证书。 首先服务器的证书my.cert导入到客户端的truststore中。使用命令 keytool -import -alias myWebService -file my.cer -keystore d:/clientTrustStore.jks -storepass testit 将my.cer导入到我的truststore中如果store不存在则自动创建。 然后在NetBeans中右键点击客户端项目中的web service 在弹出的菜单中选择Edit Web Service Attributes. 在QoS面板下的Security一栏中点击Truststore. 填写上刚刚创建好的truststore的信息。 接着在用户栏中使用Glassfish Realm中的账号。 运行项目这次可以看到 Hello test ! 在glassfish的domain.xml中添加 jvm-options-Dcom.sun.xml.ws.transport.http.HttpAdapter.dumptrue/jvm-options 可以在log中看到SOAP消息的进出记录。 ---[HTTP request]---
accept: text/xml, multipart/related
connection: keep-alive
content-length: 8202
content-type: text/xml;charsetutf-8
host: localhost:8080
soapaction: http://my.com/Say/helloRequest
user-agent: JAX-WS RI 2.2-hudson-740-【SOAP message】 自己去查看会发现所有的内容均被加密。 webservice高级安全附带实例