关于 TLS/SSL 细节,对于客户端证书身份验证,与“正常”的 hanshake 相比,服务器向客户端发送额外的CertificateRequest
TLS 消息,客户端在后续 TLS 消息中使用其证书进行响应Certificate
(稍后,客户端发送CertificateVerify
TLS消息,它用它的私钥对其他消息进行签名,以便向服务器证明它确实拥有它发送的证书中公钥的私钥。)请注意,一旦握手完成,消息是没有使用您的私钥加密,而是使用与服务器共享的临时密钥(秘密同意这些密钥也是握手的一部分)。
在实践中,您需要一个证书及其私钥,包含在 PKCS#12 文件中(例如),并配置客户端在连接到服务器时发送它(服务器将根据其配置要求它)。假设您只需要一个证书并且不必在多个证书之间做出选择更容易,否则,您需要X509TrustManager
在SSLContext
.
如果您的所有连接都可能使用此证书,您可以使用默认设置,该设置HttpsURLConnection
(和默认设置SSLSocketFactory
)将被使用。这可以通过以下方式完成:
- 使用您的设置在命令行上设置
javax.net.ssl.keyStore
,javax.net.ssl.keyStoreType
和javax.net.ssl.keyStorePassword
system 属性。我建议不要这样做,因为机器上的其他人可能会通过列出进程(取决于机器的配置)来查看命令行和您的设置,
- 在您的应用程序中设置这些系统属性,
- 通过(Java 6)初始化一个
SSLContext
并将其设置为默认值。SSLContext.setDefault(..)
请注意, .p12 (PKCS#12) 文件是开箱即用的受支持密钥库,因此您无需使用 进行任何转换keytool
,只需PKCS12
用作存储类型即可。
如果您需要这些设置,或者您可以初始化一个,从中SSLContext
创建一个,然后使用.SSLSocketFactory
HttpsURLConnection
setSSLSocketFactory
(您也许可以使用jSSLutils之类的工具来帮助构建SSLContext
.)