如何通过java程序来加载客户端证书进行ssl连接?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过java程序来加载客户端证书进行ssl连接?相关的知识,希望对你有一定的参考价值。

能不能提供一些java模拟IE浏览器利用数字证书进行访问网页的代码?

参考技术A 用WS-Security对.NET 和 Java之间的Web服务请求进行签发到底为了对Web服务请求进行签发可以保证消息内容在传输期间没有被修改。 使用数字证书,可以用一个私钥对Web服务进行签发,这样只能用相应的公钥对消息进行校验。

到目前为止,Web服务的安全策略有两种选择: 一种是在传输层(使用 SSL),另一种是在应用层,使用自定制的安全机制。 这两种方法虽然技术上有效,在采用时均有一些限制与缺点。

在传输层使用SSL而获得的安全性是通过对底层的传输层(HTTP)进行安全化而确保Web服务请求的完整性。. SSL 既可以用于加密链接,也可以用于使用证书来校验客户端和服务器。

使用SSL来保护Web服务的一个主要问题之一就是其安全性只在一个单独的节点到另一个节点之间有效。 由于SSL通信是基于传输层,一旦到达终端节点,这种保护消息的方法就不再有效了。. 例如,我从Client A 向 Server B发送一个消息,并使用SSL来保护链接。 然而,如果我从Client A 向 Server C发送一条信息,并且必须经过Server B,这时就没有容易的办法来确保使用SSL通过这一媒介的传输消息的安全性。

也可以开发一种自定制的安全机制,将消息的内容和消息头在客户端进行签发,并在服务器端进行校验。 这种办法可以克服传输安全问题,但最终这将是一种自定制的解决方案。. 如果一个组织希望保护发布到其它组织的Web服务,则他必须确保另一终端节点也使用了相同的技术。

WS-Security 通过提供一种基于应用层的Web服务签发方式来解决这两个问题(避免在传输层进行安全化时遇到的安全问题),它使用了一个已经公布的标准,可以由客户、系统集成商和销售商参考和采用。

为了帮助推动这一标准,本文将演示一系列两个WS-Security实现之间进行Web签发的示例: 一个位于 Microsoft .NET, 基于 Microsoft Web Services Enhancements (WSE) 1.0, 另一个基于GLUE Professional 4.0.1。

从 Java bean 到 Web 服务的 SSL 连接问题

【中文标题】从 Java bean 到 Web 服务的 SSL 连接问题【英文标题】:SSL Connection problem to web service from Java bean 【发布时间】:2011-04-04 08:18:18 【问题描述】:

我编写了一个通过 jaxws 连接到 SSL Web 服务(包括客户端证书)的应用程序。为此,我有一个 wstrust.jks,其中包含 ws 的受信任根证书,而 client.p12 是连接到 ws 时要使用的客户端证书。然后,我创建了一个自定义 SSLSocketFactory,以便能够在连接到 ws 期间使用我的 wstrust.jks 和 client.12。我告诉 jaxws 使用我的实现:

[javax.xml.ws.BindingProvider].getRequestContext().put(JAXWSProperties.SSL_SOCKET_FACTORY, customSSLSocketFactory);

如果我将它作为独立的 java 应用程序运行,一切都会像魅力一样运行。但是,当我在部署为在 Tomcat 下运行的战争文件的 Java bean (JSF) 中使用相同的技术时, 我收到“PKIX 路径构建失败”-错误。

但是如果我在启动 Tomcat 时通过 JAVA_OPTS 配置 SSL(通过 -Djavax.net.ssl.* 参数),我可以让它工作。

所以我的问题:

我如何(或有可能)让我的自定义 SSLSocketFactory 技术在 Java bean 中工作?

我猜想当 tomcat 将自己包裹在我的应用程序中时,当作为 bean 运行时,它的工作方式有所不同,我希望使用自定义 SSLSocketFactory 没有得到尊重......

感谢您对此的任何意见!

/托比

【问题讨论】:

【参考方案1】:

解决了。如果有人有同样的问题,这里是如何。而不是通过以下方式设置我的自定义工厂:

[javax.xml.ws.BindingProvider].getRequestContext().put(JAXWSProperties.SSL_SOCKET_FACTORY, customSSLSocketFactory);

我不得不设置它:

HttpsURLConnection.setDefaultSSLSocketFactory(customSSLSocketFactory);

否则它似乎会被忽略。

/托比

【讨论】:

以上是关于如何通过java程序来加载客户端证书进行ssl连接?的主要内容,如果未能解决你的问题,请参考以下文章

Java:使用自签名证书的 SSL 客户端身份验证

从 Java bean 到 Web 服务的 SSL 连接问题

允许 Java 使用不受信任的证书进行 SSL/HTTPS 连接

在Java HTTP请求中包含.pem证书

如何使用 Postgres 数据库 url 字符串传递证书路径以进行 SSL 连接

如何将信任证书从 .jks 转换为 .pem?