2012-04-04 15 views
0

SSLサーバーとして動作する小さなアンドロイドアプリケーションを実装したいと思います。 正しい形式のキーストアで問題が発生した後、私はこれを解決して次のキーストアに入ります。SSLException:有効な暗号スイートをサポートするキーストアエントリが見つかりませんでした

キーストアファイルがキーストアクラスによって正しくロードされています。しかし、サーバーソケット(socket.accept())を開こうとすると、次のエラーが発生します。

javax.net.ssl.SSLException:有効な暗号スイートをサポートするキーストアエントリが見つかりませんでした。

私は、このコマンドを使用して、私のキーストアを生成:

のkeytool -genkey -keystore test.keystore -keyalg RSA -keypass ssltest -storepass ssltest -storetype BKS -provider org.bouncycastle.jce.provider。 BouncyCastleProvider -providerpath bcprov.jar

Java SE6の無制限強度管轄ポリシーは、私のjre6に適用されています。

私は非常に異なる組み合わせでlong listを印刷し

socket.getSupportedCipherSuites() 
を呼び出すことによってサポートされる暗号スイートのリストを得ました。しかし、私はサポートされているキーを取得する方法を知らない。 私もアンドロイドのデバッグキーストアをportecleを使ってBKSフォーマットに変換してみましたが、同じエラーが出ます。

暗号スイートのいずれかと互換性のある鍵をどのように生成することができますか?

バージョン情報:

targetSDK:

:4.0.3と私のテストアプリケーションの2.3.3
BounceCastle 1.46
portecle 1.7

コードを実行している実際のデバイスを実行しているエミュレータ上でテスト15

public class SSLTestActivity extends Activity implements Runnable { 
SSLServerSocket mServerSocket; 
ToggleButton tglBtn; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    this.tglBtn = (ToggleButton)findViewById(R.id.toggleButton1); 

    tglBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 
       new Thread(SSLTestActivity.this).run(); 
      } else { 
       try { 
        if (mServerSocket != null) 
         mServerSocket.close(); 
       } catch (IOException e) { 
        Log.e("SSLTestActivity", e.toString()); 
       } 
      } 
     } 
    }); 
} 

@Override 
public void run() { 
    try { 
     KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     keyStore.load(getAssets().open("test.keystore"), "ssltest".toCharArray()); 

     ServerSocketFactory socketFactory = SSLServerSocketFactory.getDefault(); 
     mServerSocket = (SSLServerSocket) socketFactory.createServerSocket(8080); 
     while (!mServerSocket.isClosed()) { 
      Socket client = mServerSocket.accept(); 
      PrintWriter output = new PrintWriter(client.getOutputStream(), true); 
      output.println("So long, and thanks for all the fish!"); 
      client.close(); 
     } 
    } catch (Exception e) { 
     Log.e("SSLTestActivity", e.toString()); 
    } 
} 
} 

答えて

2

キーストアは、それは暗号スイートをサポートするかどうかをキーストアまで本当にありませんが有効暗号スイート

をサポートしていません。それらをサポートするのはSSLSocket(またはエンジン)です。それが探しているのは、サポートされている暗号スイートの1つに適したキーストアのキーストアです。通常、有効な暗号スイートはRSAまたはDSSベースであるため、それぞれRSAまたはDSAキーが検索されます。次のコードで

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
keyStore.load(getAssets().open("test.keystore"), "ssltest".toCharArray()); 

ServerSocketFactory socketFactory = SSLServerSocketFactory.getDefault(); 
mServerSocket = (SSLServerSocket) socketFactory.createServerSocket(8080); 

あなたのkeyStoreで何もしていません。この場合、ロードしないこともできます(また、読み込んだ入力ストリームを常に閉じる必要があります)。

ここでは、特に設定していない(デフォルトのキーストアがない)デフォルトのSSLServerSocketFactoryを使用しています。これが原因で「」をサポートするキーストアエントリが見つかりませんでした有効な暗号スイート ":キーストアを見つけることさえできないため、適切なキーストアエントリを見つけることができません。

SSLContextを設定し、キーストアから構築したKeyManagerで初期化し、そこからサーバーソケットファクトリを取得する必要があります。

+0

ありがとうございます。 SSLContextを使用して問題を解決しました:) –

