Если разработчики, с которыми Вы работаете, не знакомы с шаблоном MVC, я не был бы. Как минимум я говорил бы с ними сначала прежде, чем внести такое большое изменение.
Когда вы говорите «есть ли более простой способ ... доверять этому сертификату», это именно то, что вы делаете, добавляя сертификат в хранилище доверенных сертификатов Java. И это очень, очень легко сделать, и вам ничего не нужно делать в вашем клиентском приложении, чтобы это хранилище доверенных сертификатов было распознано или использовано.
Найдите на своей клиентской машине, где находится ваш файл cacerts (это ваше доверие Java по умолчанию store и по умолчанию находится в
. Затем введите следующее:
keytool -import -alias <Name for the cert> -file <the .cer file> -keystore <path to cacerts>
Это импортирует сертификат в ваше хранилище доверенных сертификатов, и после этого, ваше клиентское приложение сможет без проблем подключиться к вашему HTTPS-серверу Grizzly.
Если вы не хотите импортировать сертификат в хранилище доверенных сертификатов по умолчанию, то есть вы просто хотите, чтобы он был доступен для этого единственного клиентского приложения , но ни к чему другому, что вы запускаете на своей JVM на этой машине - тогда вы можете создать новое хранилище доверенных сертификатов только для своего приложения. Вместо передачи keytool пути к существующему файлу cacerts по умолчанию, передайте keytool путь к вашему новому файлу доверенного хранилища:
keytool -import -alias <Name for the cert> -file <the .cer file> -keystore <path to new trust store>
Вам будет предложено установить и проверить новый пароль для файла доверенного хранилища. Затем, когда вы запустите свое клиентское приложение, запустите его со следующими параметрами:
java -Djavax.net.ssl.trustStore=<path to new trust store> -Djavax.net.ssl.trustStorePassword=<trust store password>
Легко, чутко.
Вот болезненный путь:
SSLContext ctx = null;
try {
KeyStore trustStore;
trustStore = KeyStore.getInstance("JKS");
trustStore.load(new FileInputStream("C:\\truststore_client"),
"asdfgh".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory
.getInstance("SunX509");
tmf.init(trustStore);
ctx = SSLContext.getInstance("SSL");
ctx.init(null, tmf.getTrustManagers(), null);
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
ClientConfig config = new DefaultClientConfig();
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
new HTTPSProperties(null, ctx));
WebResource service = Client.create(config).resource(
"https://localhost:9999/");
service.addFilter(new HTTPBasicAuthFilter(username, password));
// Attempt to view the user's page.
try {
service.path("user/" + username).get(String.class);
} catch (Exception e) {
e.printStackTrace();
}
Надо любить эти шесть разных пойманных исключений :). Конечно, есть некоторый рефакторинг, чтобы немного упростить код. Но мне нравятся параметры -D delfuego на виртуальной машине. Мне жаль, что не было статического свойства javax.net.ssl.trustStore, которое я мог бы просто установить. Всего две строчки кода и готово. Кто-нибудь знает, где это будет?
Это может быть слишком много, чтобы спрашивать, но в идеале keytool не будет использоваться. Вместо этого доверенный магазин будет создаваться кодом динамически, а сертификат добавляется во время выполнения.
Должен быть лучший ответ.