有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaHTTPS服务器:相互SSL身份验证

我已经为soapweb服务(主要受this SO answer影响)开发了一个java7https服务器(我使用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 ) );
      }
   }
} );

但是,在从客户端连接时,我注意到客户端身份验证并没有强制执行!我目前正在使用自签名证书在本地主机上进行测试,但似乎任何客户端都可以连接。我使用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) 个答案

  1. # 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 ) );
       }
    }