Къде да поставите хранилище за ключове за уеб приложение Tomcat, използвайки HTTP клиент на Apache

Пиша рутина за достъп до отдалечен сървър. Този сървър, към който се свързвам, изисква взаимно удостоверяване, така че трябва да осигуря хранилище за ключове и докато го правя, бих искал да поставя и подходящо хранилище за доверие.

Мога да намеря много уроци за това как да създам хранилище за ключове с keytool и множество начини да накарам HTTP клиент на Apache да го разпознае, но не и къде да го съхранявам в Tomcat среда, така че приложението да може да го намери. По някакъв начин поставянето му във военния файл на приложението ми се струва лоша идея.

Отново, това не позволява на Tomcat да обработва входящи https връзки - имам обратен прокси, настроен от нашия администраторски екип за това. Създавам изходящи https връзки, които изискват взаимно удостоверяване, т.е. едновременно приемане на самоподписан сертификат за целеви сървър и предоставяне на самоподписания клиентски сертификат на моя сървър.

Къде съхранявате действителните файлове за съхранение на ключове и доверени хранилища в среда Tomcat за използване от уеб приложение?


person Matt Thompson    schedule 06.11.2014    source източник
comment
Какво точно имате предвид под „правилно доверително хранилище“, което вече не е изпълнено от това, доставено с Java?   -  person user207421    schedule 06.11.2014
comment
Това не е по темата, но услугата, към която се свързвам, предоставя самоподписан сертификат, който не е приемлив за cacert по подразбиране. Понастоящем приемам всички, но те са включили взаимно и сега трябва да осигуря и собствен подпис на клиента, така че ако трябва да добавя водопроводната мрежа за хранилището за ключове, трябва да използвам възможността да добавя и поддръжката на довереното хранилище. Първо трябва да знам къде да сложа проклетите неща.   -  person Matt Thompson    schedule 06.11.2014
comment
Доколкото знам, файлът на хранилището за ключове може да бъде навсякъде в пътя на директорията, който сървърът има достъп за четене. В server.xml на tomcat трябва да посочите пътя на директорията в порт 8443 на конектора в атрибута Keystorefile.   -  person Amar    schedule 06.11.2014
comment
@Amz Хранилището за ключове, използвано за клиентски TLS сертификат, няма нищо общо с конфигурацията <Connector> на Tomcat. Това не е проблем с конфигурацията на Tomcat.   -  person Christopher Schultz    schedule 06.11.2014


Отговори (2)


Можете да поставите вашето хранилище за ключове където пожелаете, стига да знаете как да кажете на httpclient къде да зареди хранилището за ключове.

Това, разбира се, е уловката.

https://stackoverflow.com/questions/5206010/using-apache-httpclient-for-https

Заровен в цялата тази бъркотия от код в приетия отговор е ключът (ха!) към използването на httpclient с вашето собствено персонализирано хранилище за ключове. Жалко е, че httpclient няма прост API като „ето пътя до моя файл за съхранение на ключове, сега го използвайте“ или „ето байтовете за моето хранилище за ключове, използвайте ги“ (ако искате да заредите хранилището за ключове от ClassLoader или каквото и да е), но това изглежда е така.

Честната истина е, че използването на хранилища за ключове и доверителни хранилища в Java е объркана работа и обикновено няма начин да се заобиколи. След като сам написах с възможност за клиентски сертификат HTTP клиент, използвайки нищо друго освен HttpsURLConnection и след това също добавих raw- сокет компоненти за това, знам колко е болезнено.

Кодът в свързаната по-горе статия е доста ясен, макар и малко многословен. За съжаление, ще трябва да го направите много по-объркан за кода с производствено качество, защото трябва да правите проверка за грешки и т.н. за всяка стъпка от процеса, за да сте сигурни, че услугата ви няма да се провали, когато опитвате се да настроите различните магазини и да осъществите връзката си.

person Christopher Schultz    schedule 06.11.2014
comment
Моля, вижте публикацията ми, която всъщност е коментар към вашия отговор. +1 към вашия отговор в противен случай. - person ok2c; 06.11.2014

Това по същество е коментар към отговора на Кристофър Шулц, но тъй като включва някои кодови фрагменти, моля, извинете ме, че го поставям тук

Жалко е, че httpclient няма прост API като „ето пътя до моя файл за съхранение на ключове, сега го използвайте“ или „ето байтовете за моето хранилище за ключове, използвайте ги“ (ако искате да заредите хранилището за ключове от ClassLoader или каквото и да е), но това изглежда е така

Ето как човек може да конфигурира Apache HttpClient 4.3 да използва специфично доверително хранилище за инициализация на SSL контекст.

SSLContext sslContext = SSLContexts.custom()
        .loadTrustMaterial(trustStore)
        .build();
CloseableHttpClient client = HttpClients.custom()
        .setSslcontext(sslContext)
        .build();

Човек може да зареди доверен материал от ресурс като този

URL resource = getClass().getResource("/com/mycompany/mystuff/my.truststore");
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream inputStream = resource.openStream();
try {
    trustStore.load(inputStream, null /*usually not password protected*/);
} finally {
    inputStream.close();
}
person ok2c    schedule 06.11.2014
comment
Благодаря за актуализираните кодови фрагменти. Ако хората от HttpClient не скриха своя Javadoc, може би щях да мога да търся съществуващи приложими методи (или, в този случай, създатели). :( - person Christopher Schultz; 06.11.2014