0

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

这个握手过程具体涉及什么?我知道每条消息都应该用我的私钥加密和签名。还有什么?

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

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

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

证书识别 证书公钥 证书私钥 证书授权链

我对 SSL 相当陌生,有人可以提供有关如何在 java 或 spring 集成中实现这一点的指针。

4

3 回答 3

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 命令将证书导入密钥库。

于 2010-07-16T03:03:52.083 回答
0

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

于 2010-07-16T10:35:32.297 回答
0

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

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

如果您的所有连接都可能使用此证书,您可以使用默认设置,该设置HttpsURLConnection(和默认设置SSLSocketFactory)将被使用。这可以通过以下方式完成:

  • 使用您的设置在命令行上设置javax.net.ssl.keyStore,javax.net.ssl.keyStoreTypejavax.net.ssl.keyStorePasswordsystem 属性。我建议不要这样做,因为机器上的其他人可能会通过列出进程(取决于机器的配置)来查看命令行和您的设置,
  • 在您的应用程序中设置这些系统属性,
  • 通过(Java 6)初始化一个SSLContext并将其设置为默认值。SSLContext.setDefault(..)

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

如果您需要这些设置,或者您可以初始化一个,从中SSLContext创建一个,然后使用.SSLSocketFactoryHttpsURLConnectionsetSSLSocketFactory

(您也许可以使用jSSLutils之类的工具来帮助构建SSLContext.)

于 2010-07-16T17:48:47.527 回答