HTTPS REST ClientResponse - PullRequest
       6

HTTPS REST ClientResponse

0 голосов
/ 09 ноября 2010

Мне нужно сделать HTTPS-вызов от клиента. Мне не нужно отправлять сертификаты на сервер, просто нужно проверить сертификат с сервера.

Я исследовал эту тему, и это мое понимание. Не могли бы вы подтвердить? У меня пока нет тестовой службы, по которой можно проверить мой код ... но все же нужно уложиться в сроки .. любые советы / замечания будут полезны

Я добавил это в свой класс:

private static String appKeyFile = "/project/src/security/cert_file.jck";  
private static String key = "password";  
static {  
    System.setProperty("javax.net.ssl.keyStore", appKeyFile);  
    System.setProperty("javax.net.ssl.keyStorePassword",key);  
    System.setProperty("javax.net.ssl.keyStoreType","JCEKS");  
}  

И я делаю HTTPS-вызов следующим образом:

config = new DefaultClientConfig();  
client = Client.create(config);  
service = client.resource(UriBuilder.fromUri("https://localhost:8081/TestService").build());  
clientResponse = service.path("rs").path("test").path("getCustomerDetail")  
        .accept(MediaType.APPLICATION_XML)  
        .post(ClientResponse.class, customerRequestType);  

if (clientResponse.getStatus() == Response.Status.OK.getStatusCode()) {   
    custResponseType = clientResponse.getEntity(CustResponseType.class);  
    System.out.println("First Name" + 
    custResponseType.getFirstName());  
}

Достаточно ли этого с точки зрения SSL / HTTPS / certs и т. Д. (Кроме отладки)? Что еще мне нужно сделать, например загрузить хранилище ключей или инициализировать SSLContext?

Ответы [ 2 ]

4 голосов
/ 09 ноября 2010

Свойства javax.net.ssl.keyStore* (хранилище ключей) предназначены для ключей и сертификатов стороны, использующей его. То есть на сервере он должен содержать сертификат сервера и его закрытый ключ; на клиенте он должен содержать клиентские сертификаты и их закрытые ключи.

Напротив, склад доверенных сертификатов (свойства javax.net.ssl.trustStore*) содержит доверенные сертификаты, используемые для проверки сертификата удаленной стороны. На клиенте это то, что используется для определения того, доверяете ли вы сертификату сервера (обычно через цепочку к сертификату CA, которому доверяет клиент); на сервере это то, что используется для проверки сертификата клиента.

И хранилище доверенных сертификатов, и хранилище ключей являются файлами / объектами хранилища ключей (терминология на самом деле не помогает).

Если вы установите javax.net.ssl.keyStore* на стороне клиента, он будет использоваться клиентом для представления своего сертификата (который может быть запрошен только сервером, и который вы, похоже, не используете в любом случае). Он по-прежнему будет использовать хранилище доверенных сертификатов по умолчанию (поставляется / настраивается с помощью JRE) и вряд ли будет содержать конкретный сертификат в cert_file.jck (который, вероятно, является самозаверяющим сертификатом, созданным вами для сервера). Вместо этого установите свойства javax.net.ssl.trustStore*, чтобы они указывали на этот файл.

(Если вы хотите, чтобы сертификаты CA по умолчанию также были доступны, я бы предложил скопировать сертификаты в хранилище доверенных сертификатов по умолчанию, обычно из $JAVA_HOME/lib/security/jssecacerts или $JAVA_HOME/lib/security/cacerts в ваше собственное хранилище доверенных сертификатов.)

0 голосов
/ 09 ноября 2010

Если вы используете самозаверяющий сертификат, у вас могут возникнуть проблемы, связанные с проверкой SSL-сертификата. Эта ссылка обсуждает это.

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