打开SSL TCP套接字并发送Web请求

时间:2010-07-15 23:55:00

标签: java spring ssl tcp x509

我需要打开一个tcp套接字并使用X.509数字证书使用SSLv3或TLSv1 IP协议进行身份验证。

这次握手过程究竟涉及什么?我知道每条消息都应加密并使用我的私钥签名。还有什么?

成功之后,我将通过套接字发送POST HTTP请求。

如果在一段时间后处于非活动状态,服务器可能会决定关闭此套接字。我需要能够重新打开,验证并再次发送请求。

给我的证书是PKCS12格式,包含以下信息。

证书识别 ,证书公钥 ,证书私钥 ,证书颁发机构链

我对SSL很新,有人可以提供指导如何在java或spring集成中实现它。

3 个答案:

答案 0 :(得分:1)

一个好的开始是看到javax.net.ssl.HttpsURLConnection javadocs:http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/javax/net/ssl/HttpsURLConnection.html

此外,您还需要使用keytool命令将证书导入密钥库。

答案 1 :(得分:0)

你不需要知道握手,这一切都是为你完成的。按照建议阅读JSSE参考,看看你+做什么+必须担心。

答案 2 :(得分:0)

关于TLS / SSL详细信息,对于客户端证书身份验证,与“正常”hanshake相比,服务器向客户端发送额外的CertificateRequest TLS消息,客户端在后续{{1}中使用其证书进行响应TLS消息(稍后,客户端发送Certificate TLS消息,用其私钥对其他消息进行签名,以便向服务器证明它确实拥有公钥的私钥。它发送的证书。)请注意,一旦握手完成,消息不会使用您的私钥加密,而是使用与服务器共享的临时密钥(保密地同意这些密钥也是握手的一部分)。

实际上,您需要一个证书及其私钥,包含在PKCS#12文件中(例如),并配置客户端在连接到服务器时发送它(服务器将根据其配置请求它) )。 假设您只需要一个证书并且不必在多个证书之间做出选择就更容易,否则,您需要在CertificateVerify内设置自己的X509TrustManager

如果您的所有连接都可能使用此证书,则可以使用默认设置,SSLContext(以及默认HttpsURLConnection)将会启动。 这可以通过以下方式完成:

  • 使用您的设置在命令行上设置SSLSocketFactoryjavax.net.ssl.keyStorejavax.net.ssl.keyStoreType系统属性。我建议反对,因为机器上的其他人可能会通过列出进程(取决于机器的配置)看到命令行和您的设置,
  • 在您的应用程序中设置这些系统属性
  • 初始化javax.net.ssl.keyStorePassword并通过SSLContext(Java 6)将其设置为默认值。

请注意.p12(PKCS#12)文件是开箱即用的受支持的密钥库,因此您无需使用SSLContext.setDefault(..)进行任何转换,只需使用keytool作为商店类型

如果您需要这些设置,或者您可以初始化PKCS12,请从中创建SSLContext,然后配置SSLSocketFactory的实例(如果这是您正在使用的) HttpsURLConnection

(您可以使用jSSLutils等工具来帮助构建setSSLSocketFactory。)