Ответ 1
Если вы используете самозаверяющий сертификат, вы можете столкнуться с проблемами, связанными с проверкой сертификата SSL. Эта ссылка обсуждает это.
Мне нужно сделать 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?
Если вы используете самозаверяющий сертификат, вы можете столкнуться с проблемами, связанными с проверкой сертификата SSL. Эта ссылка обсуждает это.
Свойства 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
, в ваш собственный магазин доверия.)