2017-11-18 26 views
1

私の目標:私はJetty Embeddedの統合を進めており、使いやすくなっています。 interfaceは、とりわけ、Java KeyStoreを使用せずに、TLS証明書の外部ソースの統合を可能にします。JKSを使用しない埋め込みJettyのTLS

これにより、分散型Webサービス(私の場合はexperimental, self-hosted CDN)を構築する際の柔軟性が向上します。

ただし、統合の構築に問題があります。スタブの実装はin this repositoryです。

私が試したこと:key managertrust managerを置き換えて、その中のすべての機能にブレークポイントを設定しようとしました。ただし、サーバーにアクセスしようとすると、これらのブレークポイントは決してトリガーされません。代わりに、私はこのエラーに遭遇しています:

javax.net.ssl.SSLHandshakeException: no cipher suites in common 
    at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1478) 
    at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:535) 
    at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:813) 
    at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781) 
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) 
    at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.fill(SslConnection.java:621) 
    at org.eclipse.jetty.server.HttpConnection.fillRequestBuffer(HttpConnection.java:322) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:231) 
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279) 
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:112) 
    at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:261) 
    at org.eclipse.jetty.io.ssl.SslConnection$3.succeeded(SslConnection.java:150) 
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:112) 
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590) 
    at java.lang.Thread.run(Thread.java:748) 

私は、しかし、多くの幸運なしで、キーストアから証明書を「標準」突堤のセットアップを分析しようとしています。私は、Jettyが上書きすべき暗号/証明書情報を取得しているところを見つけられません。

私の質問 JettyにJava KeyStoreとTrustStoreの代わりにmy own certificate sourceを使用させるにはどうすればよいですか?

+1

この例外は通常、サーバーが秘密キーと一致する証明書を見つけられなかったことを意味します。明らかに 'KeyManager'が正しくインストールされていないか、またはこれより前に呼び出されていたはずです。 – EJP

+0

ありがとうございます、私はキーマネジャが "在庫"バージョンにどのようにインストールされているかを自分のものと比較して追跡しようとします。 – Janoszen

答えて

0

@EJPが正しい方向に私を指摘したので、ここでそれを行う方法は次のとおりです。

ここでそれが行われる必要がある方法です。 TLS用の桟橋を設定

まず、:

HttpConfiguration https = new HttpConfiguration(); 
https.addCustomizer(new SecureRequestCustomizer()); 
SslContextFactory sslContextFactory = new JettySslContextFactory(configuration.getSslProviders()); 
ServerConnector sslConnector = new ServerConnector(
    server, 
    new SslConnectionFactory(sslContextFactory, "http/1.1"), 
    new HttpConnectionFactory(https) 
); 
sslConnector.setPort(httpsPort); 

注クラスJettySslContextFactory。それに加えて

@Override 
protected KeyManager[] getKeyManagers(KeyStore keyStore) throws Exception { 
    return new KeyManager[] { 
     new JettyX509ExtendedKeyManager(certificateProviders) 
    }; 
} 

、次の手順は、すべての接続で実行されています:

このクラスは、このように、X509ExtendedKeyManagerを内蔵しており、カスタムのKeyManager提供するために protected KeyManager[] getKeyManagers(KeyStore keyStore) throws Exceptionメソッドをオーバーライドする必要が拡張します
  1. SNIマッチャーは、SNIホスト名と相談します。これは、SNIホスト名が利用可能な唯一の場所であるようです。
  2. 特定のキータイプ(ECまたはRSA)のエイリアス(キーIDのソート)を取得するには、キーマネージャーを参照してください。ここでは、SNIマッチャーからホスト名を取得する必要があります。そうしないと、一致するホスト名がわからないためです。
  3. エイリアス(キーID)に基づいて、秘密鍵と証明書を返すことができます。

これは少なくとも私がこの問題のデバッグから集めたものです。完全なコードis online here

関連する問題