+0

ありがとうございました。 KeyManagersではなく、TrustManagersでのみ初期化されたSSLContextからSSLServerSocketFactoryを取得しようとしていたので、あらゆる種類のエラーが発生しました。あなたの説明とコードは本当に助けてくれました。 –

0

これはあなたのために遅すぎるかもしれないが、道に沿って他人のためになるかもしれない。作成した

のkeytool -genkey -keystore test.keystore -keyalg RSA -keypass ssltest -storepass ssltest -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov.jar

キーペアは成功し理論的にはうまくいくはずです。

鍵ペアの内容はわかりません。すべてをデフォルトとして残していれば(つまり、すべて入力してください)、CNの値は「不明」になります。私はテストのいくつかの繰り返しを実行し、それを確認します。 CN = Unknownはキーペアを正常に生成します(Keytool -listで確認できますが、SSLネゴシエーション中に失敗します)。セキュリティで保護された接続を確立するために必要な鍵が見つからないことがあります。ところで

File: C:\Users\James\Downloads\test.keystore 
    Type: BKS-V1 
    Provider: BC 
    Keys 
     None 
    Key Pairs 
     mykey 
      Last Modified: 07/Aug/2015 16:07:13 ICT 
      Private Key 
       Locked - unlock to get properties 
      Certificates 
       Unknown 
        Version: 3 
        Subject: CN=Unknown,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown 
        Issuer: CN=Unknown,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown 
        Serial Number: 5BA77D0F 
        Valid From: 07/Aug/2015 16:07:13 ICT 
        Valid Until: 05/Nov/2015 16:07:13 ICT 
        Public Key 
         Algorithm: RSA 
         Key Size: 2048 bits 
         Format: X.509 
         Encoded: 0x30820122300D06092A864886F70D01010105000382010F003082010A02820101009344283AD35606471D23D2F2B4DA61614C9A973932DF798DF66FE034C818BD6B0285BE860894FBD750180E2D668123442652D04BDFA6190CC28DBB2AA5EB657A428880428226D45F5B942AAB71FF05890FC4CD9A9F932F70E84A5CC118215E7FFE4C93FEFE46E8BD4B141D1742C790BACFF7B503230E263419A23BA3E8B4E7E0F4AECDF5082363AA86693502FFBAA3545F87AE7E462139CF666B35BF348CB5E61F2A62BEBA019F3C51021890A6D58093E91E6B807257DDF138BBB1044B8EB44A8F1E835A04B5EA3C53A7F024C805F28C1A28DFD12A2AC9A1335FD220AD247D951385756964DA1EDD804A13B42B6006554525954EEEBBCFD35FA0D81C93E0DEE50203010001 
         Public Exponent: 0x10001 
         Modulus: 0x9344283AD35606471D23D2F2B4DA61614C9A973932DF798DF66FE034C818BD6B0285BE860894FBD750180E2D668123442652D04BDFA6190CC28DBB2AA5EB657A428880428226D45F5B942AAB71FF05890FC4CD9A9F932F70E84A5CC118215E7FFE4C93FEFE46E8BD4B141D1742C790BACFF7B503230E263419A23BA3E8B4E7E0F4AECDF5082363AA86693502FFBAA3545F87AE7E462139CF666B35BF348CB5E61F2A62BEBA019F3C51021890A6D58093E91E6B807257DDF138BBB1044B8EB44A8F1E835A04B5EA3C53A7F024C805F28C1A28DFD12A2AC9A1335FD220AD247D951385756964DA1EDD804A13B42B6006554525954EEEBBCFD35FA0D81C93E0DEE5 
        Signature Algorithm: SHA256WITHRSA 
        MD5 Fingerprint: 47:F8:40:B9:05:71:CF:30:36:8D:B4:28:7D:FE:B7:6F 
        SHA-1 Fingerprint: 11:6F:A3:28:7F:87:97:E7:14:CE:63:A1:9D:09:85:CF:E4:7E:FE:E8 
    Trusted Certificates 
     None 

を(以下、上記の例外で失敗します):Windowsのdevに関する、あなたがキーツールと比較するとキーエクスプローラを検討する必要があります。 Keytoolよりも多くの機能を備えています。

関連する問題