【问题标题】:Java HTTPS Server: Mutual SSL AuthenticationJava HTTPS 服务器:相互 SSL 身份验证
【发布时间】:2016-07-07 14:58:40
【问题描述】:

我为 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(我没有配置为向我的知识库发送任何证书)以及带和不带证书的客户端模式下的 openssl 进行测试。

openssl s_client -cert client.pem -connect localhost:8888 -debug
openssl s_client -connect localhost:8888 -debug

我已经使用 java 选项 -Djavax.net.debug=all 启动了服务器,但没有看到任何表明客户端身份验证或客户端应出示其证书的请求的相关部分。 我看到客户端确实验证了服务器的证书!

我想拒绝任何未出示有效证书的客户。我该怎么做?

【问题讨论】:

  • 我没有看到您使用密钥库初始化 SSLContext sslContext.init(myKeyManagerFactory.getKeyManagers(), myTrustManagerFactory.getTrustManagers(), null);请参阅此处的代码示例:stackoverflow.com/questions/36819113/…
  • 是的,这段代码被省略了,因为它与这个问题无关。

标签: java authentication ssl https


【解决方案1】:

经过很长时间的搜索,我注意到HttpsConfiguratorconfigure(..) 方法是错误的。我没有正确设置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 ) );
   }
}

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 2011-01-15
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多