JSS SSLSocket проблема выбора сертификата клиента - PullRequest
3 голосов
/ 07 сентября 2011

Это кросс-пост от Mozilla Crypto Dev ML. Надеюсь, что кто-то на SO имеет некоторый опыт использования org.mozilla.jss. Ссылка: JSS - MDN

Я пытаюсь сделать два отдельных HTTPS-запроса к удаленному хосту, используя два клиентских сокета и два разных клиентских сертификата соответственно (клиентский сертификат A и B). Моя тестовая программа является модифицированной версией SSLTest.java

С моего хоста я могу сделать два соединения на двух разных сокетах с удаленным хостом. Я могу получить 200 OK обратно с удаленного веб-сервера для обоих отдельных подключений.

Моя проблема в том, что клиентский сертификат «A» используется для обоих соединений «A» и «B».

Я использовал этот конструктор:

public SSLSocket(java.lang.String host,int port, 
java.net.InetAddress localAddr, 
int localPort, 
SSLCertificateApprovalCallback certApprovalCallback, 
SSLClientCertificateSelectionCallback clientCertSelectionCallback)

Я также реализовал интерфейс SSLClientCertificateSelectionCallback ( source ), чтобы использовать вышеуказанный конструктор и передать правильный сертификат клиента. Кроме того, я поместил строку в мою реализованную функцию SSLClientCertificateSelectionCallback select(), чтобы регистрировать, когда обратный вызов выполнен.

При запуске моего приложения и проверке журнала метод select () вызывается только один раз при создании первого SSLSocket (выбор Client Cert 'A') и никогда в будущих экземплярах SSLSocket, когда указан псевдоним Client Cert B , На самом деле, я должен перезапустить свое приложение, чтобы select() снова запустился.

Есть ли способ запустить собственный код обратного вызова для запуска select() при запросе сертификата удаленным сервером?

Спасибо

PR

1 Ответ

2 голосов
/ 07 сентября 2011

Похоже, что может происходить некоторое кеширование сеанса.Вы сказали, что используете SSLSocket.Вы пытались установить кеширование сеанса на false?По умолчанию SSLSocket включает кэширование сеанса.

Например, в классе SSLSocket есть метод public void useCache(boolean b) Если вы зададите ему параметр false после создания сокета, надеюсь, это предотвратитсервер от кэширования вашего первого сеанса (я предполагаю, что вы вызываете оба клиентских соединения из одной программы).Таким образом, он должен запросить у вас другой запрос сертификата со второго соединения, как вы хотите.

...