Java HTTPS服务器:相互SSL身份验证

时间:2016-07-07 14:58:41

标签: java authentication ssl https

我为SOAP Web服务(主要受this SO answer影响)开发了Java 7 HTTPS服务器(我使用com.sun.net.httpserver.HttpsServer),区别在于服务器设置为需要客户端身份验证。这是我使用的服务器配置代码:

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启动了服务器,但没有看到任何指示客户端身份验证的相关部分或客户端应提供其证书的请求。 我看到客户确实验证了服务器的证书!

我想拒绝任何没有出示有效证书的客户。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

经过长时间的搜索,我发现configure(..)的{​​{1}}方法是错误的。我没有正确设置HttpsConfigurator

它应该是这样的:

SSLParameters