SSL рукопожатие не работает на Docker-контейнере - PullRequest
0 голосов
/ 15 января 2019

Мне нужно вызвать один ресурс в docker контейнере, для которого требуется L2TP/IPsec VPN.Настройка VPN в порядке (я получаю 200 кодов ответа при вызове напрямую с моего ноутбука).Но затем я делаю это из-за того, что соединение с док-контейнером застревает на ssl handshake.

Как мне настроить докер так, чтобы контейнер был таким же, как на моем ноутбуке?

Отслеживание Python :

Traceback (most recent call last):
  File "/sp/server/env/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 345, in _make_request
    self._validate_conn(conn)
  File "/sp/server/env/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 844, in _validate_conn
    conn.connect()
  File "/sp/server/env/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 326, in connect
    ssl_context=context)
  File "/sp/server/env/lib/python3.6/site-packages/requests/packages/urllib3/util/ssl_.py", line 324, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/local/lib/python3.6/ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "/usr/local/lib/python3.6/ssl.py", line 817, in __init__
    self.do_handshake()
  File "/usr/local/lib/python3.6/ssl.py", line 1077, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/local/lib/python3.6/ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
socket.timeout: _ssl.c:835: The handshake operation timed out

dockerfiles / ServerDockerfile :

FROM python:3.6-jessie

RUN pip install virtualenv

ADD . /sp
WORKDIR /sp/server

# Register api port
EXPOSE 8090

CMD make run

docker-compose.yml :

version: '3'
services:
  server:
    restart: always
    build:
      context: .
      dockerfile: dockerfiles/ServerDockerfile
    volumes:
      - .:/sp
    ports:
      - "8090:8090"

Я пытался вызвать тот же ресурс из других docker контейнеров, которые у меня есть на моем компьютере, и это всегда та же самая ситуация - застрял на ssl рукопожатии.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Я решил свою проблему, установив docker-compose.yml network_mode значение параметра host.

докер-compose.yml:

version: '3'
services:
  server:
    restart: always
    build:
      context: .
      dockerfile: dockerfiles/ServerDockerfile
    volumes:
      - .:/sp  # mount repo dir to container for development
    ports:
      - "8090:8090"
    network_mode: "host"
0 голосов
/ 16 января 2019

Можете ли вы запустить

docker logs <container name> -f

и захватить, что является выходом из попытки рукопожатия SSL?

Вероятно, вам нужен сертификат SSL в вашем контейнере для подключения к серверу с SSL. Вы можете добавить сертификат к своему изображению с помощью Dockerfile:

FROM openjdk:8-jre-alpine
COPY target/app.jar /opt/spring-cloud/lib/
COPY certs/ssl.cer $JAVA_HOME/lib/security
RUN \
  cd $JAVA_HOME/lib/security \
  && keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias edlscert -file edls.cer
ENTRYPOINT ["/usr/bin/java"]
CMD ["-jar", "/opt/spring-cloud/lib/app.jar"]
VOLUME /var/lib/spring-cloud/config-repo
EXPOSE 9101

Однако у этого подхода есть ограничения, и лучшим решением, вероятно, является предоставление .cer во время развертывания как части файла docker-compose. В любом случае вам понадобится сертификат для связи с внешним сервисом через SSL / HTTPS.

...