Установить клиент / сервер SSL-соединение с браузером и моим сервером Java? - PullRequest
0 голосов
/ 13 ноября 2011

Я пытаюсь создать HttpsServer / Client, чтобы я мог создать прокси-сервер для проверки трафика, поступающего из браузера на сервер.Эти типы инструментов неоценимы для людей, которые проверяют безопасность веб-приложений.Я решил использовать httpclient для отправки запросов и компонентов httpcore для моего сервера.В данный момент я просто пытаюсь установить соединение через ssl-сокет между браузером и сервером через порт 8080. Я прочитал все до конца и до сих пор не могу заставить это работать.Вот шаги, которые я сделал до этого момента:

  1. Создал сертификат CA с помощью keytool и добавил его в файл с именем cacerts

  2. Я добавилэтот сертификат для экземпляра браузера Firefox, прослушивающего порт 8080

  3. В моем коде я делаю следующее, чтобы вызвать этот сертификат в коде сервера

        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(); 

Любые идеи о том, чтоя здесь не так делаю?Просто пытаясь установить соединение через сокет ssl с портом 8080, на который браузер отправляет свои запросы.

Обновление 11/13

Пока я взял некоторые ваши данные и пошел создавать отдельныйфайл хранилища ключей.Это то, что я сделал

C:\Users\Steve>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());

Iзнаю, что этот файл правильно захватывает, потому что, если пароли неверны, я получаю исключения.Тем не менее, я все еще получаю то же исключение.Любые идеи, что попробовать дальше?

Вот что находится внутри privateKey.store:

 C:\Users\Steve>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 Files\Java\jre6\lib\security\cacerts
trustStore type is : jks
trustStore provider is : 
init truststore
adding as trusted cert:
... bunch certs none of which look familiar?

Ответы [ 3 ]

1 голос
/ 13 ноября 2011

1.Создал сертификат CA с помощью keytool и добавил его в файл cacerts

Я не могу понять, что вы здесь сделали.
Вы создали пару открытых / закрытых ключей и сохранили ее в cacerts хранилище ключей?
Тебе не следовало этого делать.
cacerts предназначен для использования в качестве хранилища доверенных сертификатов , а не в качестве хранилища ключей.

Вы должны были создать новое хранилище ключей и загрузить его для использования KeyManager.

Исключение неоднозначно.
Либо он не может найти закрытый ключ в cacerts, и это может быть связано с выбранным псевдонимом, либо сертификат не имеет надлежащих расширений, которые будут использоваться для шифрования. Я считаю, что проблема с псевдонимами является наиболее вероятной.

Я рекомендую не пытаться отлаживать это.
Вместо этого создайте отдельное хранилище ключей для вашего сервера и загрузите его.
Не используйте cacert.

ОБНОВЛЕНИЕ: убедитесь, что вы используете RSA в качестве алгоритма ключа в команде keytool

0 голосов
/ 13 ноября 2011

Я обычно ожидал бы найти кадры в "C: \ Program Files \ Java \ jre6 \ lib \ security"Ваша программа ищет его в "C: \ Program Files \ Java \ jre6 \ bin".

0 голосов
/ 13 ноября 2011

Стив, вам не нужно изобретать велосипед, если вам просто нужно изучить движение. Для отслеживания трафика используйте один из уже доступных прокси-серверов, таких как Paros.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...