@Contract(threading=SAFE) public class SSLConnectionSocketFactory extends Object implements LayeredConnectionSocketFactory
SSLSocketFactory可用于根据可信证书列表验证HTTPS服务器的身份,并使用私钥对HTTPS服务器进行身份验证。
SSLSocketFactory将在提供包含一个或多个可信证书的trust-store文件时启用服务器身份验证。 如果目标HTTPS服务器尝试使用不可信证书进行身份验证,客户端安全套接字将在SSL会话握手期间拒绝连接。
使用JDK keytool实用程序导入受信任的证书并生成信任存储文件:
keytool -import -alias "my server cert" -file server.crt -keystore my.truststore
在特殊情况下,标准信任验证过程可以通过使用自定义TrustStrategy来绕过。 此接口主要用于允许自签名证书被接受为受信任的,而无需将其添加到信任存储文件。
当提供包含私钥/公共证书对的key-store文件时,SSLSocketFactory将启用客户端身份验证。 客户端安全套接字将在SSL会话握手期间使用私钥对目标HTTPS服务器进行身份验证,如果服务器请求这样做。 目标HTTPS服务器将反过来验证客户端提供的证书,以建立客户端的真实性。
使用以下操作顺序来生成密钥存储文件
使用JDK keytool实用程序生成一个新的密钥
keytool -genkey -v -alias "my client key" -validity 365 -keystore my.keystore 为了简单起见,使用与密钥库相同的密钥密钥
发出证书签名请求(CSR)
keytool -certreq -alias "my client key" -file mycertreq.csr -keystore my.keystore 将证书请求发送到受信任的证书颁发机构进行签名。 可以选择作为自己的CA,并使用PKI工具(如OpenSSL)签署证书请求。
导入受信任的CA根证书
keytool -import -alias "my trusted ca" -file caroot.crt -keystore my.keystore 导入包含完整证书链的PKCS#7文件
keytool -import -alias "my client key" -file mycert.p7 -keystore my.keystore 验证结果密钥库文件的内容
keytool -list -v -keystore my.keystore | Modifier and Type | Field and Description |
|---|---|
static X509HostnameVerifier |
ALLOW_ALL_HOSTNAME_VERIFIER
已过时。
|
static X509HostnameVerifier |
BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
已过时。
|
static String |
SSL |
static String |
SSLV2 |
static X509HostnameVerifier |
STRICT_HOSTNAME_VERIFIER
已过时。
|
static String |
TLS |
| Modifier and Type | Method and Description |
|---|---|
Socket |
connectSocket(int connectTimeout, Socket socket, HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpContext context)
使用给定的解析远程地址将套接字连接到目标主机。
|
Socket |
createLayeredSocket(Socket socket, String target, int port, HttpContext context)
返回一个与现有套接字分层的给定主机连接的套接字。
|
Socket |
createSocket(HttpContext context)
创建新的,未连接的套接字。
|
static HostnameVerifier |
getDefaultHostnameVerifier() |
static SSLConnectionSocketFactory |
getSocketFactory()
使用基于标准JSSE信任资料(安全属性目录中的
cacerts文件)获取SSL上下文的默认SSL套接字工厂。
|
static SSLConnectionSocketFactory |
getSystemSocketFactory()
根据
Java™ Secure Socket Extension (JSSE) Reference Guide中所述的系统属性获取具有SSL上下文的默认SSL套接字工厂。
|
protected void |
prepareSocket(SSLSocket socket)
对新创建的SSLSocket执行任何自定义初始化(SSL握手之前)。
|
public static final String TLS
public static final String SSL
public static final String SSLV2
@Deprecated public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER
@Deprecated public static final X509HostnameVerifier BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
@Deprecated public static final X509HostnameVerifier STRICT_HOSTNAME_VERIFIER
public SSLConnectionSocketFactory(SSLContext sslContext)
@Deprecated public SSLConnectionSocketFactory(SSLContext sslContext, X509HostnameVerifier hostnameVerifier)
@Deprecated public SSLConnectionSocketFactory(SSLContext sslContext, String[] supportedProtocols, String[] supportedCipherSuites, X509HostnameVerifier hostnameVerifier)
@Deprecated public SSLConnectionSocketFactory(SSLSocketFactory socketfactory, X509HostnameVerifier hostnameVerifier)
@Deprecated public SSLConnectionSocketFactory(SSLSocketFactory socketfactory, String[] supportedProtocols, String[] supportedCipherSuites, X509HostnameVerifier hostnameVerifier)
public SSLConnectionSocketFactory(SSLContext sslContext, HostnameVerifier hostnameVerifier)
public SSLConnectionSocketFactory(SSLContext sslContext, String[] supportedProtocols, String[] supportedCipherSuites, HostnameVerifier hostnameVerifier)
public SSLConnectionSocketFactory(SSLSocketFactory socketfactory, HostnameVerifier hostnameVerifier)
public SSLConnectionSocketFactory(SSLSocketFactory socketfactory, String[] supportedProtocols, String[] supportedCipherSuites, HostnameVerifier hostnameVerifier)
public static HostnameVerifier getDefaultHostnameVerifier()
public static SSLConnectionSocketFactory getSocketFactory() throws SSLInitializationException
cacerts文件)获取具有SSL上下文的默认SSL套接字工厂。
不考虑系统属性。
SSLInitializationException
public static SSLConnectionSocketFactory getSystemSocketFactory() throws SSLInitializationException
SSLInitializationException
protected void prepareSocket(SSLSocket socket) throws IOException
SSLSocket.setEnabledCipherSuites(String[]) 。
IOException - 如果被覆盖,可能会抛出
public Socket createSocket(HttpContext context) throws IOException
ConnectionSocketFactory复制
connectSocket方法。
createSocket在界面
ConnectionSocketFactory
IOException - 如果在创建套接字时发生I / O错误
public Socket connectSocket(int connectTimeout, Socket socket, HttpHost host, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpContext context) throws IOException
ConnectionSocketFactory复制
connectSocket在接口
ConnectionSocketFactory
connectTimeout - 连接超时。
socket - 要从ConnectionSocketFactory.createSocket(HttpContext)获得的套接字 。
null表示应该创建并连接一个新的套接字。
host - 由主叫方(最终用户)指定的目标主机。
remoteAddress - 解析的远程地址要连接。
localAddress - 将套接字绑定到的本地地址,或任意的
null 。
context - 实际的HTTP上下文。
sock参数不同。
IOException - 如果发生I / O错误
public Socket createLayeredSocket(Socket socket, String target, int port, HttpContext context) throws IOException
LayeredConnectionSocketFactory复制
createLayeredSocket在界面
LayeredConnectionSocketFactory
socket - 现有套接字
target - 目标主机的名称。
port - 目标主机上要连接的端口。
context - 实际的HTTP上下文。
IOException - 如果在创建套接字时发生I / O错误
Copyright © 1999–2017 The Apache Software Foundation. All rights reserved.