这些部分引用了可从 BEA 的 dev2dev 网站联机获得的示例代码,WebLogic Server 分发的以下位置也包括了这些示例代码:
SAMPLES_HOME\server\examples\src\examples\security\sslclient
sslclient
目录包含 instructions.html
文件、ant
生成文件以及下列 Java 和 JavaServer 页 (.jsp
) 文件:
Java 安全套接口扩展(Java Secure Socket Extension,简称 JSSE)是一组支持和实现 SSL 和 TLS v1 协议的包,可使得这些功能能够通过编程方式使用。BEA WebLogic Server 支持使用安全套接口层(Secure Sockets Layer,简称 SSL)加密 WebLogic Server 客户端和服务器、Java 客户端、Web 浏览器以及其他服务器之间传输的数据。
WebLogic Server 的 JSSE 实现可由 WebLogic 客户端使用,但并不是必需的。其他 JSSE 实现也可用于它们在服务器之外的客户端代码。
在 WebLogic 服务器端应用程序使用 SSL 时,适用下列限制:
其他提供程序可能与 WebLogic Server 一起使用,但未测试的提供程序不大可能即时工作。有关使用 WebLogic Server 支持的 JCE 提供程序的详细信息,请参阅“确保 WebLogic Server 安全”中的配置 SSL。
WebLogic Server 为安全套接口层 (SSL) 加密的通信使用 HTTPS 端口,在此端口上仅可以使用 SSL。
注意: | 为了在 WebLogic 客户端实现安全性,必须在 Java 客户端上安装 WebLogic Server 软件分发包。 |
Java 客户端使用 Java 命名和目录接口 (JNDI) 将凭据传送给 WebLogic Server。Java 客户端通过获取 JNDI InitialContext
来建立与 WebLogic Server 的连接。然后,Java 客户端使用 InitialContext
,在 WebLogic Server JNDI 树中查找所需的资源。
注意: | JAAS 是首选的身份验证方法;但是,此身份验证提供程序的 LoginModule 只支持用户名和密码身份验证。因此,对于客户端证书身份验证(也称作双向 SSL 身份验证),应该使用 JNDI。要使用 JAAS 进行客户端证书身份验证,必须编写自定义身份验证提供程序(其 LoginModule 能进行证书身份验证)。 |
要指定用户和用户凭据,请设置表 5-1 中列出的 JNDI 属性。
这些属性存储在传递给 InitialContext
构造方法的散列表中。
清单 5-1 说明了如何在 Java 客户端使用单向 SSL 证书身份验证。有关双向 SSL 身份验证代码示例,请参阅清单 5-4, 使用 JNDI 的双向 SSL 证书身份验证客户端示例。
...
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL, "t3s://weblogic:7002");
env.put(Context.SECURITY_PRINCIPAL, "javaclient");
env.put(Context.SECURITY_CREDENTIALS, "javaclientpassword");
ctx = new InitialContext(env);
注意: | 有关 JNDI 上下文和线程以及如何避免潜在 JNDI 上下文问题的信息,请参阅“WebLogic JNDI 编程”中的 JNDI 上下文和线程和如何避免潜在的 JNDI 上下文问题。 |
要实现在 WebLogic Server 上使用 SSL 身份验证的 Java 客户端,请使用 Java JDK 5.0 应用程序编程接口(Application Programming Interface,简称 API)和 WebLogic API 的组合。
表 5-2 列出并描述了用于实现证书身份验证的 Java API 包。表 5-2 中的信息是从 Java API 文档获取的,并附带批注,以添加 WebLogic Server 特定信息。有关 Java API 的详细信息,请参阅位于 http://java.sun.com/j2se/1.5.0/docs/api/index.html 和 http://java.sun.com/j2ee/1.4/docs/api/index.html 的 Javadoc。
表 5-3 列出并描述了用于实现证书身份验证的 WebLogic API 包。有关详细信息,请参阅 Javadocs for WebLogic Classes。
有关可实现上述组件的完整工作 SSL 身份验证客户端,请参阅与 WebLogic Server 一同提供的 SSLClient 示例应用程序(位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录下)。此示例也可从 BEA 的 dev2dev 站点联机获得
有关 JSSE 身份验证的详细信息,请参阅 Sun 的“Java Secure Socket Extension (JSSE) Reference Guide”,可在以下位置找到:http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html。
可以使用 URL 对象执行从充当客户端的 WebLogic Server 实例到另一个 WebLogic Server 实例的出站 SSL 连接。weblogic.net.http.HttpsURLConnection
类为客户端提供了指定安全上下文信息(包括客户端的数字证书和私钥)的方法。
weblogic.net.http.HttpsURLConnection
类提供了一些用于实现下列功能的方法:确定协商的密码组、获取/设置主机名验证器、获取服务器的证书链以及获取/设置 SSLSocketFactory
以便新建 SSL 套接口。
SSLClient 代码示例使用 weblogic.net.http.HttpsURLConnection
类执行出站 SSL 连接。SSLClient 代码示例可从 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录下的 examples.security.sslclient
包获取。
此部分使用这些示例说明了如何编写各种类型的 SSL 客户端。提供了下列类型的 SSL 客户端示例:
SSL 客户端许可要求:任何使用 WebLogic SSL 类 (weblogic.security.SSL) 来调用 Enterprise JavaBean (EJB) 的独立 Java 客户端必须使用 BEA 许可文件。在运行客户端应用程序时,请设置下列系统属性:
以下是一个运行使用许可文件默认位置 (c:\bea
) 的命令的示例:
java -Dbea.home=c:\bea \
-Djava.protocol.handler.pkgs=weblogic.net my_app
SSLClient 示例说明了如何使用 WebLogic SSL 库通过使用 URL
和 URLConnection
对象执行传出 SSL 连接。它显示如何从独立应用程序以及 WebLogic Server 中的Servlet 执行此连接。
注意: | 充当 SSL 客户端的 WebLogic Server 为传出 SSL 连接使用服务器的标识证书。默认情况下,在 WebLogic Server 上运行并使用先前描述的 SSL API 的应用程序不会共享服务器的标识证书,仅是信任。 |
清单 5-2 显示了 SSLClient 示例的代码片段,完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录下的 SSLClient.java
文件中。
package examples.security.sslclient;
import java.io.*;
import java.net.URL;
import java.security.Provider;
import javax.servlet.ServletOutputStream;
...
/*
* 使用 WebLogic SSL 客户端类,
* 此方法包含如何使用 URL 和 URLConnection 对象
* 创建新 SSL 连接的示例。
*/
public void wlsURLConnect(String host, String port,
String sport, String query,
OutputStream out)
throws Exception {
...
URL wlsUrl = null;
try {
wlsUrl = new URL("http", host, Integer.valueOf(port).intValue(),
query);
weblogic.net.http.HttpURLConnection connection =
new weblogic.net.http.HttpURLConnection(wlsUrl);
tryConnection(connection, out);
}
...
wlsUrl = new URL("https", host, Integer.valueOf(sport).intValue(),
query);
weblogic.net.http.HttpsURLConnection sconnection =
new weblogic.net.http.HttpsURLConnection(wlsUrl);
...
SSLSocketClient 示例说明了如何使用 SSL 套接口直接转至安全端口,以连接到 WebLogic Server 实例服务的 JSP,并显示该连接的结果。它显示了如何实现下列功能:
清单 5-3 显示了 SSLSocketClient 示例的代码片段,完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录下的 SSLSocketClient.java
文件中。(sslclient
目录中的 SSLClientServlet 示例是一个简单的 SSLClient 的 Servlet 包装示例。)
package examples.security.sslclient;
import java.io.*;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.SSLSocket;
import weblogic.security.SSL.HostnameVerifier;
import weblogic.security.SSL.SSLContext;
import weblogic.security.SSL.SSLSocketFactory;
import weblogic.security.SSL.TrustManager;
...
SSLContext sslCtx = SSLContext.getInstance("https");
File KeyStoreFile = new File ("mykeystore");
...
// 打开密钥库、检索私钥和证书链
KeyStore ks = KeyStore.getInstance("jks");
ks.load(new FileInputStream("mykeystore"), null);
PrivateKey key = (PrivateKey)ks.getKey("mykey",
"testkey".toCharArray());
Certificate [] certChain = ks.getCertificateChain("mykey");
sslCtx.loadLocalIdentity(certChain, key);
HostnameVerifier hVerifier = null;
if (argv.length < 3)
hVerifier = new NulledHostnameVerifier();
else
hVerifier = (HostnameVerifier)
Class.forName(argv[2]).newInstance();
sslCtx.setHostnameVerifier(hVerifier);
TrustManager tManager = new NulledTrustManager();
sslCtx.setTrustManager(tManager);
System.out.println(" Creating new SSLSocketFactory with SSLContext");
SSLSocketFactory sslSF = (SSLSocketFactory)
sslCtx.getSocketFactory();
System.out.println(" Creating and opening new SSLSocket with
SSLSocketFactory");
// 使用 createSocket(String hostname, int port)
SSLSocket sslSock = (SSLSocket) sslSF.createSocket(argv[0],
new Integer(argv[1]).intValue());
System.out.println(" SSLSocket created");
HandshakeCompletedListener mListener = null;
mListener = new MyListener();
sslSock.addHandshakeCompletedListener(new MyListener());
...
在使用证书身份验证时,WebLogic Server 会将数字证书发送到请求客户端。客户端将检查数字证书,以确保其可信、未过期,并且与提供它的 WebLogic Server 实例相匹配。
使用双向 SSL 身份验证(一种相互身份验证的方式)时,请求客户端也需要向 WebLogic Server 提供数字证书。如果将 WebLogic Server 的实例配置为双向 SSL 身份验证,则请求客户端需要提供来自指定的一组证书颁发机构的数字证书。WebLogic Server 只接受由可信证书颁发机构签名的数字证书。
有关如何配置双向 SSL 身份验证的 WebLogic Server 的信息,请参阅“确保 WebLogic Server 安全”中的配置 SSL。
下列部分描述了可在 WebLogic Server 中实现的几种不同的双向 SSL 身份验证方式。
在 Java 客户端中使用 JNDI 进行双向 SSL 身份验证时,请使用 WebLogic JNDI Environment
类的 setSSLClientCertificate()
方法。此方法可为客户端身份验证设置私钥和 X.509 数字证书链。
要将数字证书传送到 JNDI,请创建在包含 DER 编码数字证书的文件上打开的 InputStreams
数组,并在 JNDI 散列表中设置该数组。数组中的第一个元素必须包含在 Java 客户端的私钥文件上打开的 InputStream
。第二个元素必须包含在 Java 客户端的数字证书文件上打开的 InputStream
。(此文件包含 Java 客户端的公钥。)其他元素可能包含根证书颁发机构的数字证书,以及证书链中任何数字证书的签名者。如果某个数字证书不是直接由服务器的可信证书颁发机构发行的,则 WebLogic Server 可通过证书链对 Java 客户端的数字证书进行身份验证。
可以使用 weblogic.security.PEMInputStream 类读取存储在增强型私人邮件(Privacy Enhanced Mail,简称 PEM)文件中的数字证书。此类提供了可通过 PEM 文件对 Base64 编码证书进行解码的筛选器。
清单 5-4 说明了如何在 Java 客户端中使用双向 SSL 身份验证。
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import weblogic.jndi.Environment;
import weblogic.security.PEMInputStream;
import java.io.InputStream;
import java.io.FileInputStream;
public class SSLJNDIClient
{
public static void main(String[] args) throws Exception
{
Context context = null;
try {
Environment env = new Environment();
// 设置连接参数
env.setProviderUrl("t3s://localhost:7002");
// 如果您正在使用 UserNameMapper 接口,
// 那么下两个设置方法是可选的。
env.setSecurityPrincipal("system");
env.setSecurityCredentials("weblogic");
InputStream key = new FileInputStream("certs/demokey.pem");
InputStream cert = new FileInputStream("certs/democert.pem");
// 如果 key/cert 在文件中,那么包装输入流
key = new PEMInputStream(key);
cert = new PEMInputStream(cert);
env.setSSLClientCertificate(new InputStream[] { key, cert});
env.setInitialContextFactory(Environment.DEFAULT_INITIAL_CONTEXT_FACTORY);
context = env.getInitialContext();
Object myEJB = (Object) context.lookup("myEJB");
}
finally {
if (context != null) context.close();
}
}
}
调用 JNDI getInitialContext()
方法时,Java 客户端和 WebLogic Server 将执行相互身份验证,其方式与 Web 浏览器执行相互身份验证以获取安全 Web 服务器连接相同。如果不能验证数字证书,或不能在默认(活动)安全领域中对 Java 客户端的数字证书进行身份验证,将引发异常。通过身份验证的用户对象存储在 Java 客户端的服务器线程上,并用于检查可控制 Java 客户端访问任何受保护 WebLogic 资源的权限。
在使用 WebLogic JNDI Environment
类时,必须为对 getInitialContext()
方法的每个调用新建一个 Environment
对象。指定 User
对象和安全凭据后,用户及其关联凭据都将保持 Environment
对象中的设置。如果尝试重新设置它们,然后调用 JNDI getInitialContext()
方法,则将使用初始的用户和凭据。
在 Java 客户端中使用双向 SSL 身份验证时,WebLogic Server 将获取每个客户端 JVM 的唯一 Java 虚拟机 (JVM) ID,以便 Java 客户端和 WebLogic Server 之间的连接始终不变。除非连接由于没有活动而超时,只要 Java 客户端的 JVM 继续执行,连接就会持续存在。Java 客户端能够可靠地协商新 SSL 连接的惟一方法是停止其 JVM,并运行 JVM 的其他实例。
清单 5-4, 使用 JNDI 的双向身份验证客户端示例 中的代码可生成对实现 weblogic.security.providers.authentication.UserNameMapper
接口的 WebLogic 标识声明提供程序的调用。如果数字证书有效,则实现 UserNameMapper
接口的类将返回用户对象。WebLogic Server 将此通过身份验证的用户对象存储在 WebLogic Server 中 Java 客户端的线程上,在线程尝试使用受默认(活动)安全领域保护的 WebLogic 资源时,此用户对象将用于后续授权请求。
注意: | CLASSPATH 必须指定 weblogic.security.providers.authentication.UserNameMapper 接口的实现。 |
如果您尚未配置可执行基于证书的身份验证的标识声明提供程序,则通过新建 JNDI InitialContext
,并在 JNDI SECURITY_PRINCIPAL
和 SECURITY_CREDENTIALS
属性中提供新用户名和密码,在具有 SSL 连接的 JVM 中运行的 Java 客户端便可更改 WebLogic Server 用户标识。在进行 SSL 连接后,不使用由 Java 客户端传递的任何数据证书。新 WebLogic Server 用户可继续使用与初始用户的数字证书协商的 SSL 连接。
如果您已经配置了执行基于证书的身份验证的标识声明提供程序,WebLogic Server 将把数据证书从 Java 客户端传递到实现 UserNameMapper
接口的类,UserNameMapper
类可将数字证书映射到 WebLogic Server 用户名。因此,如果要在使用基于证书的标识声明时设置新用户标识,将无法更改标识。这是因为对于每个 Environment
,只在 JVM 发出第一个连接请求时处理数字证书。
警告: | 限制:在使用双向 SSL 和 JNDI 时,不支持多个并发用户从单一客户端 JVM 登录到 WebLogic Server。如果多个登录在不同线程上执行,结果将无法确定,并可能导致一个用户的请求在其他用户的登录上执行,从而使某个用户可以访问其他用户的数据。WebLogic Server 不支持来自单一客户端 JVM 的多个基于证书的并发登录。有关 JNDI 上下文和线程,以及如何避免潜在的 JNDI 上下文问题的信息,请参阅“WebLogic JNDI 编程”中的 JNDI 上下文和线程和如何避免潜在的 JNDI 上下文问题。 |
在使用双向 SSL 时,WebLogic Server 在建立 SSL 连接时可验证 Web 浏览器或 Java 客户端的数字证书。但是,数字证书不会将 Web 浏览器或 Java 客户端标识为 WebLogic Server 安全领域中的用户。如果 Web 浏览器或 Java 客户端请求受安全策略保护的 WebLogic Server 资源,则 WebLogic Server 需要 Web 浏览器或 Java 客户端具有标识。为了处理此要求,WebLogic 标识声明提供程序允许启用用户名映射器,此映射器可将 Web 浏览器或 Java 客户端的数字证书映射到 WebLogic Server 安全领域中的用户。用户名映射器必须是 weblogic.security.providers.authentication.UserNameMapper
接口的实现。
可以选择使用 weblogic.security.providers.authentication.UserNameMapper
接口的默认实现 DefaultUserNameMapperImpl
,或开发自己的实现。
WebLogic 标识声明提供程序可为下列类型的标识声明标记类型调用 UserNameMapper
接口的实现:
如果您需要映射不同类型的证书,请编写自己的 UserNameMapper
接口实现。
要实现可将数字证书映射到用户名的 UserNameMapper
接口,请编写可执行下列操作的 UserNameMapper
类:
可以在服务器到服务器通信中使用双向 SSL 身份验证,在此通信中其中一个 WebLogic Server 实例充当另一个 WebLogic Server 实例的客户端。通过在服务器到服务器通信中使用双向 SSL 身份验证,即使没有更常用的客户端/服务器环境,您也可以拥有可靠的、高度安全的连接。
清单 5-5 显示了如何建立从在某个 WebLogic Server 实例中运行的 servlet,到第二个称为 server2.weblogic.com
的 WebLogic Server 实例的安全连接示例。
FileInputStream [] f = new FileInputStream[3];
f[0]= new FileInputStream("demokey.pem");
f[1]= new FileInputStream("democert.pem");
f[2]= new FileInputStream("ca.pem");
Environment e = new Environment ();
e.setProviderURL("t3s://server2.weblogic.com:443");
e.setSSLClientCertificate(f);
e.setSSLServerName("server2.weblogic.com");
e.setSSLRootCAFingerprints("ac45e2d1ce492252acc27ee5c345ef26");
e.setInitialContextFactory
("weblogic.jndi.WLInitialContextFactory");
Context ctx = new InitialContext(e.getProperties())
在清单 5-5 中,WebLogic JNDI Environment
类创建的散列表用于存储下列参数:
setProviderURL
- 指定充当 SSL 服务器的 WebLogic Server 实例的 URL。WebLogic Server 实例充当 SSL 客户端来调用此方法。URL 用于指定为在 SSL 协议上构建的 WebLogic Server 专用协议的 t3 协议。SSL 协议可保护两个 WebLogic Server 实例之间的连接和通信。setSSLClientCertificate
- 指定用于 SSL 连接的私钥和证书链。使用此方法可指定一个输入流数组,此数组由私钥(数组中的第一个输入流)以及 X.509 证书链(这构成了数组的剩余输入流)组成。证书链中的每份证书是链中位于它前面的证书的发行方。setSSLServerName
- 指定充当 SSL 服务器的 WebLogic Server 实例的名称。在 SSL 服务器将其数字证书提供给充当 SSL 客户端的 WebLogic Server 时,会将使用 setSSLServerName
方法指定的名称与此数字证书中的公用名称字段进行比较。为使主机名验证获得成功,这两个名称必须相匹配。此参数用于防止中间人攻击。setSSLRootCAFingerprint
- 指定可表示一组可信证书颁发机构的数字代码,从而基于可信证书指纹指定信任。从充当 SSL 服务器的 WebLogic Server 实例接收的证书链的根证书,必须与使用此方法指定的指纹之一匹配,才能达到可信的目的。此参数用于防止中间人攻击。它提供了附加的默认信任级别,此级别对于在 WebLogic Server 上运行的客户端而言,是由 WebLogic Server 信任配置指定的。 注意: | 有关 JNDI 上下文和线程,以及如何避免潜在的 JNDI 上下文问题的信息,请参阅“WebLogic JNDI 编程”中的 JNDI 上下文和线程和如何避免潜在的 JNDI 上下文问题。 |
要在某个 Servlet(或其他任何服务器端 Java 类)中对 Java 客户端进行身份验证,必须检查客户端是否提供一份数字证书,如果是,检查此证书是否由可信的证书颁发机构发行。Servlet 开发人员负责询问 Java 客户端是否拥有有效的数字证书。在使用 WebLogic Servlet API 开发 Servlet 时,必须通过 HTTPServletRequest
对象的 getAttribute()
方法访问有关 SSL 连接的信息。
WebLogic Server Servlet 中支持下列特性:
javax.servlet.request.X509Certificate
java.security.cert.X509Certificate []
- 可返回一组 X.509 证书。 javax.servlet.request.cipher_suite
- 可返回 HTTPS 使用的表示密码组的字符串。javax.servlet.request.key_size
- 可返回一个整数(0、40、56、128、168),此整数表示对称(批量加密)密钥算法的位大小。 weblogic.servlet.request.SSLSession
javax.net.ssl.SSLSession
-可返回 SSL 会话对象,此对象包含创建和最后使用对象的密码组和日期。 您有权访问数字证书中定义的用户信息。在您获取 javax.servlet.request.X509Certificate
特性时,它是 java.security.cert.X509Certificate
类型的数组。您只需将数组转换为此类型,并检查证书。
主机名验证器可验证进行 SSL 连接的主机是预定方还是授权方。如果 WebLogic 客户端或 WebLogic Server 实例充当另一个应用服务器的 SSL 客户端,则主机名验证器非常有用。它帮助防止中间人攻击。
注意: | 示范数字证书是在安装期间生成的,以便其包含安装 WebLogic Server 软件的系统的主机名。因此,在使用示范证书进行开发和测试时应保留主机名验证。 |
在默认情况下,作为 SSL 握手的一项功能,WebLogic Server 会将 SSL 服务器证书主题 DN 的 CN 字段与用于连接到服务器的 URL 中的主机名进行比较。如果这些名称不匹配,则删除此 SSL 连接。
删除 SSL 连接是由 SSL 客户端引起的,此客户端可根据服务器的数字证书对服务器的主机名进行验证。如果需要除默认行为之外的行为,可以关闭主机名验证,或注册自定义主机名验证器。关闭主机名验证将使 SSL 连接容易受到中间人的攻击。
您可以编写自定义主机名验证器。weblogic.security.SSL.HostnameVerifier
接口提供了回调机制,以便此接口的实施者能够提供是否允许连接到 URL 的主机名的策略。此策略可以基于证书,也可以取决于其他身份验证方案。
要使用自定义主机名验证器,请创建可实现 weblogic.security.SSL.HostnameVerifier
接口的类,并定义可捕获服务器安全标识信息的方法。
注意: | 此接口采用新样式证书并将替换已不再使用的 weblogic.security.SSL.HostnameVerifierJSSE 接口。 |
在可以使用自定义主机名验证器之前,需要使用下列方式实现指定实现的类:
清单 5-6 显示了 NulledHostnameVerifier 示例的代码片断;完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录下的 NulledHostnameVerifier.java
文件中。此代码示例包含始终返回比较结果为 true 的 NulledHostnameVerifier
类。通过此示例,WebLogic SSL 客户端可以连接到任何 SSL 服务器,无论服务器的主机名和数字证书 SubjectDN 的比较结果如何。
public class NulledHostnameVerifier implements
weblogic.security.SSL.HostnameVerifier {
public boolean verify(String urlHostname, javax.net.ssl.SSLSession session) {
return true;
}
}
weblogic.security.SSL.TrustManager
接口提供执行以下功能:
注意: | 此接口采用新样式证书并将替换已不再使用的 weblogic.security.SSL.TrustManagerJSSE 接口。 |
当 SSL 客户端连接到 WebLogic Server 实例时,服务器会将其数字证书链提供给客户端以进行身份验证此链可能包含无效的数字证书。SSL 规范中规定在发现无效证书时,客户端应该删除 SSL 连接。可以使用 TrustManager
接口的自定义实现,来控制何时继续或中断 SSL 握手。使用信任管理器可以忽略某些验证错误,还可以根据需要执行验证检查,然后决定是否继续握手。
可使用 weblogic.security.SSL.TrustManager
接口创建信任管理器。此接口包含一组证书验证的错误代码。也可以对对等方证书执行其他验证,并根据需要中断 SSL 握手。在验证数字证书后,weblogic.security.SSL.TrustManager
接口将使用回调功能替换数字证书的验证结果。可以通过 setTrustManager()
方法将信任管理器的实例与 SSL 上下文相关联。
您只能以编程方式设置信任管理器;不能通过管理控制台或在命令行上定义其用法。
注意: | 使用信任管理器可能会影响性能,具体取决于所执行的检查。 |
清单 5-7 显示了 NulledTrustManager 示例的代码片断;完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录下的 NulledTrustManager.java
文件。SSLSocketClient 示例使用自定义信任管理器。SSLSocketClient 显示了如何通过使用带信任管理器的 SSL 上下文设置新的 SSL 连接。
package examples.security.sslclient;
import weblogic.security.SSL.TrustManager;
import java.security.cert.X509Certificate;
...
public class NulledTrustManager implements TrustManager{
public boolean certificateCallback(X509Certificate[] o, int validateErr) {
System.out.println(" --- Do Not Use In Production ---\n" +
" By using this NulledTrustManager, the trust in" +
" the server's identity is completely lost.\n" + " --------------------------------");
for (int i=0; i<o.length; i++)
System.out.println(" certificate " + i + " -- " + o[i].toString());
return true;
}
}
CertPathTrustManager weblogic.security.SSL.CertPathTrustManager
利用默认安全领域的已配置证书路径验证提供程序执行附加验证(例如撤销检查)。
默认情况下,服务器中使用出站 SSL 的应用程序代码只能访问内置的 SSL 证书验证。但是,应用程序代码可以指定 CertPathTrustManager,以便访问管理员已经为服务器配置的任何其他证书验证。如果想要应用程序代码也能运行证书路径验证器,则应用程序代码应使用 CertPathTrustManager。
javax.net.ssl.HandshakeCompletedListener
接口定义了 SSL 客户端接收有关给定 SSL 连接上 SSL 协议握手完成的通知的方式。清单 5-8 显示了 MyListener 示例的代码片断;完整的示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录下的 MyListener.java
文件。
package examples.security.sslclient;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import javax.net.ssl.HandshakeCompletedListener;
import java.util.Hashtable;
import javax.net.ssl.SSLSession;
...
public class MyListener implements HandshakeCompletedListener
{
public void handshakeCompleted(javax.net.ssl.HandshakeCompletedEvent
event)
{
SSLSession session = event.getSession();
System.out.println("Handshake Completed with peer " +
session.getPeerHost());
System.out.println(" cipher: " + session.getCipherSuite());
Certificate[] certs = null;
try
{
certs = session.getPeerCertificates();
}
catch (SSLPeerUnverifiedException puv)
{
certs = null;
}
if (certs != null)
{
System.out.println(" peer certificates:");
for (int z=0; z<certs.length; z++)
System.out.println(" certs["+z+"]: " + certs[z]);
}
else
{
System.out.println("No peer certificates presented");
}
}
}
SSLContext
类用于以编程方式配置 SSL,并保留 SSL 会话信息。每个实例都可以使用将用于执行身份验证的密钥、证书链和可信 CA 证书进行配置。使用同一 SSLContext 创建,并用于连接到同一 SSL 服务器的 SSL 套接口可能重用 SSL 会话信息。是否实际重用会话信息取决于 SSL 服务器。
有关会话缓存的详细信息,请参阅“确保 WebLogic Server 安全”中的 SSL 会话行为。要将信任管理器类的实例与其 SSL 上下文相关联,请使用 weblogic.security.SSL.SSLContext.setTrustManager()
方法。
只能以编程方式设置 SSL 上下文;不能使用管理控制台或命令行进行设置。Java new
表达式或 SSLContext
类的 getInstance()
方法可以创建 SSLContext
对象。getInstance()
方法是静态的,它可生成实现指定的安全套接口协议的新 SSLContext
对象。 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录中的 SSLSocketClient.java
示例提供了使用 SSLContext
类的示例。SSLSocketClient 示例显示了如何新建将使用 SSLContext
新建 SSL 套接口的 SSL 套接口工厂。
清单 5-9 显示了使用 getInstance()
方法进行实例化的示例。
import weblogic.security.SSL.SSLContext;
SSLcontext sslctx = SSLContext.getInstance ("https")
可以使用 URL
对象执行从充当客户端的某个 WebLogic Server 实例到另一个 WebLogic Server 实例的出站 SSL 连接。WebLogic Server 支持出站 SSL 连接的单向和双向 SSL 身份验证。
对于单向 SSL 身份验证,可使用 java.net.URL
, java.net.URLConnection
和 java.net.HTTPURLConnection
类通过使用 URL
对象进行出站 SSL 连接。清单 5-10 显示了同时支持 HTTP 和 HTTPS URL 且仅使用这些 Java 类(即不需要 WebLogic 类) simpleURL
的类。要在 WebLogic Server 上为单向 SSL 身份验证 (HTTPS) 使用 simpleURL
类,只需在系统属性中为 java.protocols.handler.pkgs
定义“weblogic.net
”即可。
注意: | 因为清单 5-10 中显示的 simpleURL 示例默认会执行信任和主机名检查,所以此示例需要连接到默认情况下可信并且会传递主机名检查的真正 Web 服务器。否则,必须在命令行上替换信任和主机名检查。 |
import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
import java.io.IOException;
public class simpleURL
{
public static void main (String [] argv)
{
if (argv.length != 1)
{
System.out.println("Please provide a URL to connect to");
System.exit(-1);
}
setupHandler();
connectToURL(argv[0]);
}
private static void setupHandler()
{
java.util.Properties p = System.getProperties();
String s = p.getProperty("java.protocol.handler.pkgs");
if (s == null)
s = "weblogic.net";
else if (s.indexOf("weblogic.net") == -1)
s += "|weblogic.net";
p.put("java.protocol.handler.pkgs", s);
System.setProperties(p);
}
private static void connectToURL(String theURLSpec)
{
try
{
URL theURL = new URL(theURLSpec);
URLConnection urlConnection = theURL.openConnection();
HttpURLConnection connection = null;
if (!(urlConnection instanceof HttpURLConnection))
{
System.out.println("The URL is not using HTTP/HTTPS: " +
theURLSpec);
return;
}
connection = (HttpURLConnection) urlConnection;
connection.connect();
String responseStr = "\t\t" +
connection.getResponseCode() + " -- " +
connection.getResponseMessage() + "\n\t\t" +
connection.getContent().getClass().getName() + "\n";
connection.disconnect();
System.out.println(responseStr);
}
catch (IOException ioe)
{
System.out.println("Failure processing URL: " + theURLSpec);
ioe.printStackTrace();
}
}
}
对于双向 SSL 身份验证,weblogic.net.http.HttpsURLConnection
类为客户端提供了一种指定安全上下文信息(包括客户端的数字证书和私钥)的方法。此类的实例表示到远程对象的 HTTPS 连接。
SSLClient 示例代码演示了使用 WebLogic URL
对象执行出站 SSL 连接(请参阅清单 5-11)。清单 5-11 中显示的代码示例摘自 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录中的 SSLClient.java
文件。
wlsUrl = new URL("https", host, Integer.valueOf(sport).intValue(),
query);
weblogic.net.http.HttpsURLConnection sconnection =
new weblogic.net.http.HttpsURLConnection(wlsUrl);
...
InputStream [] ins = new InputStream[2];
ins[0] = new FileInputStream("clientkey.pem");
ins[1] = new FileInputStream("client2certs.pem");
String pwd = "clientkey";
sconnection.loadLocalIdentity(ins[0], ins[1], pwd.toCharArray());
完整工作的 SSL 身份验证示例与 WebLogic Server 产品一起提供。此示例位于 SAMPLES_HOME\server\examples\src\examples\security\sslclient
目录。有关此示例的描述,以及如何生成、配置和运行此示例的说明,请参阅示例目录中的 package.html
文件。可以修改此代码示例,然后重新使用。
http://edocs.weblogicfans.net/wls/docs92/security/SSL_client.html
联系客服