Перезапустите с Simple - несмотря на то, что needClientAuthentication установлено в true, он принимает любое соединение без сертификата клиента - PullRequest
0 голосов
/ 26 июня 2011

Я использую Restlet 2.0.8 с простой настройкой:

    component = new Component();
    component.getClients().add(Protocol.FILE);
    Server httpsServer = component.getServers().add(Protocol.HTTPS, 444);

    Series<Parameter> parameters = httpsServer.getContext().getParameters();

    File pwd = new File(".");
    String path = pwd.getCanonicalPath();
    String keystorePath = path + "/keystore/keypair.jks";

    parameters.add("SSLContextFactory", "org.restlet.ext.ssl.PkixSslContextFactory");
    parameters.add("keystorePath", keystorePath);
    parameters.add("keystorePassword", "xxx");
    parameters.add("keyPassword", "xxx");
    parameters.add("keystoreType", "JKS");
    parameters.add("threadMaxIdleTimeMs", "60000"); //default idle time
    parameters.add("needClientAuthentication", "true");

    // Guard the restlet with BASIC authentication (encrypted under SSL).
    ChallengeAuthenticator guard = new ChallengeAuthenticator(null, ChallengeScheme.HTTP_BASIC, "xxx");

    //new pagerreceiver
    Restlet resty = new PagerReceiverApplication();

    LoginChecker loginVerifier = new LoginChecker();
    guard.setVerifier(loginVerifier);
    guard.setNext(resty);
    component.getDefaultHost().attachDefault(guard);

    overrideStatus statusService = new overrideStatus();
    component.setStatusService(statusService);

    component.start();

SSL работает просто отлично, но он принимает любые соединения, независимо от того, есть у них сертификат клиента или нет! Что именно здесь происходит, и я что-то упустил?

1 Ответ

1 голос
/ 26 июня 2011

Некоторое время, пока этот патч в Simple Framework (rev. 1785) , Simple всегда использовал «хочу аутентификацию клиента», без какого-либо способа его настройки в любом случае («необходимость» или « нет ничего ").

По этой причине параметр needClientAuthentication коннектора Simple Restlet никогда не поддерживался, поскольку сам коннектор Restlet не мог изменить это поведение.

Насколько я знаю, изменение в Simple rev. 1785 удаляет только любую форму аутентификации клиента (без необходимости или необходимости). Я не уверен, использует ли Restlet 2.0.8 выпуск Simple, который был до или после этого патча, но на сегодняшний день, похоже, нет ничего, чтобы обеспечить такую ​​поддержку.

Здесь обсуждался простой список рассылки по этой теме:

Есть несколько обходных путей:

  • Используйте другой разъем, отличный от Simple, для вашего приложения Restlet. Другие должны поддерживать needClientAuthentication.
  • Продолжайте использовать wantClientAuthentication (при условии, что это предварительно исправленная версия Simple) и проверьте, действительно ли существует сертификат, иначе запретите запрос. (Я думаю, что именно так IIS делает это, даже когда ему «требуется» сертификат.)

В качестве примечания, глядя на ваш код, я не уверен, почему вы хотите настаивать на том, чтобы клиент представлял как клиентский сертификат, так и учетные данные базовой аутентификации HTTP. Базовая аутентификация Сверху клиент-сертификат кажется немного излишним.

...