ブラウザと私のJavaサーバーとのクライアント/サーバーSSL接続を確立しますか?

私はHttpsServer/Clientを作成して、ブラウザーからサーバーへのトラフィックを調べるプロキシーを作成できるようにしようとしています。これらのタイプのツールは、Webアプリケーションのセキュリティをテストする人にとって非常に重要です。私は、httpclientを使用して自分のサーバーの要求とhttpcoreコンポーネントを送信することに決めました。現時点では、私は単にポート8080上のブラウザとサーバー間のSSLソケット接続を確立しようとしています。私はすべてを読んだが、これを動作させることはできないようです。ここまで私がやったステップは次のとおりです:

  1. Created a CA cert with keytool and added it to file called
    cacerts

  2. I added this cert to the firefox browser instance listening on
    port 8080

  3. In my code i do the following to call that cert in the server
    code

        KeyStore ks = KeyStore.getInstance("JKS");  
        ks.load(new FileInputStream("C:\Program Files\Java\jre6\bin\cacerts"), "password".toCharArray());
    
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, "password".toCharArray());
    
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(kmf.getKeyManagers(), null, null);
    
    
        ServerSocketFactory ssocketFactory = SSLServerSocketFactory.getDefault();
        serversocket = ssocketFactory.createServerSocket(port);
    

次に、私が次のようにソケットのacceptを呼び出すと、次のような例外が発生します。

I/O error initialising connection thread: No available certificate or key corresponds    to the SSL cipher suites which are enabled.
 javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL     cipher suites which are enabled.
 at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.checkEnabledSuites(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.accept(Unknown Source)
at DefaultHttpServer$RequestListenerThread.run(DefaultHttpServer.java:151) 

例外をスローする行は次のとおりです。

   Socket socket = serversocket.accept(); 

私がここで間違っていることに関するアイデアは?ちょうど8080ポートとのSSLソケット接続を確立しようとすると、ブラウザはその要求を送信しています。

11/13更新

これまでのところあなたの情報をいくつか取り上げ、別のキーストアファイルを作成しました。これは私がやったことです

C:UsersSteve>keytool -genkey -alias serverprivkey -keystore privateKey.store

次に、このファイルprivateKey.storeを私のユーザディレクトリからプロジェクトフォルダにコピーし、コードに以下の変更を加えました:

        KeyStore ks = KeyStore.getInstance("JKS");  
        ks.load(new FileInputStream("privateKey.store"), "pass123".toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, "pass123".toCharArray());

パスワードが間違っていると例外が発生するため、ファイルを正しく取得していることが分かります。しかし、私はまだ同じ例外を取得しています。どのようなアイデアを次に試すの?

privateKey.storeの内部には次のものがあります:

 C:UsersSteve>keytool -list -v -keystore privateKey.store
Enter keystore password:

Keystore type: JKS
 Keystore provider: SUN

Your keystore contains 1 entry

Alias name: serverprivkey
Creation date: Nov 13, 2011
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=sven rbera, OU=application developement, O=whs, L=san hjose, ST=
 ca, C=ca
 Issuer: CN=sven rbera, OU=application developement, O=whs, L=san hjose, ST
 =ca, C=ca
 Serial number: 4ec00a18
 Valid from: Sun Nov 13 10:19:04 PST 2011 until: Sat Feb 11 10:19:04 PST 2012
 Certificate fingerprints:
     MD5:  9C:A7:2B:CE:DC:AD:5B:9C:D6:B7:71:6C:EC:91:8A:24
     SHA1: 47:8F:9B:A2:E1:31:A5:D9:F6:71:8A:CA:3F:CB:BA:FC:C7:2D:F5:A8
     Signature algorithm name: SHA1withDSA
     Version: 3


前述のようにRSAを使用するようにキーを変更しました。さらに、私はSSL用のデバッグフラグを追加し、それを利用可能にしました。ちょっと難解ですが、serverprivkey2のキーが見つかったようです。それから、それはtrustStoreに入ります、そして、私はそれが私から来たように見える何もそのリストに見ません。私は本当にその部分に何が見えるはずなのか分からない。何か案は?

            ***
            found key for : serverprivkey2
            chain [0] = [
            [
              Version: V3
              Subject: CN=steve, OU=labarbera, O=whs, L=sj, ST=ca, C=ca
              Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

              Key:  Sun RSA public key, 1024 bits
              modulus: 140985119594686674696976228136679950023710897166974487014150510574037897724033913877362573524361519470364814271848450916151017718803985253447854099124509296799994400199293690731598145912452994962103007955337967369473821653235218532303270695076070736956288068926075705380732910518314547899958542901647381772169
              public exponent: 65537
              Validity: [From: Sun Nov 13 14:45:44 PST 2011,
                           To: Sat Feb 11 14:45:44 PST 2012]
              Issuer: CN=steve, OU=labarbera, O=whs, L=sj, ST=ca, C=ca
              SerialNumber: [    4ec04898]

            ]
              Algorithm: [SHA1withRSA]
              Signature:
            0000: C8 81 37 74 E9 7C A4 76   9F FD EC 8A 78 69 F2 A4  ..7t...v....xi..
            0010: 64 1E C9 98 FD 99 FB 48   3D E2 C5 C5 EB A3 34 1B  d......H=.....4.
            0020: 7C BE B3 E4 F7 4D 90 F1   AB A6 4D 36 97 95 9B 95  .....M....M6....
            0030: 90 C1 B9 28 9C DE A0 4A   AD C7 10 8F 06 57 A6 2B  ...(...J.....W.+
            0040: 51 45 63 73 ED 1E AF 5F   61 E2 87 1A 7C CD 4E 3F  QEcs..._a.....N?
            0050: A7 18 15 FA 73 94 58 46   62 46 42 F9 31 12 2F C7  ....s.XFbFB.1./.
            0060: 6E 6E A0 3F 17 FA A8 24   FC 68 83 88 E2 23 EF DE  nn.?...$.h...#..
            0070: E9 F5 58 AB 16 19 1B 82   72 C6 A0 A7 7E 41 36 1C  ..X.....r....A6.

            ]
            ***

trustStore is: C:Program FilesJavajre6libsecuritycacerts
trustStore type is : jks
trustStore provider is : 
init truststore
adding as trusted cert:
... bunch certs none of which look familiar?
ベストアンサー

1. keytoolを使用してCA証明書を作成し、cacertsというファイルに追加しました。

I can not understand what you did here.
Did you create a public/private key pair and stored it to
cacerts keystore?
You should not have done that.
cacerts is meant to be used as a
truststore and not as a keystore.

新しいキーストアを作成して、使用する KeyManager
用のキーストアをロードしておく必要があります。

例外はあいまいです。
cacerts
で秘密鍵を見つけることができないか、これは選択したエイリアスに関連しているか、証明書に暗号化に使用する適切な拡張子がありません。

エイリアスの問題が最も可能性が高いと思います。

私はこれをデバッグしようとしないと思います。
代わりに、サーバー用に個別のキーストアを作成し、代わりにロードします。
cacert は使わないでください。

UPDATE:keytoolコマンドのキーアルゴリズムとして RSA
を使用するようにしてください

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です