HTTPS REST ClientResponse

Мне нужно сделать 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 etc (кроме отладки)? Есть ли что-то еще, что мне нужно сделать, например, загрузить хранилище ключей или инициализировать SSLContext?

Ответ 1

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

Ответ 2

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

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

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

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

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