我需要打开一个tcp套接字并使用X.509数字证书使用SSLv3或TLSv1 IP协议进行身份验证。
这次握手过程究竟涉及什么?我知道每条消息都应加密并使用我的私钥签名。还有什么?
成功之后,我将通过套接字发送POST HTTP请求。
如果在一段时间后处于非活动状态,服务器可能会决定关闭此套接字。我需要能够重新打开,验证并再次发送请求。
给我的证书是PKCS12格式,包含以下信息。
证书识别 ,证书公钥 ,证书私钥 ,证书颁发机构链
我对SSL很新,有人可以提供指导如何在java或spring集成中实现它。
答案 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
)将会启动。
这可以通过以下方式完成:
SSLSocketFactory
,javax.net.ssl.keyStore
和javax.net.ssl.keyStoreType
系统属性。我建议反对,因为机器上的其他人可能会通过列出进程(取决于机器的配置)看到命令行和您的设置,javax.net.ssl.keyStorePassword
并通过SSLContext
(Java 6)将其设置为默认值。请注意.p12(PKCS#12)文件是开箱即用的受支持的密钥库,因此您无需使用SSLContext.setDefault(..)
进行任何转换,只需使用keytool
作为商店类型
如果您需要这些设置,或者您可以初始化PKCS12
,请从中创建SSLContext
,然后配置SSLSocketFactory
的实例(如果这是您正在使用的) HttpsURLConnection
。
(您可以使用jSSLutils等工具来帮助构建setSSLSocketFactory
。)