Restlet with Simple — несмотря на то, что для needClientAuthentication задано значение true, он принимает любое соединение без сертификата клиента.

Я использую 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 работает просто отлично, но он принимает любое соединение, независимо от того, есть ли у них сертификат клиента или нет! Что именно здесь происходит, и я что-то упустил?


person user705142    schedule 26.06.2011    source источник


Ответы (1)


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

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

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

В списке рассылки Simple на эту тему обсуждались здесь:

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

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

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

person Bruno    schedule 26.06.2011
comment
Черт, я думал, что это может быть так - документация по рестлетам вообще не упоминает об этом, что довольно ужасно - предполагается, что и needClientAuthentication, и wantClientAuthentication работают нормально. Я также не совсем уверен, какую версию Simple он использует - в идеале мне нужна аутентификация клиента с самого начала, я бы все равно использовал коннектор Jetty, но, похоже, у него есть довольно серьезная ошибка, мешающая мне использовать его, который я Сделаю еще один пост о. - person user705142; 27.06.2011
comment
stackoverflow.com/questions/6489667/ - person user705142; 27.06.2011