Tomcat+letsencrypt под Windows и немножечко DSpace

Discalmer!
Задача не правильная и не должна ни ставиться, не решаться, но если она всё же поставлена, то….

Дано:
И так, у нас есть сервер с OS Windows, сервисом Apache Tomcat и сервлетами, которые видны в сети Интернет через 80 порт и необходимо опубликовать их по https (443) с минимальными временным и интеллектуальными затратами. Сертификат должен быть не самоподписанным и обновляться автоматически.

Здесь и далее, описываются действия на примере Win2008R2x64 и Tomcat 7.0.x.

Вариант установки nginx/httpd/iis перед Tomcat не рассматриваем, ибо не обозначено в задаче, https трафик будет отдавать сам Tomcat. Только жесть, только хардкор.




Шаг один: установка клиента letsencrypt и получение сертификата.

Клиент можно скачать по ссылке, либо со страницы с описанием. Сопровождать процесс установки скриншотами я не стану, т.к. там действительно всё в режиме next-next-ok. Системные переменные дополняются нужными путями тоже автоматически. Единственное, что можно выбрать — путь установки, но, это дело вкуса.
А сразу после установки делаем так:

И то же самое текстом:

c:\Program Files (x86)\Certbot\bin>certbot certonly --webroot -w c:\RUNTIME\TOMCAT\webapps\ROOT
Saving debug log to C:\Certbot\log\letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): ideafix@ideafix.name

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'
d like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): elar.usfeu.ru
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for elar.usfeu.ru
Using the webroot path c:\RUNTIME\TOMCAT\webapps\ROOT for all unmatched domains.

Waiting for verification...
Cleaning up challenges
[1m
IMPORTANT NOTES:
[0m - Congratulations! Your certificate and chain have been saved at:
   C:\Certbot\live\elar.usfeu.ru\fullchain.pem
   Your key file has been saved at:
   C:\Certbot\live\elar.usfeu.ru\privkey.pem
   Your cert will expire on 2020-09-16. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at C:\Certbot. You should make a secure
   backup of this folder now. This configuration directory will also
   contain certificates and private keys obtained by Certbot so making
   regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

c:\Program Files (x86)\Certbot\bin>

В принципе, процесс получения сертификата закончен, но его нужно разобрать по шагам:

1. Не смотря на наличие пути в переменной path я на всякий случай сделал:

cd "c:\Program Files (x86)\Certbot\bin"

2. Дал команду собственно получения сертификата (c:\RUNTIME\TOMCAT\webapps\ROOT — путь до wwwroot сервера):

c:\Program Files (x86)\Certbot\bin>certbot certonly --webroot -w c:\RUNTIME\TOMCAT\webapps\ROOT

3. Ответил на некоторые вопросы (ввел e-mail, имя домена и пр) и всё.

Всё, что нам нужно, в виде ярлыков лежит в C:\Certbot\live\elar.usfeu.ru\ и пути не поменяются в случае обновления сертификата. Это важный момент, мы же хотим один раз настроить, и забыть. Вернее, один раз настроить, записать, но не иметь повода вспоминать регулярно.

К слову об обновлении, обновлять будем так:

certbot renew --webroot -w c:\RUNTIME\TOMCAT\webapps\ROOT

Просто положим данную строчку в BAT’ник и будем его через назначенные задания выполнять раз в 20 дней.


Шаг два: настройка Tomcat.

На самом деле, Tomcat умеет минимум три способа создания коннектора для https, но мы воспользуемся не самым простым в настройке, но самым простым в обслуживании. Примечательно, что с определённой версии APR, немного поменялись требования к оформлению коннектора, а документация и решения в сети в основном иллюстрируют работу старых версий. Так вот, для начала, нужно скачать APR библиотеку для Windows. На момент написания данного текста актуальной была версия 1.2.24, но если вдруг ссылка уведет вас вникуда, то качайте Native A.B.CD Windows Binaries zip (recommended) с этой страницы (где A.B.CD — версия).

Вся установка APR сведется к копированию библиотеки нужной разрядности из архива в bin директорию Tomcat:


Шаг два с половиной: настройка коннектора Tomcat.

Все настройки проводятся в TOMCAT-HOME/conf/server.xml, а в нашем случае (у нас же немножечко DSpace) в С:\RUNTIME\TOMCAT\conf\server.xml

1. Убеждаемся что раскоментирована эта строка:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

2. Убеждаемся что коннектор для 80 порта более или менее адекватный, например такой:

    <Connector port="80" protocol="HTTP/1.1"
              maxThreads="450"
           enableLookups="false"              
              maxHttpHeaderSize="16384"
              connectionTimeout="20000"
              redirectPort="443"
              URIEncoding="UTF-8" />

Здесь все параметры (кроме быть может port и redirectPort настроены по этому руководству, рекомендации в котором периодически меняются).

3. Убеждаемся что все коннекторы на 443 и/или 8443 порт закоментированы и создаём такой коннектор:

    <Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="450"
               SSLEnabled="true"
               maxHttpHeaderSize="16384"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
           enableLookups="false"
               SSLCertificateFile="C:/Certbot/live/elar.usfeu.ru/cert.pem"
               SSLCertificateKeyFile="C:/Certbot/live/elar.usfeu.ru/privkey.pem"
               SSLCertificateChainFile="C:/Certbot/live/elar.usfeu.ru/chain.pem" >
               <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    </Connector>

Здесь параметры зеркальны коннектору для 80 порта, за исключением путей до сертификатов и некоторых, специфичных для HTTPS коннектора параметров. Напомню, что в конфиге мы используем ярлыки, создаваемые certbot для актуальных версий сертификатов.

4. Перезапускаем Tomcat, пробуем открыть ресурс по https, видим результат — программа-минимум выполнена:


Шаг три: немножечко Dspace (на самом деле, нет).
В случае использования Apache HTTPD, дальше в ход бы пошел htaccess или даже vhost’ы, но у нас Apache Tomcat и эта магия не работает. Уточню, я говорю всего лишь об автоматическом перенаправлении с 80 порта на 443. По началу, я попытался решить проблему посредством URLREWRITE, но сходу не вышло и проблема была решена на уровне сервлета (JSPUI), а именно, в /webapps/servlet/WEN-INF/web.xml (в нашем случае C:\RUNTIME\TOMCAT\webapps\ROOT\WEB-INF\web.xml) были добавлены строки:

<security-constraint>
   <web-resource-collection>
     <web-resource-name>DSpace Web UI</web-resource-name>
     <url-pattern>/*</url-pattern>
   </web-resource-collection>
   <user-data-constraint>
     <transport-guarantee>CONFIDENTIAL</transport-guarantee>
   </user-data-constraint>
 </security-constraint>

Сразу после строки:

<display-name>DSpace Web UI</display-name>

Таким образом, редирект на https был реализован только для JSPUI, но не для OAI, SOLR и пр.


Шаг три с половиной: немножечко Dspace.
Необходимо поправить dspace.url, dspace.baseurl, handle.canonical.prefix и воможно еще какие-то параметры в /dspace/config/dspace.cfg, путь до битстримов в OAI и множество других текстовых переменных для того, чтобы везде подменить http на https.

Запись опубликована в рубрике Программки с метками , , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *