Отправка SSL-сертификата клиента от Apache через прокси-сервер компании в стороннюю систему - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь настроить следующее:

Пользователь --- https ---> Apache --- http ---> Прокси-сервер компании --- https ---> Сторонний веб-сервер (nginx)

Apache должен отправить клиентский сертификат SSL для аутентификации веб-сервером. Я использую Apache 2.4.41 / OpenSSL 1.1.1d.

Если я тестирую установку с помощью curl и отправляю сертификат SSL-клиента на веб-сервер через компанию (т. Е. В обход Apache), это работает отлично. Однако, если я использую curl для подключения к Apache, произойдет сбой.

Я настроил (только соответствующие части) как Apache VHost

===

ServerName test1.company.com:5140

SSLEngine on
KeepAlive on

SSLProxyEngine On
SSLProxyCheckPeerCN off
SSLProxyVerify none
SSLProxyCheckPeerName off

SSLProxyCACertificateFile conf/ssl/ca-bundle-proxy.crt

# client certificate (contains unencrypted concatenated private key and server certificate)
SSLProxyMachineCertificateFile ssl.client

ProxyRemote "*" "http://proxy.company.de:8080"

ProxyTimeout 30
Timeout 30

# explicity required
ProxyPreserveHost Off

<Location /mycontext>
    ProxyPass                    https://www.thirdparty.com:443/mycontext
    ProxyPassReverse             https://www.thirdparty.com:443/mycontext
</Location>

Я получаю в лог-файл (извлечение):

[Mon Mar 23 14:18:26.150538 2020] [ssl:trace4] [pid 116307:tid 140486627026688] ssl_engine_io.c(2212): [remote proxy.company.com:8080] OpenSSL: read 5/5 bytes from BIO#7fc57000ddb0 [mem: 7fc57002f863] (BIO dump follows)
[Mon Mar 23 14:18:26.150558 2020] [ssl:trace4] [pid 116307:tid 140486627026688] ssl_engine_io.c(2212): [remote proxy.company.com:8080] OpenSSL: read 117/204 bytes from BIO#7fc57000ddb0 [mem: 7fc57002f868] (BIO dump follows)
[Mon Mar 23 14:18:26.165597 2020] [ssl:trace4] [pid 116307:tid 140486627026688] ssl_engine_io.c(2212): [remote proxy.company.com:8080] OpenSSL: read 87/87 bytes from BIO#7fc57000ddb0 [mem: 7fc57002f8dd] (BIO dump follows)
[Mon Mar 23 14:18:26.165643 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2192): [remote proxy.company.com:8080] OpenSSL: Loop: SSLv3/TLS read server key exchange
[Mon Mar 23 14:18:26.165687 2020] [ssl:debug]  [pid 116307:tid 140486627026688] ssl_engine_kernel.c(1943): AH02267: Proxy client certificate callback: (test1.company.com:5140) entered
[Mon Mar 23 14:18:26.165691 2020] [ssl:debug]  [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2013): AH02269: Proxy client certificate callback: (test1.company.com:5140) no client certificate found!?
[Mon Mar 23 14:18:26.165708 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2192): [remote proxy.company.com:8080] OpenSSL: Loop: SSLv3/TLS read server certificate request
[Mon Mar 23 14:18:26.165712 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2192): [remote proxy.company.com:8080] OpenSSL: Loop: SSLv3/TLS read server done
[Mon Mar 23 14:18:26.165722 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2192): [remote proxy.company.com:8080] OpenSSL: Loop: SSLv3/TLS write client certificate
[Mon Mar 23 14:18:26.165881 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2192): [remote proxy.company.com:8080] OpenSSL: Loop: SSLv3/TLS write client key exchange
[Mon Mar 23 14:18:26.165910 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2192): [remote proxy.company.com:8080] OpenSSL: Loop: SSLv3/TLS write change cipher spec
[Mon Mar 23 14:18:26.165947 2020] [ssl:trace4] [pid 116307:tid 140486627026688] ssl_engine_io.c(2212): [remote proxy.company.com:8080] OpenSSL: write 138/138 bytes to BIO#7fc57000e190 [mem: 7fc57002a5a0] (BIO dump follows)
[Mon Mar 23 14:18:26.235214 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2192): [remote proxy.company.com:8080] OpenSSL: Loop: SSLv3/TLS read change cipher spec
[Mon Mar 23 14:18:26.235242 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2192): [remote proxy.company.com:8080] OpenSSL: Loop: SSLv3/TLS read finished
[Mon Mar 23 14:18:26.235254 2020] [ssl:trace3] [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2187): [remote proxy.company.com:8080] OpenSSL: Handshake: done
[Mon Mar 23 14:18:26.235265 2020] [ssl:debug]  [pid 116307:tid 140486627026688] ssl_engine_kernel.c(2236): [remote proxy.company.com:8080] AH02041: Protocol: TLSv1.2, Cipher: ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)

Вывод curl через Apache:

< HTTP/1.1 400 Bad Request
< Date: Mon, 23 Mar 2020 13:18:26 GMT
< Server: nginx
< Content-Type: text/html
< Content-Length: 246
< Connection: close
<
<html>
<head><title>400 No required SSL certificate was sent</title></head>

Вопросы :

  1. Почему говорится "сертификат клиента не найден !?" и "написать сертификат клиента"? Это немного сбивает с толку.
  2. Насколько я знаю, обмен SSL-сертификатом клиента происходит в рукопожатии SSL. Как можно выполнить рукопожатие, если при отправке сертификата клиента произошла ошибка?
  3. Кто-нибудь знает, что нужно изменить в конфигурации Apache, чтобы это работало?

Любая помощь очень ценится.

Спасибо, Кристиан

1 Ответ

0 голосов
/ 23 марта 2020

Почему написано "сертификат клиента не найден !?" и "написать сертификат клиента"? Это немного сбивает с толку.

Если сервер запросил сертификат клиента, клиент отправит запрошенную запись сертификата. Но это может не содержать ничего (т. Е. 0 сертификатов).

Насколько я знаю, обмен SSL-сертификатом клиента осуществляется в рукопожатии SSL. Как выполнить квитирование, если при отправке сертификата клиента произошла ошибка?

Сертификат клиента может быть обязательным или необязательным. Клиент не может видеть, является ли это обязательным или нет, только то, что запрашивается сертификат. Сервер или приложение могут решить проверить, является ли сертификат ожидаемым после завершения самого рукопожатия. Только если рукопожатие завершено, клиент может отправить запрос HTTP и получить ответ HTTP со сравнительно приятным сообщением об ошибке. В противном случае клиент просто получит странную ошибку рукопожатия.

Кто-нибудь знает, что нужно изменить в конфигурации Apache, чтобы это работало?

Конфигурация, которую вы представляете, выглядит на самом деле хорошо, но проблема может быть в деталях. Например, файл сертификата может быть неправильным, так что сертификат и ключ не могут быть найдены внутри. Трудно сказать, не глядя на такого рода детали. Либо сертификат не совпадает со списком ЦС, который сервер представил в качестве возможных эмитентов для клиентского сертификата.

...