2016-07-07 28 views
1

私は、SOAP認証Webサービス(主にthis SO answerの影響を受ける)用にJava認証用HTTPSサーバ(com.sun.net.httpserver.HttpsServerを使用)を開発しました。これは、私は、サーバーの構成コードを使用されていますJava HTTPSサーバ:相互SSL認証

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でサーバーを開始しているが、クライアント認証またはクライアントがその証明書を提示しなければならない要求を示す任意の適切な部分を見ていません。 私はクライアントが実際にサーバーの証明書を検証するのを見ます!

有効な証明書を提示していないクライアントを拒否したいとします。これどうやってするの?

+0

。以下のコード例を参照してください。http://stackoverflow.com/questions/36819113/how-to-require-client-certificate-with-com-sun-net-httpserver-httpsserver – Mike

+0

はい、このコードは関連性がないため省略されていますこの問題のために。 –

答えて

1

非常に長い検索の後、私はのconfigure(..)メソッドが間違っていることに気付きました。私はSSLParametersを正しく設定していませんでした!

それは次のようになります。私はあなたのキーストアsslContext.init(myKeyManagerFactory.getKeyManagers()、myTrustManagerFactory.getTrustManagers()、ヌル)でSSLContextの初期化表示されていない

@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)); 
    } 
} 
関連する問題