我已经com.sun.net.httpserver.HttpsServer
为SOAP Web服务开发了Java 7 HTTPS服务器(我使用)(主要受此SO Answer的影响),不同之处在于该服务器设置为需要客户端身份验证。这是我使用的服务器的配置代码:
final InetSocketAddress address = new InetSocketAddress( localhost, 8888 );
this.httpsServer = HttpsServer.create( address, 0 );
// ... KeyStore configuration ...
// configure the HTTPS server
this.httpsServer.setHttpsConfigurator( new HttpsConfigurator( sslContext )
{
@Override
public void configure(final HttpsParameters params)
{
try
{
// initialize the SSL context
final SSLContext c = SSLContext.getDefault();
final SSLEngine engine = c.createSSLEngine();
params.setNeedClientAuth( true );
params.setCipherSuites( engine.getEnabledCipherSuites() );
params.setProtocols( engine.getEnabledProtocols() );
// get the default parameters
final SSLParameters defaultSSLParameters = c.getDefaultSSLParameters();
params.setSSLParameters( defaultSSLParameters );
}
catch ( final Exception e )
{
LOG.error( ExceptionUtils.getStackTrace( e ) );
}
}
} );
但是,在与客户端建立连接后,我注意到没有强制执行客户端身份验证!我目前正在使用自签名证书在localhost上进行测试,但似乎任何客户端都可以连接。我使用SoapUI(未配置为将任何证书发送到我的Knowlegde)以及带有和不带有证书的客户端模式下的openssl进行测试。
openssl s_client -cert client.pem -connect localhost:8888 -debug
openssl s_client -connect localhost:8888 -debug
我已经使用java选项启动了服务器,-Djavax.net.debug=all
但是没有看到指示客户端身份验证或客户端应出示其证书的任何相关部分。我看到客户端确实验证了服务器的证书!
我想拒绝所有没有出示有效证书的客户。我怎样才能做到这一点?
经过很长时间的搜索后,我注意到的configure(..)
方法HttpsConfigurator
是错误的。我没有SSLParameters
正确设置!
它看起来应该像这样:
@Override
public void configure(final HttpsParameters params)
{
try
{
final SSLParameters sslParams = getSSLContext().getDefaultSSLParameters();
final SSLEngine sslEngine = getSSLContext().createSSLEngine();
sslParams.setNeedClientAuth( true );
sslParams.setCipherSuites( sslEngine.getEnabledCipherSuites() );
sslParams.setProtocols( sslEngine.getEnabledProtocols() );
params.setSSLParameters( sslParams );
}
catch ( final Exception e )
{
LOG.error( ExceptionUtils.getStackTrace( e ) );
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句