Compose: SSL错误:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败

创建于 2015-01-27  ·  182评论  ·  资料来源: docker/compose

使用docker-compose几乎同时在两台计算机上都出现了此错误,并且最近在回滚后使用了fig。 一些搜索结果指向python / openssl问题,但我简单地无法弄清楚在哪里进行挖掘。 Python / openssl来自自制。

Boot2Docker-cli版本:v1.4.1
Git提交:43241cb

客户端版本:1.4.1
客户端API版本:1.16
Go版本(客户端):go1.4
Git提交(客户端):5bc2ff8
操作系统/ Arch(客户端):darwin / amd64
服务器版本:1.4.1
服务器API版本:1.16
Go版本(服务器):go1.3.3
Git提交(服务器):5bc2ff8

arepackaging

最有用的评论

我可能不是第一个提出这个问题的人,但是,curl环境变量对不相关的Python应用程序有何影响,这不是很直观吗?

谢谢,
杰森·米尔斯(Jason Mills)

  • 由手机发出。

2016年5月7日下午3:22,Lorenzo Sicilia [email protected]写道:

您可以使用以下命令运行而不是禁用CURL_CA_BUNDLE:
CURL_CA_BUNDLE =〜/ .docker / machine / machines / default / ca.pem docker-compose ps

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件或在GitHub上查看

所有182条评论

我想我在尝试使用docker-compose发行候选版本时遇到了同样的事情...

$ docker-compose ps
SSL error: hostname '192.168.59.103' doesn't match 'boot2docker'

但是fig可以正常工作...

$ fig -f docker-compose.yml ps
Name   Command   State   Ports
------------------------------

我在OSX上,运行与@gkostyanikov相同的所有版本,但我的Go客户端版本为go1.3.3 。 我的python / openssl也通过Homebrew安装。 可能与此有关吗?

编辑:实际上看起来Homebrew不链接openssl,所以我正在使用默认的OSX版本: OpenSSL 0.9.8za 5 Jun 2014

问题是自制的python。

docker-compose现在卸载自制蟒蛇/ OpenSSL的,安装后工作pipeasy_install ,并重新安装docker-composer使用该系统的蟒蛇。

@adambiggs您的解决方案有效! 谢谢!

这也对我有用,我正在使用全新的mac并使用自制python进行设置。 图与docker通信时发生此错误。 遵循@adambiggs的建议,并逐字通过了我的阻止程序,这也可能是python版本的问题,但是无论我猜这台机器将在一段时间内使用系统python。

这也在我身上发生。 而且我不想使用系统的python,有人有其他解决方法吗?

您是否尝试过使用二进制文件? 你有同样的问题吗?

不,我没有尝试过二进制文件。
如果您不想在系统python中安装它,另一个解决方法是使用virtualenv(wrapper)。

mkvirtualenv --python=/usr/bin/python docker-compose
pip install docker-compose==1.1.0-rc2

使用pyenv找到了更好的解决方案,可回滚到python 2.7.8:

http://stackoverflow.com/a/28216459/1166293
https://github.com/yyuu/pyenv

编辑:没关系, pyenv介绍了一堆自己的问题...

对我造成此错误的原因是,自制的openssl未链接到/ usr / local / bin / openssl。

openssl version

返回的OpenSSL 0.9.8zc 2014年10月15日不是OpenSSL 1.0.1j 2014年10月15日

跑步

brew link --force openssl

并重新安装无花果解决了该问题。

有趣的是,我的OpenSSL版本是OpenSSL 1.0.1j,2014年10月15日

在我的情况下, @ aanand二进制文件没有此问题。

我通过点子而非自制软件安装无花果时出现此错误。 sudo pip uninstall figbrew install fig为我修复了它。

@NotBobTheBuilder解决方案+1,也对我

:+1:对于@NotBobTheBuilder

@NotBobTheBuilder是无花果的不错的解决方案,但不幸的是,

@ocasta来自自制的有关链接OpenSSL的可怕警告如何处理?

此公式仅适用于小桶。
Mac OS X已经提供了此软件,并在其中安装了另一个版本
并行会引起各种各样的麻烦。

苹果已经弃用OpenSSL,而是使用自己的TLS和加密库

竖起大拇指@NotBobTheBuilder-这也解决了我。

有人知道这个问题的根源吗? 无花果在我身上发生了。 我喜欢像现在一样坚持pip install fig 。 几周前一切正常,不知道我的系统发生了什么变化

我的系统OpenSSL是OpenSSL 0.9.8zc 15 Oct 2014 ,我的自制openssl是较新的但未链接。

...我猜我升级到Python 2.7.9时它坏了,似乎有一些与SSL相关的错误...看起来很像这样:
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=196431
http://bugs.python.org/issue23052

运行brew link --force openssl并重新安装fig对我没有任何帮助。

图是否需要更新以解决Py 2.7.9中的SSL更改?
https://www.python.org/dev/peps/pep-0476/#opting -out

我正在使用boot2docker。 我刚刚升级到1.5.0,但没有任何变化。

In [1]: from fig.cli.docker_client import docker_client

In [2]: client = docker_client()

In [3]: client.version()

SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

In [4]: %debug
> /Users/anentropic/.virtualenvs/dpm/lib/python2.7/site-packages/requests/sessions.py(461)request()
    460         send_kwargs.update(settings)
--> 461         resp = self.send(prep, **send_kwargs)
    462

ipdb> p settings
{'verify': '/Users/anentropic/.boot2docker/certs/boot2docker-vm/ca.pem', 'cert': ('/Users/anentropic/.boot2docker/certs/boot2docker-vm/cert.pem', '/Users/anentropic/.boot2docker/certs/boot2docker-vm/key.pem'), 'proxies': {}, 'stream': False}

无花果代码看起来正确,它正在尝试使用boot2docker安装的证书...我认为这些证书是可以的,因为它们始终可以正常工作,并且我刚刚升级了b2d,因此它们不应过期。

嗯,我的Python(通过Homebrew安装)似乎使用的是OpenSSL的Homebrew版本:

$ python -c 'import ssl; print(ssl.OPENSSL_VERSION)'
OpenSSL 1.0.2 22 Jan 2015
$ brew info openssl
openssl: stable 1.0.2 (bottled)
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

...运行/usr/local/opt/openssl/bin/c_rehash没有帮助:)

我通过$ brew switch python 2.7.8_2尝试了先前安装的python(2.7.8_2)版本,但存在相同的问题(即使错误消息略有不同)。 因此python 2.7.9版本似乎不是问题。

然后,我尝试切换到从1.0.2到1.0.1j_1的较旧的openssl版本,这似乎可行。

$ python -c 'import ssl; print(ssl.OPENSSL_VERSION)'
OpenSSL 1.0.2 22 Jan 2015
$ docker-compose ps
SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)
$ brew switch openssl 1.0.1j_1
$ python -c 'import ssl; print(ssl.OPENSSL_VERSION)'
OpenSSL 1.0.1j 15 Oct 2014
$ docker-compose ps
Name   Command   State   Ports 
------------------------------

对我来说,我会得到一个不同的错误,但是也许可以帮助缩小问题范围:

$ brew switch openssl 1.0.1j_1
Error: openssl does not have a version "1.0.1j_1" in the Cellar.
Versions available: 1.0.1e, 1.0.1f, 1.0.1g, 1.0.2
$ brew switch openssl 1.0.1g
Opt link created for /usr/local/Cellar/openssl/1.0.1g
$ fig up
SSL error: hostname '192.168.59.103' doesn't match 'boot2docker'

切换回OpenSSL 1.0.2会产生先前的CERTIFICATE_VERIFY_FAILED错误,因此更改版本肯定会产生一些影响

一种解决方法是在容器中运行docker-compose:

git clone [email protected]:docker/fig.git
cd fig
docker build --tag docker-compose .

alias docker-compose='docker run --rm -e "DOCKER_TLS_VERIFY=$DOCKER_TLS_VERIFY" -e DOCKER_HOST=tcp://172.17.42.1:2376 -e DOCKER_CERT_PATH=/usr/local/certs -v "$DOCKER_CERT_PATH:/usr/local/certs" -v "$PWD:/code" docker-compose --project-name "${PWD##*/}"'

这需要在VirtualBox中公开端口2376:

VBoxManage controlvm boot2docker-vm natpf1 "docker-s,tcp,127.0.0.1,2376,,2376"

@kretz的答案对我

+1 @kretz酿造开关openssl 1.0.1j_1
搞定了

brew switch openssl 1.0.1j适用于我(请注意缺少_1)

我不喜欢它,但是从我的virtualenv卸载了无花果,并通过自制软件安装了固定的东西

谢谢@kretz-您的回答为我解决了!

它对我不起作用,因为:

$ brew switch openssl 1.0.1j_1
Error: openssl does not have a version "1.0.1j_1" in the Cellar.
Versions available: 1.0.2

我的解决方法是用python 2.7.8创建一个virtualenv,而不是从brew获得的2.7.9。

各种解决方法...有人对真正的问题有深入的了解吗?

App Engine与什么有关系?

2015年3月11日,18:09,Ryan Small [email protected]写道:

我很确定所有应用程序引擎都不能与python 2.7.9一起使用

-
直接回复此电子邮件或在GitHub上查看
https://github.com/docker/compose/issues/890#issuecomment -78329652。

@anentropic您需要先安装较旧的openssl版本,然后才能使用(切换到它)。

# Find available older versions to install
$ brew search openssl
openssl
homebrew/versions/openssl098  homebrew/versions/openssl101

# Install older 1.0.1 version
$ brew install homebrew/versions/openssl101

# See what versions are installed locally
$ brew info openssl
...
/usr/local/Cellar/openssl/1.0.1f (429 files,  15M)
  Built from source
/usr/local/Cellar/openssl/1.0.1i (430 files,  15M)
  Poured from bottle
/usr/local/Cellar/openssl/1.0.1j (431 files,  15M)
  Poured from bottle
/usr/local/Cellar/openssl/1.0.1j_1 (431 files,  15M)
  Poured from bottle
/usr/local/Cellar/openssl/1.0.2 (459 files,  18M)
  Poured from bottle
...

# Switch to one of the 1.0.1 you got installed
$ brew switch openssl 1.0.1j_1

我做了brew install openssl101但是它没有给我切换到1.0.1j的可能性...它给了我1.0.1l ,我担心它会混淆我的系统,因为他们是分开的冲泡包装,我已经并行有1.0.2

似乎没有帮助,但也许我做得还不够

抱歉,我回复了错误的github问题(迅速删除了我的评论)
在2015年3月11日星期三上午11:30 anentropic [email protected]
写道:

我做过brew install openssl101,但没有给我机会
切换到1.0.1j ...它给了我1.0.1l,我担心它会
因为它们是独立的冲煮软件包,所以我感到困惑
1.0.2并行

似乎没有帮助,但也许我做得还不够

-
直接回复此电子邮件或在GitHub上查看
https://github.com/docker/compose/issues/890#issuecomment -78340580。

因此,在Mac OSX上运行,我似乎也遇到了此问题。 使用docker-compose这是我的.yml文件。

web:
    build: .
    links:
        - db
        - cache
        - worker
    ports:
        - "8080:8080"
db:
    image: mysql
cache:
    image: redis
worker:
    build: .
    command: celery -A application.extentions worker -l info

运行docker-compose pull我得到以下输出失败。

$ docker-compose pull
Pulling db (mysql:latest)...
SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

我检查了一些东西。
which openssl; openssl version

/usr/local/bin/openssl
OpenSSL 1.0.2 22 Jan 2015

如果与brew安装在一起, @ psykzz应该可以工作

brew install docker-compose

@arvindtest是什么让您认为与这个问题有关?

仅供参考,经过很多努力后,看来这是boot2docker问题。
对我有用的是禁用TLS。 尚没有一种用户友好的方式来执行此操作,但此处概述了说明:
https://github.com/deis/deis/issues/2230

基本上,您需要:

boot2docker ssh
sudo echo'DOCKER_TLS = no'> / var / lib / boot2docker / profile

然后重启boot2docker,即
boot2docker停止
boot2docker启动

和类似的东西到您的〜/ .bashrc(确保ip正确)

导出DOCKER_HOST = tcp://192.168.59.103 :2375
未设置DOCKER_CERT_PATH
未设置DOCKER_TLS_VERIFY

在您的bashrc中,为什么不只有$(boot2docker shellinit)

应该帮助一切正确吗?

我的意思是您仍然必须执行TLS解决方案。
2015年3月21日23:05,“ coderfi” [email protected]写道:

仅供参考,经过很多努力之后,看来这是一个
boot2docker问题。
对我有用的是禁用TLS。 还没有一种用户友好的方式
为此,但此处概述了说明:
deis / deis#2230 https://github.com/deis/deis/issues/2230

基本上,您需要:

boot2docker ssh
sudo echo'DOCKER_TLS = no'> / var / lib / boot2docker / profile

然后重启boot2docker,即
boot2docker停止
boot2docker启动

和类似的东西到你的〜/ .bashrc
确保IP正确

导出DOCKER_HOST = tcp://192.168.59.103 :2375
未设置DOCKER_CERT_PATH
未设置DOCKER_TLS_VERIFY

-
直接回复此电子邮件或在GitHub上查看
https://github.com/docker/compose/issues/890#issuecomment -84468058。

@kretz有效! 谢谢。

@psykzz是指$(boot2docker shellinit)吗?

是的,我做了,更新了我的评论。 德尔普

我可以确认@coderfi的禁用TLS的解决方案对我

很高兴为您工作。 :)

@Matt是的,您对shell初始化shell扩展技巧是正确的。
但是,如果boot2docker尚未启动,那可能不起作用,所以我只是
使示例更明确。

Fi
2015年3月26日上午10:18,“ anentropic” [email protected]写道:

我可以确认@coderfi https://github.com/coderfi的解决方案
禁用TLS对我有用!

-
直接回复此电子邮件或在GitHub上查看
https://github.com/docker/compose/issues/890#issuecomment -86630313。

也许这很明显,但是为了使此功能失效而禁用TLS或降级OpenSSL的用户应该根据自己的工作谨慎进行。

这不会涉及所有问题,但是在安装pip过程中,我使用Dockerfilegliderlabs/alpine:3.1拉出了类似的错误,这是progrium&crew的最小Linux容器。 问题是我尚未安装系统证书软件包,已通过在安装pip并运行需求文件之前安装软件包来解决此问题:

RUN apk-install -X ca-certificates

建议的解决方案对我而言实际上并不起作用。 无法切换到任何1.0.1 OpenSSL版本。 最后,我发现卸载所有由pip安装的docker-compose版本并以某种方式执行brew install docker-compose可行的。

上面的解决方案有效,但是对我来说太麻烦了。 快速的boot2docker upgrade解决了我所有的问题。

我已经有了最新的boot2docker版本,如果没有上述修复,它对我不起作用

自制软件开发人员建议docker-py和docker-compose应该升级为使用requests 2.6.0

https://github.com/Homebrew/homebrew/issues/38226#issuecomment -88083428

希望这对某人有帮助...不确定解决方案,但是如果您将Charles用作Mac OS X代理,它将导致此消息。

FWIW,通过pip安装docker-compose可以使docker-compose本身正常工作(在OS X Mavericks上通过curl安装会导致illegal operation错误)。 随后,我也收到了SSL错误。 运行brew link --force openssl && brew switch openssl 1.0.1j似乎已经为我修复了。

@rseymour答案对我

对于那些无法在brew中找到openssl-1.0.1j的人-您可以从github存储库中获取旧版本的openssl配方并加以利用:

» brew switch openssl 1.0.1j
Error: openssl does not have a version "1.0.1j" in the Cellar.
Versions available: 1.0.2a-1
» brew unlink openssl
Unlinking /usr/local/Cellar/openssl/1.0.2a-1... 1543 symlinks removed
» brew install https://raw.githubusercontent.com/Homebrew/homebrew/62fc2a1a65e83ba9dbb30b2e0a2b7355831c714b/Library/Formula/openssl.rb
...
🍺  /usr/local/Cellar/openssl/1.0.1j_1: 431 files, 14M, built in 4.2 minutes
» docker-compose up                                                                                                                   
Creating myservice...

我尝试了1.0.1m,但没有成功。
所以我尝试了@lazyval方法,它对我
这就是我所做的。

酿造安装https://raw.githubusercontent.com/Homebrew/homebrew/62fc2a1a65e83ba9dbb30b2e0a2b7355831c714b/Library/Formula/openssl.rb
酿造开关openssl 1.0.1j_1
brew unlink openssl101 //因为在此之前我链接了1.0.1m
brew链接openssl --force
码头工人组成ps

谢谢!!

我目前正在对此进行调查,因为我们现在需要在Python 2.7.9+上构建二进制文件。

_从#1427起搬迁_

服务器:

  • CoreOS稳定
  • Docker 1.5.0

客户:

  • CentOS 6.6,64位
  • 内核2.6.32-042stab105.14
  • Docker客户端1.5.0
  • 码头工人组成1.2.0
  • SSL证书位于~/.docker/{ca.pem,cert.pem,key.pem}
  • DOCKER_HOST=tcp://docker-builder:2376
  • DOCKER_TLS_VERIFY=1

使用以下Makefile生成SSL证书:

#!/bin/bash

SERVER=docker-builder

clean:
    rm ca.* server.* client.* *.key

all: ca.crt server.crt client.crt

%.key:
    openssl genrsa -out $@ 4096

ca.crt: ca.key
    openssl req -new -x509 -days 365 -key ca.key -sha256 -out ca.crt \
        -subj "/C=US/ST=Texas/L=Austin/O=Abc123/OU=Operations/CN=${SERVER}/[email protected]"

server.csr: server.key
    openssl req -new -key server.key -out server.csr \
        -subj "/C=US/ST=Texas/L=Austin/O=Abc123/OU=Operations/CN=${SERVER}/[email protected]"

server.crt: ca.key ca.crt server.csr
    openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key \
        -CAcreateserial -out server.crt

client.csr: client.key
    openssl req -new -key client.key -out client.csr \
        -subj "/C=US/ST=Texas/L=Austin/O=Abc123/OU=Operations/CN=Docker Client/[email protected]"

client.ext.cnf:
    echo "extendedKeyUsage = clientAuth" > client.ext.cnf

client.crt: client.csr ca.crt ca.key client.ext.cnf
    openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key \
        -CAcreateserial -out client.crt -extfile client.ext.cnf

这是配置此机器的(绝对不理想)用户数据脚本:

#cloud-config

write_files:
    - path: /home/core/server.crt
      owner: core:core
      permissions: 0644
      content: |
        -----BEGIN CERTIFICATE-----
        <cert goes here>
        -----END CERTIFICATE-----


    - path: /home/core/server.key
      owner: core:core
      permissions: 0644
      content: |
        -----BEGIN RSA PRIVATE KEY-----
        <key goes here>
        -----END RSA PRIVATE KEY-----


    - path: /home/core/ca.crt
      owner: core:core
      permissions: 0644
      content: |
        -----BEGIN CERTIFICATE-----
        <ca cert goes here>
        -----END CERTIFICATE-----

coreos:
  update:
    reboot-strategy: reboot
  units:
  units:
    - name: var-lib-docker.mount
      command: start
      content: |
        [Unit]
        Description=Mount RAM to /var/lib/docker
        Before=docker.service
        [Mount]
        What=tmpfs
        Where=/var/lib/docker
        Type=tmpfs
        Options=size=200g
    - name: docker.service
      command: restart
      content: |
        [Unit]
        Description=Docker Application Container Engine
        Documentation=http://docs.docker.io
        After=network.target
        [Service]
        ExecStartPre=/bin/mount --make-rprivate /
        # Run docker but don't have docker automatically restart
        # containers. This is a job for systemd and unit files.
        ExecStart=/usr/bin/docker -d \
          --tlsverify \
          --tlscert=/home/core/server.crt \
          --tlscacert=/home/core/ca.crt \
          --tlskey=/home/core/server.key \
          -H 0.0.0.0:2376 -H unix:///var/run/docker.sock

        [Install]
        WantedBy=multi-user.target

使用docker客户端,我可以成功访问远程docker服务器。 我们每天成功调用远程服务器多达十万次,并取得了成功。

尝试使用docker-compose ,通过卷曲一方或安装pip install --upgrade与Python 2.7,我们得到了一个SSL错误:

$ docker-compose up -d
SSL error: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

在手动和单独指定DOCKER_CERT_PATH=/home/user/.docker/以及REQUESTS_CA_BUNDLE=/home/user/.docker/ca.pem ,就是这种情况。

需要说明的是:此设置仅适用于docker daemon,但与-compose无关。

一些注意事项:

  1. OSX的Compose 1.3.0 RC1二进制文件存在此错误。 可能并非偶然,这是它首次针对Python 2.7.9构建-之前是2.7.6。
  2. 奇怪的是,我可以在boot2docker VM上进行复制,但不能在Machine配置的Virtualbox VM上进行复制。 @ehazlett@nathanleclaire@tianon-那里有什么见解吗?
  3. 对于在将Compose与Pip一起安装时遇到此问题的任何人,请报告以下命令的输出:

$ python -V $ python -c 'import ssl; print ssl.OPENSSL_VERSION'

在我可以重现错误的本地计算机上,我有Python 2.7.10OpenSSL 1.0.2a 19 Mar 2015

  1. 这已经报告给Homebrew了,有人说他们已经成功地重新安装了Python和OpenSSL,但是它对我没有用。 https://github.com/Homebrew/homebrew/issues/38226

嗯,这真的很奇怪。 您使用的是什么版本的b2d与版本
机器? 我们俩都使用b2d,所以我不确定会有什么不同
除了版本。

我将通过pip在OS X机器上进行安装,然后查看得到的结果。

2015年5月28日星期四,上午9:19,Aanand Prasad [email protected]
写道:

一些注意事项:

1。

OSX的Compose 1.3.0 RC1二进制文件存在此错误。 可能不会
巧合的是,这是第一次针对Python 2.7.9构建

  • 之前是2.7.6。
    2。

奇怪的是,我可以针对boot2docker VM进行复制,但不能针对
由计算机配置的Virtualbox VM。 @ehazlett
https://github.com/ehazlett,@nathanleclaire
https://github.com/nathanleclaire,@tianon
https://github.com/tianon-那里有什么见解吗?
3。

对于在将Compose与Pip一起安装时遇到此问题的任何人,请
报告以下命令的输出:

$ python -V
$ python -c'导入ssl; 打印ssl.OPENSSL_VERSION'

在我可以重现错误的本地计算机上,我有Python
2.7.10和OpenSSL 1.0.2a,2015年3月19日。
4。

这已经报告给Homebrew,有人说他们已经
成功重新安装了Python和OpenSSL,但对我没有用。
自制/自制#38226
https://github.com/Homebrew/homebrew/issues/38226

-
直接回复此电子邮件或在GitHub上查看
https://github.com/docker/compose/issues/890#issuecomment -106306690。

$ boot2docker version
Boot2Docker-cli version: v1.6.2
Git commit: cb2c3bc

$ docker-machine --version
docker-machine version 0.2.0 (8b9eaf2)

证书生成可能有所不同吗? 我的机器证书目录中的文件似乎比boot2docker文件中的文件多。

$ $(boot2docker shellinit)
$ ls -l $DOCKER_CERT_PATH/*.pem
-rw-r--r--  1 aanand  staff  1042 28 May 14:27 /Users/aanand/.boot2docker/certs/boot2docker-vm/ca.pem
-rw-r--r--  1 aanand  staff  1070 28 May 14:27 /Users/aanand/.boot2docker/certs/boot2docker-vm/cert.pem
-rw-r--r--  1 aanand  staff  1675 28 May 14:27 /Users/aanand/.boot2docker/certs/boot2docker-vm/key.pem
$ eval "$(docker-machine env)"
$ ls -l $DOCKER_CERT_PATH/*.pem
-rw-r--r--  1 aanand  staff  1029 11 May 12:15 /Users/aanand/.docker/machine/machines/dev/ca.pem
-rw-r--r--  1 aanand  staff  1054 11 May 12:15 /Users/aanand/.docker/machine/machines/dev/cert.pem
-rw-r--r--  1 aanand  staff  1679 11 May 12:15 /Users/aanand/.docker/machine/machines/dev/key.pem
-rw-------  1 aanand  staff  1679 11 May 12:15 /Users/aanand/.docker/machine/machines/dev/server-key.pem
-rw-r--r--  1 aanand  staff  1086 11 May 12:15 /Users/aanand/.docker/machine/machines/dev/server.pem

那样就好。 客户端将只使用ca.pem,cert.pem和key.pem
(服务器只是计算机中主机的本地副本)。 我将创建为
好,并检查证书,看看有什么不同。

在2015年5月28日星期四上午9:30,Aanand Prasad通知单@ github.com
写道:

$ boot2docker版本
Boot2Docker-cli版本:v1.6.2
Git提交:cb2c3bc

$ docker-machine --version
docker-machine版本0.2.0(8b9eaf2)

证书生成可能有所不同吗? 我似乎还有更多
我的机器证书目录中的文件比我的boot2docker文件中的文件要大。

$ $(boot2docker shellinit)
$ ls -l $ DOCKER_CERT_PATH / *。pem
-rw-r--r-- 1名aanand人员1042 5月28日14:27 /Users/aanand/.boot2docker/certs/boot2docker-vm/ca.pem
-rw-r--r-- 1名aanand人员1070 5月28日14:27 /Users/aanand/.boot2docker/certs/boot2docker-vm/cert.pem
-rw-r--r-- 1名aanand员工1675 5月28日14:27 /Users/aanand/.boot2docker/certs/boot2docker-vm/key.pem

$ eval“ $(docker-machine env)”
$ ls -l $ DOCKER_CERT_PATH / *。pem
-rw-r--r-- 1名aanand人员1029 5月11日12:15 /Users/aanand/.docker/machine/machines/devs/ca.pem
-rw-r--r-- 1名aanand人员1054年5月11日12:15 /Users/aanand/.docker/machine/machines/devs/cert.pem
-rw-r--r-- 1名aanand人员1679 5月11日12:15 /Users/aanand/.docker/machine/machines/dev/key.pem
-rw ------- 1名aanand员工1679年5月11日12:15 /Users/aanand/.docker/machine/machines/devs/server-key.pem
-rw-r--r-- 1名aanand员工1086年5月11日12:15 /Users/aanand/.docker/machine/machines/devs/server.pem

-
直接回复此电子邮件或在GitHub上查看
https://github.com/docker/compose/issues/890#issuecomment -106309885。

grahamc@snap$ python -V
Python 2.7.6

grahamc@snap$ python -c 'import ssl; print ssl.OPENSSL_VERSION'
OpenSSL 1.0.1e-fips 11 Feb 2013

另请参阅https://github.com/docker/docker-py/issues/465。 在进行了一项修改以禁用主机名检查之后, @ garethr的测试脚本也为我重现了该错误:

from docker.client import Client
from docker.utils import kwargs_from_env

kwargs = kwargs_from_env()
kwargs['tls'].assert_hostname = False

client = Client(**kwargs)
print client.version()
$ eval "$(boot2docker shellinit)" && python test.py
Writing /Users/aanand/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/aanand/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/aanand/.boot2docker/certs/boot2docker-vm/key.pem
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print client.version()
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/docker/client.py", line 1108, in version
    return self._result(self._get(url), json=True)
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/docker/client.py", line 106, in _get
    return self.get(url, **self._set_request_timeout(kwargs))
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py", line 477, in get
    return self.request('GET', url, **kwargs)
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

但是,它仍然可以与机器配置的VM一起使用:

$ eval "$(docker-machine env)" && python test.py
{u'KernelVersion': u'4.0.3-boot2docker', u'Arch': u'amd64', u'ApiVersion': u'1.18', u'Version': u'1.6.2', u'GitCommit': u'7c8fca2', u'Os': u'linux', u'GoVersion': u'go1.4.2'}

如果我重新启用主机名检查(通过在测试脚本中注释掉assert_hostname行),则它会针对boot2docker-cli VM失败,并显示相同的错误,但针对Machine VM则会出现不同的错误,这可能是可能不相关:

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print client.version()
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/docker/client.py", line 1108, in version
    return self._result(self._get(url), json=True)
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/docker/client.py", line 106, in _get
    return self.get(url, **self._set_request_timeout(kwargs))
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py", line 477, in get
    return self.request('GET', url, **kwargs)
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "/Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: no appropriate commonName or subjectAltName fields were found

此外,我尝试通过curl(二进制发行版,而不是通过pip)使用v1.3.0-rc1,并在docker 1.6.2守护程序上遇到了与以前相同的错误:

SSL error: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

是的-RC1二进制文件是使用Python 2.7.9和OpenSSL 1.0.2a构建的,这似乎是有问题的组合之一。

这是有道理的,因为我相信b2d中的证书生成在VM上
而机器在机器中生成它们。 我们可以检测并添加
如果需要,将计算机名称添加到SAN。 其实那可能很好
特别是对于b2d VM。 我认为它现在起作用的原因是因为您
使用机器添加为IP SAN的IP访问引擎。 有一个
PR开放以允许任意附加的SAN也可以使用。

2015年5月28日星期四,Aanand Prasad [email protected]写道:

另见docker / docker-py#465
https://github.com/docker/docker-py/issues/465。 @garethr
https://github.com/garethr的测试脚本在那里再现了以下错误
我也做了修改以禁用主机名检查后:

从docker.client导入从docker.utils导入kwargs_from_env

kwargs = kwargs_from_env()
kwargs ['tls']。assert_hostname = False

客户端=客户端(** kwargs)打印client.version()

$ eval“ $(boot2docker shellinit)” && python test.py
编写/Users/aanand/.boot2docker/certs/boot2docker-vm/ca.pem
编写/Users/aanand/.boot2docker/certs/boot2docker-vm/cert.pem
编写/Users/aanand/.boot2docker/certs/boot2docker-vm/key.pem
追溯(最近一次通话):
在第8行的文件“ test.py”中
打印client.version()
文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/docker/client.py”,版本1108
返回self._result(self._get(url),json = True)
_get中的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/docker/client.py”,第106行
返回self.get(URL,* _self._set_request_timeout(kwargs))
在获得的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py”中,行477
返回self.request('GET',url,* _kwargs)
请求中的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py”,第465行
resp = self.send(准备,* _send_kwargs)
发送中的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py”,第573行
r = adapter.send(请求,* _kwargs)
发送中的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/adapters.py”,第431行
引发SSLError(e,request = request)
requests.exceptions.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:590)

但是,它仍然可以与机器配置的VM一起使用:

$ eval“ $(docker-machine env)” && python test.py
{u'KernelVersion':u'4.0.3-boot2docker',u'Arch':u'amd64',u'ApiVersion':u'1.18',u'Version':u'1.6.2',u'GitCommit ':u'7c8fca2',u'Os':u'linux',u'GoVersion':u'go1.4.2'}

如果我重新启用主机名检查(通过将assert_hostname注释掉)
测试脚本中的一行),则针对_same error_失败
boot2docker-cli虚拟机,但是与机器虚拟机存在_不同的错误_
可能相关或可能不相关:

追溯(最近一次通话):
在第8行的文件“ test.py”中
打印client.version()
文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/docker/client.py”,版本1108
返回self._result(self._get(url),json = True)
_get中的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/docker/client.py”,第106行
返回self.get(URL,* _self._set_request_timeout(kwargs))
在获得的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py”中,行477
返回self.request('GET',url,* _kwargs)
请求中的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py”,第465行
resp = self.send(准备,* _send_kwargs)
发送中的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/sessions.py”,第573行
r = adapter.send(请求,* _kwargs)
发送中的文件“ /Users/aanand/.virtualenvs/docker-compose/lib/python2.7/site-packages/requests/adapters.py”,第431行
引发SSLError(e,request = request)
requests.exceptions.SSLError:找不到合适的commonName或subjectAltName字段

-
直接回复此电子邮件或在GitHub上查看
https://github.com/docker/compose/issues/890#issuecomment -106363305。

好的,我相信我已经找到了OS X的修复程序: https :

在Linux上修复该问题将涉及更新Dockerfile,以将其固定到Python 2.7.9和OpenSSL 1.0.1,这是一个有趣的尝试,因为它从debian:wheezy (这样做可以确保我们使用的是足够的旧的glibc-请参阅https://github.com/docker/compose/pull/505)。

按照@kretz注释中的描述切换到1.0.1k并通过pip安装1.3.0 RC1对我来说很成功。

切换之前,python报告1.0.2a:

❯ python -c 'import ssl; print ssl.OPENSSL_VERSION'
OpenSSL 1.0.2a 19 Mar 2015

切换后报告1.0.1k,并且docker-compose似乎按预期工作:

❯ python -c 'import ssl; print ssl.OPENSSL_VERSION'
OpenSSL 1.0.1k 8 Jan 2015

解决此错误的解决方法是在我的virtualenv中安装以下软件包
pip install pyopenssl==0.14 ndg-httpsclient==0.4 pyasn1==0.1.7

https://github.com/docker/compose/issues/890#issuecomment -106289821中描述的环境中,该环境提供了Python 2.7.6(通过snap-ci.com,您可以从中获得免费帐户)

使用以下脚本在pip安装中使用@ jsh2134的变通方法(https://github.com/docker/compose/issues/890#issuecomment-106806702):

#!/bin/bash

set -e
set -u
set -x


readonly DOCKER_VERSION=1.5.0
readonly TARGETFILE=$SNAP_CACHE_DIR/docker-$DOCKER_VERSION
[[ -f "$TARGETFILE" ]] || curl https://get.docker.io/builds/Linux/x86_64/docker-$DOCKER_VERSION > $TARGETFILE
cp $TARGETFILE ~/docker
chmod +x ~/docker


export DOCKER_HOST="tcp://docker-builds:2376" DOCKER_TLS_VERIFY=1

mkdir -p ~/.docker
cat > ~/.docker/ca.pem <<EOC
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----

EOC
cat > ~/.docker/key.pem <<EOC
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

EOC
cat > ~/.docker/cert.pem <<EOC
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
EOC

function install_docker_compose {
  pip install --upgrade pip
  pip install --upgrade docker-compose
  pip install pyopenssl==0.14 ndg-httpsclient==0.4 pyasn1==0.1.7
  export COMPOSE=docker-compose
}

install_docker_compose

export COMPOSE_PROJECT_NAME=$(basename "$(pwd)")-${SNAP_COMMIT:-HEAD}

# Before running anything, setup the EXIT trap to always rm the container on
# exit of the script.
function cleanup {
  $COMPOSE kill
  $COMPOSE rm --force
}

trap cleanup EXIT

$COMPOSE --version
$COMPOSE build
$COMPOSE up -d

set +e
$COMPOSE run $@
exitcode=$?
set -e

set +x
echo ""
echo "Component Data:"
for id in `$COMPOSE ps -q`; do
  ~/docker inspect \
    -f 'Container {{ .Name }} exited with status {{ .State.ExitCode }}' $id
  ~/docker logs $id 2>&1 | sed -e "s/^/        /"
  echo "---"
done

exit $exitcode

我得到以下输出:

+ readonly DOCKER_VERSION=1.5.0
+ DOCKER_VERSION=1.5.0
+ readonly TARGETFILE=/var/go/docker-1.5.0
+ TARGETFILE=/var/go/docker-1.5.0
+ [[ -f /var/go/docker-1.5.0 ]]
+ cp /var/go/docker-1.5.0 /var/go/docker
+ chmod +x /var/go/docker
+ export DOCKER_HOST=tcp://docker-builds:2376 DOCKER_TLS_VERIFY=1
+ DOCKER_HOST=tcp://docker-builds:2376
+ DOCKER_TLS_VERIFY=1
+ mkdir -p /var/go/.docker
+ cat
+ cat
+ cat
+ install_docker_compose
+ /bin/true
+ pip install --upgrade pip
/var/go/py-virtualenv2.7/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Collecting pip
  Using cached pip-7.0.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 6.0.8
    Uninstalling pip-6.0.8:
      Successfully uninstalled pip-6.0.8
Successfully installed pip-7.0.1
+ pip install --upgrade docker-compose
/var/go/py-virtualenv2.7/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Requirement already up-to-date: docker-compose in /var/go/py-virtualenv2.7/lib/python2.7/site-packages
Requirement already up-to-date: docopt<0.7,>=0.6.1 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from docker-compose)
Requirement already up-to-date: PyYAML<4,>=3.10 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from docker-compose)
Requirement already up-to-date: requests<2.6,>=2.2.1 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from docker-compose)
Requirement already up-to-date: texttable<0.9,>=0.8.1 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from docker-compose)
Requirement already up-to-date: websocket-client<1.0,>=0.11.0 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from docker-compose)
Requirement already up-to-date: docker-py<1.2,>=1.0.0 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from docker-compose)
Requirement already up-to-date: dockerpty<0.4,>=0.3.2 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from docker-compose)
Requirement already up-to-date: six<2,>=1.3.0 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from docker-compose)
Requirement already up-to-date: backports.ssl-match-hostname in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from websocket-client<1.0,>=0.11.0->docker-compose)
+ pip install pyopenssl==0.14 ndg-httpsclient==0.4 pyasn1==0.1.7
Collecting pyopenssl==0.14
/var/go/py-virtualenv2.7/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading pyOpenSSL-0.14.tar.gz (128kB)
Collecting ndg-httpsclient==0.4
  Downloading ndg_httpsclient-0.4.0.tar.gz
Collecting pyasn1==0.1.7
  Downloading pyasn1-0.1.7.tar.gz (68kB)
Collecting cryptography>=0.2.1 (from pyopenssl==0.14)
  Downloading cryptography-0.9.tar.gz (302kB)
Requirement already satisfied (use --upgrade to upgrade): six>=1.5.2 in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from pyopenssl==0.14)
Collecting idna (from cryptography>=0.2.1->pyopenssl==0.14)
  Downloading idna-2.0.tar.gz (135kB)
Requirement already satisfied (use --upgrade to upgrade): setuptools in /var/go/py-virtualenv2.7/lib/python2.7/site-packages (from cryptography>=0.2.1->pyopenssl==0.14)
Collecting enum34 (from cryptography>=0.2.1->pyopenssl==0.14)
  Downloading enum34-1.0.4.tar.gz
Collecting ipaddress (from cryptography>=0.2.1->pyopenssl==0.14)
  Downloading ipaddress-1.0.7-py27-none-any.whl
Collecting cffi>=0.8 (from cryptography>=0.2.1->pyopenssl==0.14)
  Downloading cffi-1.0.3.tar.gz (317kB)
Collecting pycparser (from cffi>=0.8->cryptography>=0.2.1->pyopenssl==0.14)
  Downloading pycparser-2.13.tar.gz (299kB)
Installing collected packages: idna, pyasn1, enum34, ipaddress, pycparser, cffi, cryptography, pyopenssl, ndg-httpsclient
  Running setup.py install for idna
  Running setup.py install for pyasn1
  Running setup.py install for enum34
  Running setup.py install for pycparser
  Running setup.py install for cffi
  Running setup.py install for cryptography
  Running setup.py install for pyopenssl
  Running setup.py install for ndg-httpsclient
Successfully installed cffi-1.0.3 cryptography-0.9 enum34-1.0.4 idna-2.0 ipaddress-1.0.7 ndg-httpsclient-0.4.0 pyasn1-0.1.7 pycparser-2.13 pyopenssl-0.14
+ export COMPOSE=docker-compose
+ COMPOSE=docker-compose
+++ pwd
++ basename /var/snap-ci/repo/tests/composer
+ export COMPOSE_PROJECT_NAME=composer-a71ac4f39281a9571a2b5da1284ab1c05da40646
+ COMPOSE_PROJECT_NAME=composer-a71ac4f39281a9571a2b5da1284ab1c05da40646
+ trap cleanup EXIT
+ docker-compose --version
docker-compose 1.2.0
+ docker-compose build
test1 uses an image, skipping
test2 uses an image, skipping
test uses an image, skipping
+ docker-compose up -d
SSL error: [Errno bad handshake] [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]
+ cleanup
+ docker-compose kill
SSL error: [Errno bad handshake] [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]

请特别注意错误(似乎是新错误):

/var/go/py-virtualenv2.7/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

创建了https://github.com/docker/compose/issues/1484以将我的发现到目前为止进行脑转储。

我已经在#1474中修复了一些二进制文件。 如果您遇到SSL问题,请尝试一下:

http://cl.ly/3W3a2S3t2c32/download/docker-compose-Linux-x86_64
http://cl.ly/0i00310l3x27/download/docker-compose-Darwin-x86_64

+ curl -L http://cl.ly/3W3a2S3t2c32/download/docker-compose-Linux-x86_64
+ /usr/bin/docker-compose --version
docker-compose version: 1.3.0rc1
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013

+ /var/go/docker-compose up -d
SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

@ jsh2134为什么您确切地将pyOpenSSL固定为0.14?

+1代表@kretz回答:)

+1同样的问题:(好像docker在osx上完全坏了?

@coderfi解决方案对我docker 1.7 Cygwin和docker-compose通过Cypwin中的pip安装

处理Centos7 VM上的一种变体错误,该Centos7 VM作为客户端在docker-machine上启动容器:

[ root @ xxxx cm]#docker-compose ps
SSL错误:找不到合适的commonName或subjectAltName字段

这曾经是短暂的; 我可以注销,再重新登录ssh,一段时间后看不到错误。 现在总是看到它。

[ root @ xxxx cm]#python -c'import ssl; 打印(ssl.OPENSSL_VERSION)'
OpenSSL 1.0.1e-fips 2013年2月11日

[ root @ xxxx cm]#docker版本
客户端版本:1.6.2
客户端API版本:1.18
Go版本(客户端):go1.4.2
Git提交(客户端):ba1f6c3 / 1.6.2
操作系统/ Arch(客户端):linux / amd64
服务器版本:swarm / 0.2.0
Go版本(服务器):go1.3.3
Git提交(服务器):48fd993
操作系统/存档(服务器):linux / amd64

[ root @ xxxx cm]#docker-compose --version
码头工人组成1.2.0

我不确定如何在我的环境中应用上述某些修复程序。 我没有使用boot2docker; 在bash命令行上处理docker 1.6.2。

你好。 我实际上为此打开了一个问题,因为我无法修复它。 我尝试了很多事情,即使用pip / brew /最新版本安装compose。 与openssl相同,尝试使用0.x 1.0.2x版本等,但仍然无法正常工作。

PS:我不使用boot2docker。 我有自己的虚拟机,可以通过流浪者制作,生成证书并与它们一起启动docker守护程序。 显然,它可以与docker一起使用,因此问题并非来自我的证书。

>>> docker run hello-world
Hello from Docker.
[...]
>>> docker-compose up
SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)
>>> docker-compose -v
docker-compose version: 1.3.1
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014
>>> docker -v
Docker version 1.6.2, build 7c8fca2

一次也收到此错误:

/usr/local/Cellar/fig/1.3.1/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
SSL error: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

在阅读并安装建议的软件包后,请执行以下操作:

https://urllib3.readthedocs.org/zh-CN/latest/security.html#insecureplatformwarning

来自docker-compose的错误消息已更改:

[ root @ xxx cm]#docker-compose up -d
/usr/lib/python2.7/site-packages/requests/packages/urllib3/connection.py:251:安全警告:证书没有subjectAltName ,回退以检查是否有commonName现在。 主流浏览器已删除此功能,RFC 2818不推荐使用此功能。(有关详细信息,请参阅https://github.com/shazow/urllib3/issues/497。)
安全警告
SSL错误:主机名“ xx.xx.xx.xx”与“无”不匹配

(我xx出来的虚线四边形是群主机/码头工人主机的)。

是否可以通过编辑或重新生成证书来解决此问题?

附录:证书是通过“ docker-machine create”在这些VM上创建的。

我们可以处理docker-machine中的错误导致证书不够详细吗?

我只看到docker-machine创建的Docker主机出现此错误。 我相信未正确创建SSL证书?

有谁有解决方法或解决方案来解决此问题? 现在对我来说这是一个障碍:/

@prologic使用二进制文件或安装了Pip的Compose收到错误消息吗? 如果是后者,请尝试同时安装requests[security]

@aanand谢谢! 我会尝试一下,并报告是否可行!

@prologic我们想打包requests[security]而不是依赖于Python的bug SSL模块; 我们正在跟踪#1530中的工作。

@aanand谢谢! 这是完美的工作:)

@coderfi您的解决方案为我工作,谢谢

@aanand 6月2日的构建对我来说很好。 祝你好运,把这个痛苦的bug弄死。

@neilsarkar我碰巧正在运行

我正在使用OS X 10.9.5,这是我的选择:

# ➜  openssl version
# OpenSSL 1.0.2d 9 Jul 2015

➜  pyenv local system # switch to built-in python 2.7.5 for current directory
# ➜  python --version
# Python 2.7.5
# ➜  python -c 'import ssl; print(ssl.OPENSSL_VERSION)'
# OpenSSL 0.9.8zd 8 Jan 2015

# ➜  docker-compose --version
# docker-compose version: 1.3.1
# CPython version: 2.7.5
# OpenSSL version: OpenSSL 0.9.8zd 8 Jan 2015

# ➜  docker-compose ps
# /usr/local/Cellar/fig/1.3.1/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
#   InsecurePlatformWarning
# Name   Command   State   Ports
# ------------------------------

我的解决方法:

注释掉第246:253行
/usr/local/Cellar/fig/1.3.1/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/connection.py

这是引发安全异常的部分

对我来说,问题是,即使您指定了brew链接--force openssl,fig / docker-compose仍然使用/ usr / bin / openssl。

$ sudo mv /usr/bin/openssl /usr/bin/openssl_old
$ brew link --force openssl OR brew unlink openssl && brew link --force openssl

这对我有用。 现在,我不再收到烦人的消息。

仅供参考,brew fig / docker-compose配方使用系统python,因此即使您通过pyenv或brew安装python,brew install fig / docker-compose仍将使用系统openssl lib(如果可用),否则,将安装其他版本。

在我工作的MAC上,我使用pyenv install 2.7.8,然后easy_install pip和pip install docker-compose解决了它。

但是在我家里的Mac上,“都在运行优胜美地”我做了同样的事情,但仍然得到警告。

将继续挖掘。

@dtunes-根本原因(如上面提到的https://github.com/boot2docker/boot2docker/issues/808。 system-python / homebrew-python是一个红色鲱鱼,因为它仅取决于您是针对新的OpenSSL还是旧的OpenSSL。

是的,我看到了那张票。 令我感到困扰的是,在尝试了以上所有方法之后,我的Mac仍在工作。
然后,我将/ usr / bin / openssl移至/ usr / bin / openssl_old,使用家用brew安装了最新的openssl并强制将其链接。 只有这样,我才执行以下操作:

~ $ brew install pyenv
~ $ pyenv install 2.7.8
~ $ pyenv global 2.7.8
~ $ easy_install pip
~ $ pip install docker-compose

这确实起作用了,但是在我的Mac上却无法正常工作。 但是我会再试一次,以防万一我出错了并报告结果。

@dtunes-为了重新构建所有依赖项,您需要删除~/Library/Caches/pip以便不会重新使用针对错误的OpenSSL构建的缓存二进制轮子。

@glyph写道

根本原因(如上文所引用的

@glyph@aanand ,是否表明从#1474合并的@aanand的修订(变通方法)仅容纳一个损坏的b2d? @aanand ,如果boot2docker / boot2docker#808的寻址正确,是否应该撤消#1474? 在下一个加密版本中寄予希望(参见thisthis )是否还会带来麻烦?

@aanand写道

请注意,对于使用docker-machine配置的Boot2Docker VM,我无法重现此错误-仅在使用boot2docker命令配置的VM上会发生此错误。

@ehazlett写道

这是有道理的,因为我相信b2d中的证书生成是在VM上,而机器是在计算机中生成的。

我可能会误解了,但是很多人为此和相关问题指责各种主机端Python / OpenSSL组合。 如果问题的根源是使用b2d分发的OpenSSL损坏,则我不确定最佳方法是确保Compose的主机端OpenSSL同样被破坏吗? 就其价值而言,对于那些通过(例如)Vagrant运行b2d并在Compose之外访问b2d的用户来说,这些类型的主机扭曲不太可能解决此问题(例如,参见docker / docker -py#465 )。

如果此注释在boot2docker / boot2docker#808中更合适,我可以将其移到那里。

我是Homebrew的维护者,我帮助字形消除了这种缺陷。

boot2docker生成的服务器证书的主题和颁发者DN均设置为/O=Boot2Docker 。 我相信服务器证书实际上是由CA证书签名的,但是AFAICT OpenSSL 1.0.2使用此信息(即相同的主题和颁发者DN)拒绝服务器证书为自签名,而不是尝试根据提供的证书来验证服务器证书。 CA证书 1.0.2之前的OpenSSL版本会根据提供的CA证书验证服务器证书,该证书将成功。

我相信但尚未测试,为服务器和CA证书提供不同的主题DN(以便服务器证书具有不同的主题和发行者DN)将允许证书在所有OpenSSL版本下进行验证。 我怀疑(基于我对本X.509生存指南的阅读,但没有阅读任何相关规范),但我不确定OpenSSL 1.0.2的行为是否合理,并不代表应该由OpenSSL开发人员解决的回归问题。

1474做两件事:

  • 将最低Python版本设置为2.7.9:这允许urllib3在不发出InsecurePlatformWarning的情况下完成请求,如果同时满足以下两个条件,则在建立HTTPS连接时会发出该消息:Python版本低于2.7.9,并且PyOpenSSL模块不存在。 捆绑PyOpenSSL会同样有效,但是我从讨论中了解到它与PyInstaller不兼容。 无论哪种方式,urllib3的InsecurePlatformWarning都与boot2docker证书问题无关,并且修复证书不会消除对这种变通方法的需要。
  • 将最大OpenSSL版本设置为1.0.1j。 我相信,一旦修复了boot2docker证书,这应该是不必要的。

如果问题的根源是使用b2d分发的OpenSSL损坏

它不是; 对于使用OpenSSL≥1.0.2的客户端,boot2docker证书(由此代码生成)无效; 不包含与boot2docker一起分发的OpenSSL库。

@glyph@aanand ,是否表明从#1474合并的@aanand的修订(变通方法)仅容纳一个损坏的b2d? @aanand ,如果boot2docker / boot2docker#808的寻址正确,是否应该撤消#1474? 在下一个加密版本中寄予希望(请参阅本节和本节)是否还会带来麻烦?

是的,我想是这样。 我相信问题所在的OpenSSL是1.0.2,通过将其限制为1.0.1,它将避免使用任何验证逻辑来​​导致证书失败。 我仍然不知道_what_是关于它不喜欢的证书的信息,因为错误消息太钝了。

另外,我认为#1474所做的事情过于具体; 至少从我的阅读来看,它不是在设置_minimum_ python版本,而是在指定_exact_版本。 如果您碰巧与j有任何1.0.1不同,它似乎也未能通过检查,这意味着安全更新甚至不会应用于1.0.1,这肯定是一个问题。

我相信但尚未测试,为服务器和CA证书提供不同的主题DN(以便服务器证书具有不同的主题和发行者DN)将允许证书在所有OpenSSL版本下进行验证。 我怀疑(基于我对本X.509生存指南的阅读,但没有阅读任何相关规范),但我不确定OpenSSL 1.0.2的行为是否合理,并不代表应该由OpenSSL开发人员解决的回归问题。

我将调查docker-machine -生成的证书,看看它是否具有此属性。 为什么您说这种行为可以接受/在OpenSSL中不是回归? 信任自签名证书非常好,并且我所知道的主题或颁发者可能包含的内容没有特别限制。 我略读了一下该指南,似乎只是指出自签名证书不会获得CA-cartel的信任,因此,如果没有其他配置,您的Web浏览器将不会信任它们。

查看我的docker-machine VM中的证书,我看到:

...
        Issuer: O=glyph
...
        Subject: O=dev
...

所以你可能对此是正确的...

我将研究docker-machine生成的证书,并查看其是否具有[匹配的主题和颁发者DN]。

您可以看到aanand的docker-machine证书也具有不同的DN: https: //gist.github.com/aanand/3d865623481ba8ae66ee#file -docker-machine-log-L30-L32

信任自签名证书是完全可以的

但是,除非您信任自签名证书,否则自签名证书无效。 我们不指示OpenSSL信任服务器证书; 我们指示OpenSSL信任颁发服务器证书的CA。

为什么您说这种行为可以接受/在OpenSSL中不是回归?

IANAL,但我的推理源于“严格意义上的[自签名]意味着证书中的颁发者和主题字段是相同的”。 boot2docker服务器证书就是这种情况。 当OpenSSL尝试验证boot2docker服务器证书时,可以建立完整的信任链而无需考虑CA证书,因为服务器证书似乎是由其自身签名的,但未被显式信任,因此无效。 我不确定这是否严格正确或必须采取的行为,也没有资格做出决定,但我认为这似乎是“合理的”。

谢谢大家的辛勤工作。

另外,我认为#1474所做的事情过于具体; 至少从我的阅读来看,它没有设置最低的python版本,而是指定了确切的版本。 如果您碰巧与j有任何1.0.1不同,它似乎也未能通过检查,这意味着安全更新甚至不会应用于1.0.1,这绝对是一个问题。

同意假设它是与boot2docker的证书不同的OpenSSL 1.0.2,那么该部分至少应该是可修复的-我将研究如何获得最新的OpenSSL 1.0.1。

@tdsmith ,感谢您的解释和歉意。 @glyph ,感谢您的澄清。

FWIW,我尝试测试@tdsmith的理论并generate_cert (这很丑,请原谅我)为IssuerSubject创建不同的值。 它似乎可以保持水位(但请参见下面的警告)。 这是运行b2d并从当前generate_cert生成的证书与受黑客攻击的版本生成的证书得到的结果:

0.9.8zd与orig generate_cert (0.1)一起使用

% /usr/bin/openssl version
OpenSSL 0.9.8zd 8 Jan 2015
% /usr/bin/openssl s_client -showcerts -connect "${DOCKER_HOST#tcp:\/\/}" -key "${DOCKER_CERT_PATH}/key.pem" -cert "${DOCKER_CERT_PATH}/cert.pem" -CAfile "${DOCKER_CERT_PATH}/ca.pem" -tls1 </dev/null
depth=1 /O=Boot2Docker
verify return:1
depth=0 /O=Boot2Docker
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:/O=Boot2Docker
   i:/O=Boot2Docker
-----BEGIN CERTIFICATE-----
MIIC/TCCAeegAwIBAgIRAKt8Sy0ND8z8omBU0uhODVAwCwYJKoZIhvcNAQELMBYx
...
qKFg5oUO9wigoGlwnSjqC/5ZmFRf9B+nWeCUVi/vWl0skOIqCMlDamD8AOVtmtRg
tg==
-----END CERTIFICATE-----
---
Server certificate
subject=/O=Boot2Docker
issuer=/O=Boot2Docker
---
Acceptable client certificate CA names
/O=Boot2Docker
---
SSL handshake has read 2554 bytes and written 2188 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 621C9DF6883DA1FAF273408D0C984AC6E1DA33BA44ADA0EBA88BE59490560CFC
    Session-ID-ctx: 
    Master-Key: 39A75DE8551C41241CDBF889A5EF32DC7F86A45C792218B7E380E90627C7D0691BC5FCCAB69154B84142171F866F36C2
    Key-Arg   : None
    TLS session ticket:
    0000 - 77 ca 24 b7 2e 33 6a fc-9d 6e d0 eb aa 0d d5 89   w.$..3j..n......
    ...
    0630 - db 49 35 a1 97                                    .I5..

    Start Time: 1438703085
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
DONE

1.0.2d (通过MacPorts安装)不能与orig generate_cert (0.1)一起使用

% openssl version
OpenSSL 1.0.2d 9 Jul 2015
% openssl s_client -showcerts -connect "${DOCKER_HOST#tcp:\/\/}" -key "${DOCKER_CERT_PATH}/key.pem" -cert "${DOCKER_CERT_PATH}/cert.pem" -CAfile "${DOCKER_CERT_PATH}/ca.pem" -tls1 </dev/null
depth=0 O = Boot2Docker
verify error:num=18:self signed certificate
verify return:1
depth=0 O = Boot2Docker
verify error:num=21:unable to verify the first certificate
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:/O=Boot2Docker
   i:/O=Boot2Docker
-----BEGIN CERTIFICATE-----
MIIC/TCCAeegAwIBAgIRAKt8Sy0ND8z8omBU0uhODVAwCwYJKoZIhvcNAQELMBYx
...
qKFg5oUO9wigoGlwnSjqC/5ZmFRf9B+nWeCUVi/vWl0skOIqCMlDamD8AOVtmtRg
tg==
-----END CERTIFICATE-----
---
Server certificate
subject=/O=Boot2Docker
issuer=/O=Boot2Docker
---
Acceptable client certificate CA names
/O=Boot2Docker
Client Certificate Types: RSA sign, ECDSA sign
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2156 bytes and written 1373 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : ECDHE-RSA-AES256-SHA
    Session-ID: BAE02ACF63C2F4E28C46664CEB8E790DB0F00E8CB75913484BFE88CC215995D2
    Session-ID-ctx: 
    Master-Key: C7227519074A26A51D815655721F18C63932897D731D1BF077B8374F8A021D51EDF2E603386D249ED62127BD71A86048
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket:
    0000 - 14 b0 7a 58 68 91 62 10-14 53 04 cf da 41 63 6e   ..zXh.b..S...Acn
    ...
    0350 - 5f 8e fe fd 9c b0 d0                              _......

    Start Time: 1438703297
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
DONE

0.9.8zd与被黑的generate_cert (0.1.1;不足为奇)

% /usr/bin/openssl s_client -showcerts -connect "${DOCKER_HOST#tcp:\/\/}" -key "${DOCKER_CERT_PATH}/key.pem" -cert "${DOCKER_CERT_PATH}/cert.pem" -CAfile "${DOCKER_CERT_PATH}/ca.pem" -tls1 </dev/null
depth=1 /O=Boot2DockerCA
verify return:1
depth=0 /O=Boot2Docker
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:/O=Boot2Docker
   i:/O=Boot2DockerCA
-----BEGIN CERTIFICATE-----
MIIC/zCCAemgAwIBAgIRAMLl0tA00F2BDjyktFSD5aEwCwYJKoZIhvcNAQELMBgx
...
jhzP4aW3a8uAdpQXjf8nmJ5Qrq4Xb6yWAezXRdmPWfG1u4neBQKy1Zp64PiBd+0v
1UPu
-----END CERTIFICATE-----
---
Server certificate
subject=/O=Boot2Docker
issuer=/O=Boot2DockerCA
---
Acceptable client certificate CA names
/O=Boot2DockerCA
---
SSL handshake has read 2563 bytes and written 2193 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 1E52C9982BE1F98559529B9E804D330ADD5EC8654EE9F3AFE6139B2AEAB24919
    Session-ID-ctx: 
    Master-Key: 0714B120A52F735C484BF0F6612909CEB5FAF27D5E66B3DDB76DCB32FFE506F70E4BC5EFC42BB19E5CBE6223ACEA5803
    Key-Arg   : None
    TLS session ticket:
    0000 - c4 54 e0 2f 90 68 f2 22-7a c9 ee 2f fb da 25 7a   .T./.h."z../..%z
    ...
    0630 - 5c 95 c6 0a e9 bd 21 70-fd                        \.....!p.
    063a - <SPACES/NULS>

    Start Time: 1438703534
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
DONE

1.0.2d _works(!)_:tada::see_no_evil::hear_no_evil::speak_no_evil:被黑了generate_cert (0.1.1)

% openssl s_client -showcerts -connect "${DOCKER_HOST#tcp:\/\/}" -key "${DOCKER_CERT_PATH}/key.pem" -cert "${DOCKER_CERT_PATH}/cert.pem" -CAfile "${DOCKER_CERT_PATH}/ca.pem" -tls1 </dev/null
depth=1 O = Boot2DockerCA
verify return:1
depth=0 O = Boot2Docker
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:/O=Boot2Docker
   i:/O=Boot2DockerCA
-----BEGIN CERTIFICATE-----
MIIC/zCCAemgAwIBAgIRAMLl0tA00F2BDjyktFSD5aEwCwYJKoZIhvcNAQELMBgx
...
jhzP4aW3a8uAdpQXjf8nmJ5Qrq4Xb6yWAezXRdmPWfG1u4neBQKy1Zp64PiBd+0v
1UPu
-----END CERTIFICATE-----
---
Server certificate
subject=/O=Boot2Docker
issuer=/O=Boot2DockerCA
---
Acceptable client certificate CA names
/O=Boot2DockerCA
Client Certificate Types: RSA sign, ECDSA sign
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2899 bytes and written 2111 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : ECDHE-RSA-AES256-SHA
    Session-ID: 0F1A3A0AB7B1E7C1CFD43CED169E730745DEB935C4DBEDDC7CD8AB698ECB8896
    Session-ID-ctx: 
    Master-Key: A48F441FD8677E1602BFB96DC7E9B39D0E9A7241D1C4AF93F3022ACB621C73E16BD69F557FF4428B033B1C07DF5EB0FB
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket:
    0000 - 30 e1 e9 1a 4d e0 48 78-14 22 e8 21 5d 84 e7 6f   0...M.Hx.".!]..o
    ...
    0630 - 27 15 8a 64 ff 2e 24 44-3d d8                     '..d..$D=.

    Start Time: 1438703550
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
DONE

注意事项

为了尝试控制所有更改,请注意,当原始的generate_cert (0.1)发布时,它是在用于构建它的golang:1.3-cross Docker映像可以访问一个程序包时构建的称为ssh 。 该软件包此后已由openssh-client代替。 构建被黑的generate_cert时使用的OpenSSL版本为1.0.1k 。 这似乎是静态链接的:

% ldd generate_cert-0.1.1-linux-amd64
        linux-vdso.so.1 (0x00007ffd0936c000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fddefe7f000)
        libc.so.6 => /lib/libc.so.6 (0x00007fddefb11000)
        /lib64/ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x00007fddf009a000)

因此,看来可能正在发生以下两种情况之一:

  • @tdsmith所建议,当Issuer == Subject时,OpenSSL的最新版本都会感到困惑; 要么
  • 关于OpenSSL中证书生成的其他问题,使得OpenSSL的更高版本无法验证早期证书生成的证书

一种测试方法是在没有我的hack的情况下重建generate_cert ,但使用OpenSSL的更新版本。 接下来,我会做。

因此,看起来@tdsmith是正确的。 撤消我的黑客以确保Issuer <> Subject ,但从generate_cert使用较新版本的OpenSSL重建golang:1.3-cross ,它又以失败告终客户端上的更高版本的OpenSSL:

0.9.8zdgenerate_cert (0.1.2)一起使用更新的OpenSSL

% /usr/bin/openssl version
OpenSSL 0.9.8zd 8 Jan 2015
% /usr/bin/openssl s_client -showcerts -connect "${DOCKER_HOST#tcp:\/\/}" -key "${DOCKER_CERT_PATH}/key.pem" -cert "${DOCKER_CERT_PATH}/cert.pem" -CAfile "${DOCKER_CERT_PATH}/ca.pem" -tls1 </dev/null
depth=1 /O=Boot2Docker
verify return:1
depth=0 /O=Boot2Docker
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:/O=Boot2Docker
   i:/O=Boot2Docker
-----BEGIN CERTIFICATE-----
MIIC/TCCAeegAwIBAgIRAIVQ9IAYtPQwnu/FHM8HNS0wCwYJKoZIhvcNAQELMBYx
...
xZ+XhXvepeJ/mBIui1qT3yAMum0Mj1zLAxqCY/qsEU4odsgU9N9DbUGngoIkBCrY
gw==
-----END CERTIFICATE-----
---
Server certificate
subject=/O=Boot2Docker
issuer=/O=Boot2Docker
---
Acceptable client certificate CA names
/O=Boot2Docker
---
SSL handshake has read 2554 bytes and written 2188 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: FDE088ECF8D0EB2B36EC909B9A66C9C6770AE31355040761CB35150C5A56E92E
    Session-ID-ctx: 
    Master-Key: 86522F869CDE85C8171EEC3A7CF76FDF26F81AE6162DDDEA7D1C55FD5E49E4BDCA56D827C3BFECBFAD9AA2F71A5A94EE
    Key-Arg   : None
    TLS session ticket:
    0000 - 67 d0 60 8e 54 54 7c 7a-3e 5e 71 97 26 e0 06 2c   g.`.TT|z>^q.&..,
    ...
    0630 - cf 68 86 83 d7                                    .h...

    Start Time: 1438705996
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
DONE

1.0.2d (通过MacPorts安装)不能与generate_cert (0.1.2)和更新的OpenSSL一起使用

% openssl version
OpenSSL 1.0.2d 9 Jul 2015
% openssl s_client -showcerts -connect "${DOCKER_HOST#tcp:\/\/}" -key "${DOCKER_CERT_PATH}/key.pem" -cert "${DOCKER_CERT_PATH}/cert.pem" -CAfile "${DOCKER_CERT_PATH}/ca.pem" -tls1 </dev/null
depth=0 O = Boot2Docker
verify error:num=18:self signed certificate
verify return:1
depth=0 O = Boot2Docker
verify error:num=21:unable to verify the first certificate
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:/O=Boot2Docker
   i:/O=Boot2Docker
-----BEGIN CERTIFICATE-----
MIIC/TCCAeegAwIBAgIRAIVQ9IAYtPQwnu/FHM8HNS0wCwYJKoZIhvcNAQELMBYx
...
xZ+XhXvepeJ/mBIui1qT3yAMum0Mj1zLAxqCY/qsEU4odsgU9N9DbUGngoIkBCrY
gw==
-----END CERTIFICATE-----
---
Server certificate
subject=/O=Boot2Docker
issuer=/O=Boot2Docker
---
Acceptable client certificate CA names
/O=Boot2Docker
Client Certificate Types: RSA sign, ECDSA sign
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2156 bytes and written 1373 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : ECDHE-RSA-AES256-SHA
    Session-ID: C2A8BF01E9B754CBF48C69243091C54DAD19DCF52D285C9379B684A3B333AFDD
    Session-ID-ctx: 
    Master-Key: F8510162517AF4C115A13B7CA9E05E04868B4D78CBFA57B28A5B9616EE6FBED6B7B4FC52C2003EBC5D150FA8BDE95F4C
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket:
    0000 - bc bc 2c 3e 2d b0 92 49-80 c2 c0 df 4f bd fb 84   ..,>-..I....O...
    ...
    0350 - 1e c7 c2 b2 e6 f5 74                              ......t

    Start Time: 1438705985
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
DONE

需要SvenDowideit / generate_cert#10。 顺便说一句,如果有人要生成指向我被黑的generate_cert s的b2d图像,则可以尝试使用这些图像,直到正式修复程序发布为止。

如果我理解正确,这_应该_消除了在客户端上玩OpenSSL / Python版本游戏的需要(至少在此问题上)。

标记@SvenDowideit

我与OpenSSL专家来回往来有点。 以下是史蒂夫·汉森的摘要:

From: Stephen Henson via RT <[email protected]>
Subject: [openssl.org #3979] New OpenSSL issue: valid certificate fails validation where subject text == issuer text
Date: August 5, 2015 at 04:32:18 PDT
Cc: [email protected]
Reply-To: [email protected]

... The bug is that OpenSSL 1.0.2 is less strict about
what counts as a valid self signed certificate. Before 1.0.2 the certificate
had to have issuer and subject matching, if present AKID==SKID and
keyUsage (if present) had to include keyCertSign. For1.0.2 and later the
keyCertSign check is no longer present.

The attached patch should fix it. Let me know if it works for you.

A workaround (other than making subject != issuer) is to include SKID/AKID in
all certificates.

Regards, Steve.
--
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.openssl.org

更改b2d生成其证书的方式以容纳有问题的OpenSSL客户端似乎比在客户端修补和安装OpenSSL更好。 我不确定哪种方法更合适(使主题!=颁发者vs.在所有证书中都包含SKID / ADID)。 我会把这个钱交给@SvenDowideit。 :傻笑:

出于好奇(再次,我不认为我们应该走这条路),这是史蒂夫的OpenSSL补丁:

diff --git a/crypto/x509v3/v3_purp.c b/crypto/x509v3/v3_purp.c
index 1f9296a..7a0130a 100644
--- a/crypto/x509v3/v3_purp.c
+++ b/crypto/x509v3/v3_purp.c
@@ -63,6 +63,7 @@
 #include <openssl/x509_vfy.h>

 static void x509v3_cache_extensions(X509 *x);
+static int check_ca(const X509 *x);

 static int check_ssl_ca(const X509 *x);
 static int check_purpose_ssl_client(const X509_PURPOSE *xp, const X509 *x,
@@ -493,7 +494,7 @@ static void x509v3_cache_extensions(X509 *x)
     if (!X509_NAME_cmp(X509_get_subject_name(x), X509_get_issuer_name(x))) {
         x->ex_flags |= EXFLAG_SI;
         /* If SKID matches AKID also indicate self signed */
-        if (X509_check_akid(x, x->akid) == X509_V_OK)
+        if (X509_check_akid(x, x->akid) == X509_V_OK && check_ca(x) == 1)
             x->ex_flags |= EXFLAG_SS;
     }
     x->altname = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);

完整历史记录: httppass = guest&id =

等等... _less_严格吗? 我很困惑_less_严格检查如何在更严格的检查通过的情况下失败?

等等... _less_严格吗? 我很困惑_less_严格检查如何在更严格的检查通过的情况下失败?

是的,我在选择语言时也遇到了麻烦。 查看差异,我认为他的意思是通过不执行太多检查而错误地清除了更多的自签名证书(即,在确定哪些不符合自签名要求时不太严格)。 但是你是对的。 这是一个奇怪的转折。

我没有花太多时间研究OpenSSL的源代码,但是我发现它们在许多地方都很难理解。 从事该项目可能需要“特殊”的心态。 :咧嘴:

我没有花太多时间研究OpenSSL的源代码,但是我发现它们在许多地方都很难理解。 从事该项目可能需要“特殊”的心态。

轻描淡写,我想:wink:。

无论如何,感谢您与OpenSSL人士的联系,很高兴在这里得到解决。 同时,在b2d中解决它似乎是正确的事情。 我认为这里没有什么可以做的,只是等待。

如前所述这里,这个修复我的事情:

pip install requests[security]

@iffy那是一条红鲱鱼; 它可能为您解决了这个问题,因为您有一个与其他OpenSSL链接的缓存二进制轮子。

仅供参考,PR提交为boot2docker / boot2docker#1029。

最新版本的boot2docker提供了此修复程序(感谢@posita!)。 升级:

$ boot2docker upgrade
$ boot2docker delete
$ boot2docker init
$ boot2docker up

那为我解决了这个问题。 请尝试并报告。

或者,切换到Docker Machine ,它现在是新Docker Toolbox的一部分

我仍然有这个问题...

❯ openssl version && docker-compose --version && docker-machine --version && python --version
OpenSSL 1.0.2d 9 Jul 2015
docker-compose version: 1.4.0
docker-machine version 0.4.1 (HEAD)
Python 2.7.10

❯ docker-compose ps
/usr/local/Cellar/fig/1.4.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Name   Command   State   Ports
------------------------------

@chiefy您的

@tdsmith对我不是无害,让我的OCD疯狂:smile:感谢您的提示,现在会升级。

卸载通过brew安装的python版本为我解决了这个问题。 brew remove --force python

我已经卸载了brew版本,但是仍然有Python 2.7.10并且仍然有
SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)错误。

我有下一个设置:

OpenSSL 0.9.8zg 14 July 2015
docker-compose version: 1.4.0
docker-machine version 0.4.1 (e2c88d6)
Python 2.7.10

@chiefy
您解决了问题吗?

有谁知道码头工人组成的家伙正在努力解决这个问题,还是根本不是他们的问题?

问候,

@PavelPolyakov
没有。 在我的两台Mac电脑(10.9.x和10.10.x)上,我都尝试过各种没有变化的事情。 我不认为这是docker-compose事情,更不是Python的FWIW事情。

@chiefy
我同意,但是我还没有找到任何变种来使其工作:(

似乎每个人都已经解决了这个问题,但我却没有解决:)

我曾经使用brew安装了python,我想我已经删除了一个系统,所以我没有选择返回到旧系统的选择。

我尝试通过几种变体安装docker:

  1. 从二进制文件(下载docker工具箱)
  2. 从酿造本身

但是我仍然有:
image

有没有人有如何克服这种行为的综合指南?

问候,

@PavelPolyakov-错误是boot2docker(在某些情况下,我认为是docker-machine)正在构建一些无法通过python的SSL支持使用的证书。 如果您已经升级了所有软件,但仍旧使用了错误的旧证书,则仍然会出错。 因此,在这一点上,我建议您使用当前版本的docker-machine重新配置您拥有的所有开发VM,以便提供新的SSL证书。 这可能涉及在主机上移开~/.docker

@PavelPolyakov@chiefy ,除了@glyph的建议外,您还可以尝试执行此操作(如果您不想完全重新提供boot2docker环境):

% mv ~/.docker ~/.docker.bak
% ssh docker@[boot2dockerip]
docker@[boot2dockerip]'s password: [typically "tcuser"]
...
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker<strong i="10">@boot2docker</strong>:~$ rm -frv ~/.docker
...
docker<strong i="11">@boot2docker</strong>:~$ sudo -s
root<strong i="12">@boot2docker</strong>:/home/docker# rm -v /var/lib/boot2docker/tls/*
...
root<strong i="13">@boot2docker</strong>:/home/docker# shutdown -h now
...

[boot2dockerip]特定于您的VM环境。 可能有更简单的方法(例如,如果使用的是Vagrant, vagrant ssh )。 然后重新启动您的boot2docker实例,看看是否仍然发生SSL错误。

@字形

感谢您的建议,对我来说,重新配置docker-machine并不是问题。 但是,这没有帮助。

当我安装docker&co与:
brew install docker docker-machine docker-compose

然后,不会创建default机器。 而且我不知道如何使用docker-machine create创建它。

当我使用* .pkg文件安装docker-toolbelt时,会创建机器,但是我遇到SSL错误。
我什至尝试做:

docker-machine regenerate-certs default

但这没有帮助。

@posita
也感谢您的建议。
在您的指南中,您建议使用mv ~/.docker ~/.docker-bak -由于什么原因? 一旦执行此操作,就无法再次启动计算机,因为文件已移动。
是的,我能够登录计算机并删除tls/* ,然后将其关闭,但是如何重新启动呢?

如何从头开始重新配置?

@所有
您是通过brew install还是通过toolbelt .pkg安装docker(使用可工作的docker-compose)的方式?
我如何确定docker机器上的证书对python是有效的和有用的,我如何才能将python和openssl甚至比brew can升级得更多,等等?

感谢您的帮助。

问候,

@PavelPolyakov - docker-machine没有“默认”计算机的概念。 您可以运行docker-machine create --driver virtualbox my-docker-machine

@PavelPolyakov完成后,您需要执行eval "$(docker-machine env my-docker-machine)" ,或执行任何选择来调用本地开发机的操作。

@字形
正确,这是运行brew所有内容的缺失部分。 我已经成功配置了名称default (与从* .pkg安装时所做的操作相同)。

但是,像往常一样,我以:
image

:(

在您的指南中,您建议使用mv〜/ .docker〜/ .docker-bak-出于什么原因? 一旦执行此操作,就无法再次启动计算机,因为文件已移动。

@PavelPolyakov ,我不确定。 我不使用docker-machine 。 我在其他环境下猜测。 如果这不起作用,请忽略。

是的,我能够登录计算机并删除tls/* ,然后将其关闭,但是如何重新启动呢?

docker-machine restart不起作用吗?

我的评论基于我自己在Vagrant中运行boot2docker的经验。 它可能不适用于docker-machine 。 听起来@glyph在该环境上有更多经验。 我会尝试他的建议。

您是通过brew install还是通过toolbelt .pkg安装docker(使用可工作的docker-compose)的方式?

这有点超出这个问题的范围(与证书问题,专门处理boot2docker主要表现在以下docker-compose ),但在OS X上,我用的是二进制的建立

@PavelPolyakov ,执行以下操作会发生什么?

docker-machine create --driver virtualbox shiny-new-machine-74d5a19e
eval $( docker-machine env shiny-new-machine-74d5a19e )
docker-compose build

执行以下操作时,将显示boot2docker的版本?

docker-machine ssh shiny-new-machine-74d5a19e

只要不引用现有实例即可随意用shiny-new-machine-74d5a19e替换(即,在执行上述命令之前执行docker-machine ls时,名称不应该出现) )。

@posita
image
image

嗯....:confused: @PavelPolyakov ,这给你什么?

eval $( docker-machine env shiny-new-machine-74d5a19e ) # probably unnecessary if you're still in the same shell as above
which openssl
openssl s_client -showcerts -connect "${DOCKER_HOST#tcp:\/\/}" -key "${DOCKER_CERT_PATH}/key.pem" -cert "${DOCKER_CERT_PATH}/cert.pem" -CAfile "${DOCKER_CERT_PATH}/ca.pem" -tls1 </dev/null

@posita
多谢您继续提供协助。
image

openssl s_client -showcerts -connect "${DOCKER_HOST#tcp:\/\/}" -key "${DOCKER_CERT_PATH}/key.pem" -cert "${DOCKER_CERT_PATH}/cert.pem" -CAfile "${DOCKER_CERT_PATH}/ca.pem" -tls1 </dev/null
http://pastebin.com/Y9ZqfTVG

尝试在不同的OSX机器上执行相同的操作。
随着所有最新的更新(操作系统和Brew软件包),SSL也面临着同样的问题。

image

@PavelPolyakov ,我正在从您的openssl s_client ...转储中查看此内容:

...
Certificate chain
 0 s:/O=shiny-new-machine-74d5a19e
   i:/O=PavelPolyakov
...

这些不是boot2docker默认值,(现在)应该是:

...
Certificate chain
 0 s:/O=Boot2Docker
   i:/O=Boot2Docker
...

在不了解更多信息的情况下,我的猜测是,在配置虚拟机时, docker-machine正在覆盖默认值(以某种方式)。 但是openssl调用似乎有效,所以我不确定这是一个问题,而且我不明白为什么docker-compose会失败。 :confused:

您的以下输出是什么?

(
set -x
eval $( docker-machine env shiny-new-machine-74d5a19e )
env | grep DOCKER
ls -al "${DOCKER_CERT_PATH}"
openssl x509 -in "${DOCKER_CERT_PATH}/cert.pem" -text
openssl x509 -in "${DOCKER_CERT_PATH}/ca.pem" -text
docker-compose --verbose version
docker-compose --verbose ps
DOCKER_TLS_VERIFY=0 docker-compose --verbose ps
) >"${HOME}/Desktop/docker-compose-890-outerr-$( date -u +%Y-%m-%dT%H:%M:%SZ ).txt" 2>&1

这将创建一个像~/Desktop/docker-compose-890-outerr-2015-09-18T14:45:29Z.txt这样的文件,适合粘贴/上传。

@posita
这里是:
http://pastebin.com/vWqZgVKi

我很确定这与您的问题无关,但是您的docker-composedocker-py版本落后了。 这些是最新版本:

...
 docker-compose version: 1.4.1
 docker-py version: 1.4.0
...

另外(而且我可能会误读此信息),看起来您的ca.pemcert.pem共享相同的Subject (这是原始boot2docker问题,但来自另一个方向)。 由于这些证书似乎由docker-machine创建/维护,我怀疑问题出在哪里? 我发现docker / machine#1335和docker / machine#1767可能是相关的,但似乎都没有直接对接。

FWIW,我使用docker-compose (通过安装pipvirtualenv )与OpenSSL和从使用MacPorts安装了Python 2.7。 该版本的OpenSSL受到此问题中确定的问题的影响(并通过对boot2docker的更新来解决)。 对我而言,此组合对boot2docker 1.8.1+和Vagrant毫无问题(我的Vagrantfile处理通过一些置备魔术将boot2docker证书复制回主机):

% cat /.../Vagrantfile
...
         # See <http://tinyurl.com/nz4tgy6>
         boot2docker.vm.provision :shell, inline: "set -e ; while ! docker >/dev/null ps --quiet ; do echo 'Waiting for Docker to come alive so we can kill it...' ; sleep 1 ; done ; sudo /etc/init.d/docker stop ; sudo rm -f /var/lib/boot2docker/tls/*.pem ~docker/.docker/*.pem ; sudo /etc/init.d/docker restart ; while ! docker >/dev/null ps --quiet ; do echo 'Waiting for Docker to come alive again so we can steal its keys...' ; sleep 1 ; done ; echo 'It lives!' ; [ -z \"$( find ~docker/.docker -name '*.pem' 2>/dev/null )\" ] || cp -Rv ~docker/.docker/*.pem '/vagrant/certs" , privileged: true
...
% env | grep DOCKER
DOCKER_HOST=tcp://w.x.y.z:2376
DOCKER_TLS_VERIFY=1
DOCKER_CERT_PATH=/.../certs
% ls "${DOCKER_CERT_PATH}"
ca.pem
cert.pem
key.pem
% openssl x509 -in "${DOCKER_CERT_PATH}/cert.pem" -text
...
        Issuer: O=Boot2DockerCA
...
        Subject: O=Boot2Docker
...
% openssl x509 -in "${DOCKER_CERT_PATH}/ca.pem" -text
...
        Subject: O=Boot2DockerCA
...
% virtualenv --python=python2.7 .../venv
...
% .../venv/bin/pip install docker-compose
...
% .../venv/bin/docker-compose --verbose version
docker-compose version: 1.4.1
docker-py version: 1.4.0
CPython version: 2.7.10
OpenSSL version: OpenSSL 1.0.2d 9 Jul 2015
% .../venv/bin/docker-compose ps
Name   Command   State   Ports
------------------------------

我知道您可能没有这个选择。 我只是将其发布以帮助阐明差异,这可能有助于诊断您的问题。 将以上内容与您创建的docker-machine证书进行比较:

+-zsh:39> openssl x509 -in /.../.docker/machine/machines/shiny-new-machine-74d5a19e/cert.pem -text
...
        Issuer: O=PavelPolyakov
...
        Subject: O=PavelPolyakov
...
+-zsh:40> openssl x509 -in /.../.docker/machine/machines/shiny-new-machine-74d5a19e/ca.pem -text
...
        Subject: O=PavelPolyakov
...

请注意, Subject ca.pemSubjectcert.pemSubject相同。

我认为您的问题不是docker-compose 。 ( @aanand ,也许您可​​以发表评论?)鉴于此问题非常混乱,请考虑为docker / machine提交初步评论开始,我将引用这一内容。

如果决定对docker / machine提出/var/log/docker.log/var/log/boot2docker.log添加有趣的地方。 例如,尝试以下操作:

ssh docker@[machine-instance] grep generate_cert /var/log/boot2docker.log

要么:

docker-machine ssh grep generate_cert /var/log/boot2docker.log

在OSX el capitain上获取此信息,

docker-machine version 0.4.1 (HEAD)
Docker version 1.8.2, build 0a8c2e3
docker-compose version: 1.4.2

@DaveBlooman

只是好奇,您还使用brew安装了python和东西吗? 或另一种方式。
并且您在执行docker-compose build时有确切的错误吗?

通过自制软件,Python 2.7.10

所以肯定有事情要发生,因为brew :(

@DaveBlooman ,另请参阅@PavelPolyakov的问题,那么也许你们两个可以合作进行诊断?

我遇到了同样的问题,这是由于我打开了一个由另一个应用程序(在我的情况下为Astrill)安装的vpn连接的事实,这可能会使网络配置混乱。 希望这可以帮助遇到相同问题的其他人。

我在OSX 10.9.5上收到错误

/usr/local/Cellar/docker-compose/1.5.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Starting compose_maven_1
/usr/local/Cellar/docker-compose/1.5.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Starting compose_ssh_1
/usr/local/Cellar/docker-compose/1.5.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning

Python 2.7.10
docker机器版本0.5.0
docker-compose版本:1.5.0

全部通过Homebrew安装

@anthonygreen ,看起来是一个完全不同的问题。 我没有看到与此处讨论的相同的错误消息。 看来,自制软件的用户会遇到很多与此无关的问题。 请考虑提出新的问题。

我没有看完整个文章,但是在使用Docker Toolbox 1.9.1a的OS X Yosemite上的最新设置中,我看到了相同的错误。

$ docker-machine --version
docker-machine version 0.5.1 (7e8e38e)
$ docker-compose --version
docker-compose version: 1.5.1
$ docker --version
Docker version 1.9.1, build a34a1d5

原来我有一个自定义的CURL_CA_BUNDLE环境变量集(带有一些自定义的内部证书),并且在运行docker-compose之前取消设置此env var允许它克服[SSL: CERTIFICATE_VERIFY_FAILED]错误。

$ (unset CURL_CA_BUNDLE; docker-compose up)
Starting ...

编辑:哎呀,打算在这里评论https://github.com/docker/machine/issues/1880

@pmahoney ,感谢您告知我们其他人! 我永远都不会猜到。 仅供参考,您可能还可以执行以下操作(如果您不需要子外壳):

$ CURL_CA_BUNDLE= docker-compose up

@posita将env var设置为空字符串会产生警告:

$TMPDIR/requests/packages/urllib3/connectionpool.py:768: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html

虽然我没有得到SSL错误。

@pmahoney ,很有趣。 因此,看起来像一个设置但为空的CURL_CA_BUNDLE具有完全不同的语义(即,空重写),而不是根本没有设置它(可能看起来是某个默认位置)。 我试图在文档的行为中找到此方法,但未成功。 我发现的最接近的东西是这个

@neilsarkar我的问题也是Charles代理正在运行! 谢谢!

哦,天哪,我在进行测试的两台计算机上也都自定义了CURL_CA_BUNDLE。

谢谢

erf对我来说一无所有,也没有CURL_CA_BUNDLE变量:(
所以我试图将其设置为一个完全没有成功的值,但是如果我将CURL_CA_BUNDLE设置为空(CURL_CA_BUNDLE =),那么我会发出警告,如@pmahoney所说,它可以正常工作,但是我的终端完全被警告消息所淹没。
我希望有一个更好的解决方案给我:)

如果您知道CURL_CA_BUNDLE变量的好值是多少,我可以考虑:)

谢谢

我在webkit-patch中遇到了同样的问题。 通过查看SSL / TLS模块上ssl.get_default_verify_paths()向我们展示了Python / OpenSSL期望CA证书文件的位置。 因此,如果您在终端中运行此命令:

python3 -c "import ssl; [print(i) for i in ssl.get_default_verify_paths()]"

我们应该看到没有设置SSL_CERT_FILE ,Python的SSL模块期望CA证书文件位于/usr/local/ssl/cert.pem (对于将OpenSSL安装到/usr/local/ssl )。 因此,您可以将SSL_CERT_FILE设置/usr/local/ssl/cert.pem 。 如果您需要根CA证书,请下载curl并在源树中运行lib/mk-ca-bundle.pl然后会生成一个ca-bundle.crt文件。 我可以确认设置SSL_CERT_FILE将与Python 2.7.11和Python 3.5.0的OpenSSL 1.0.2d一起使用。

@grahamc您碰巧解决了这个问题吗? 我有一个与您类似的设置,它与远程docker守护程序非常兼容,但因docker-compose而失败

我得到的错误是ERROR: SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

不,我只是不得不放弃远程Docker主机,不幸的是:(

我刚遇到以下问题,其中CURL_CA_BUNDLE导致docker-compose失败,原因是:

ERROR: SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

docker工作正常。 最好让docker-compose忽略环境变量,或者至少记录一条警告,指出它将不使用预期的证书。

@buckett ,请考虑提出新的问题以将其添加为功能请求。 考虑同时向docker-py提交姊妹问题,并让他们互相引用。 我不确定哪一层最合适。

编辑:创建新的问题#3114

大家都解决了吗? 我仍然收到相同的错误。 我的docker-compose version是:

docker-compose version 1.6.2, build 4d72027
docker-py version: 1.7.2
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014

这是我从docker-compose --verbose build

compose.config.config.find: Using configuration files: ./docker-compose.yml
docker.auth.auth.load_config: File doesn't exist
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "compose/cli/main.py", line 56, in main
  File "compose/cli/docopt_command.py", line 23, in sys_dispatch
  File "compose/cli/docopt_command.py", line 26, in dispatch
  File "compose/cli/main.py", line 189, in perform_command
  File "compose/cli/command.py", line 52, in project_from_options
  File "compose/cli/command.py", line 85, in get_project
  File "compose/cli/command.py", line 68, in get_client
  File "site-packages/docker/api/daemon.py", line 78, in version
  File "site-packages/docker/utils/decorators.py", line 47, in inner
  File "site-packages/docker/client.py", line 112, in _get
  File "site-packages/requests/sessions.py", line 477, in get
  File "site-packages/requests/sessions.py", line 465, in request
  File "site-packages/requests/sessions.py", line 573, in send
  File "site-packages/requests/adapters.py", line 431, in send
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

我通过Docker的工具箱安装了docker,docker-mahine和docker-compose。

我已经尝试了以上所有建议,但是没有运气。 我没有docker经验,所以我自己也无法弄清楚。

是否有人对此有根本原因或解决方法? 我在带有更新的openssl版本的1.7.0版中看到了它。
这些都是从高山构建和运行的,因此环境应该是纯净的:

/usr/src/app # env | sed 's/DOCKER_HOST=.*/DOCKER_HOST=#redacted/' && docker version && docker ps && docker-compose version && docker-compose pull
HOSTNAME=aebfe81b5938
SHLVL=1
PYTHON_PIP_VERSION=8.1.1
HOME=/root
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
DOCKER_TLS_VERIFY=1
TERM=xterm
DOCKER_CERT_PATH=/certs
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LANG=C.UTF-8
PYTHON_VERSION=3.5.1
DOCKER_HOST=#redacted
PWD=/usr/src/app
Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 21:49:11 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 15:39:25 2016
 OS/Arch:      linux/amd64
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
docker-compose version 1.7.0, build 0d7bf73
docker-py version: 1.8.0
CPython version: 3.5.1
OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
Pulling registry (registry:2)...
ERROR: SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)

@jmmills
在我的情况下,它是由重新定义的CURL_CA_BUNDLE env变量引起的。 您还应该检查是否有这种情况。

@PavelPolyakov检查我的环境转储...否CURL_CA_BUNDLE

@PavelPolyakov好的,这很奇怪,尽管我不在我的环境中,但我明确地取消设置了env变量并且它起作用了。

@jmmills呵呵...这里也是。 也许python对待set-as-empty的区别在于unset?

Mac OS,使用系统python的自制软件docker-compose和docker-machine。 新创建的计算机具有: docker-machine create --driver=vmwarefusion --vmwarefusion-memory-size 1536 dev

env | grep CURL返回任何内容
docker-compose ps返回

错误:SSL错误:主机名“ 172.16.129.133”与“本地主机”不匹配

CURL_CA_BUNDLE='' docker-compose ps返回:

/usr/local/Cellar/docker-compose/1.7.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py:768: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)
/usr/local/Cellar/docker-compose/1.7.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py:768: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)
Name   Command   State   Ports 
------------------------------

我已经完全一样了- CURL_CA_BUNDLE没有在我的环境中设置,并将其设置为空字符串给了我与@inanimatt相同的输出。

它肯定闻起来像一个上游错误,我想是curl的一些环境兼容性代码,其中对“ defined”和“ empty”的处理方式有所不同。

谢谢,
杰森·米尔斯(Jason Mills)

  • 由手机发出。

2016年4月24日上午6:14,Alex Wilson [email protected]写道:

我已经完全一样了-在我的环境中没有设置CURL_CA_BUNDLE,并且将其设置为空字符串给了我与@inanimatt相同的输出。

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件或在GitHub上查看

似乎只影响自制软件版本-安装自制Python,然后通过pip安装docker-compose解决了所有错误。

2016年4月24日,14:14,Alex Wilson [email protected]写道:

我已经完全一样了-在我的环境中没有设置CURL_CA_BUNDLE,并且将其设置为空字符串给了我与@inanimatt相同的输出。

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件或在GitHub上查看

我相信我之前曾在Linux上粘贴过该问题的复制。 我明天在工作站时可以仔细检查

谢谢,
杰森·米尔斯(Jason Mills)

  • 由手机发出。

2016年4月24日,下午12:22,Matt Robinson [email protected]写道:

似乎只影响自制软件版本-安装自制Python,然后通过pip安装docker-compose解决了所有错误。

2016年4月24日,14:14,Alex Wilson [email protected]写道:

我已经完全一样了-在我的环境中没有设置CURL_CA_BUNDLE,并且将其设置为空字符串给了我与@inanimatt相同的输出。

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件或在GitHub上查看

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件或在GitHub上查看

这里同样的问题,因为我使用brew将docker-compose更新为1.7版。

$ docker-compose ps
ERROR: SSL error: hostname '192.168.99.100' doesn't match 'localhost'
$ docker-compose version
docker-compose version 1.7.0, build unknown
docker-py version: 1.8.0
CPython version: 2.7.10
OpenSSL version: OpenSSL 0.9.8zh 14 Jan 2016

清空CURL_CA_BUNDLE env var可以解决该问题:

CURL_CA_BUNDLE= docker-compose ps
/opt/boxen/homebrew/Cellar/docker-compose/1.7.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py:768: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)
/opt/boxen/homebrew/Cellar/docker-compose/1.7.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py:768: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)
/opt/boxen/homebrew/Cellar/docker-compose/1.7.0/libexec/vendor/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py:768: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)
   Name                 Command               State    Ports
------------------------------------------------------------

降级到1.6.2也可以解决该问题。

$ brew switch docker-compose 1.6.2
Cleaning /opt/boxen/homebrew/Cellar/docker-compose/1.4.2
Cleaning /opt/boxen/homebrew/Cellar/docker-compose/1.5.1
Cleaning /opt/boxen/homebrew/Cellar/docker-compose/1.5.2
Cleaning /opt/boxen/homebrew/Cellar/docker-compose/1.6.0
Cleaning /opt/boxen/homebrew/Cellar/docker-compose/1.6.2
Cleaning /opt/boxen/homebrew/Cellar/docker-compose/1.7.0
3 links created for /opt/boxen/homebrew/Cellar/docker-compose/1.6.2
$ docker-compose ps
   Name                 Command               State    Ports
------------------------------------------------------------

您可以使用以下命令运行而不是禁用CURL_CA_BUNDLE:
CURL_CA_BUNDLE =〜/ .docker / machine / machines / default / ca.pem docker-compose ps

我可能不是第一个提出这个问题的人,但是,curl环境变量对不相关的Python应用程序有何影响,这不是很直观吗?

谢谢,
杰森·米尔斯(Jason Mills)

  • 由手机发出。

2016年5月7日下午3:22,Lorenzo Sicilia [email protected]写道:

您可以使用以下命令运行而不是禁用CURL_CA_BUNDLE:
CURL_CA_BUNDLE =〜/ .docker / machine / machines / default / ca.pem docker-compose ps

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件或在GitHub上查看

我遇到了这个问题,问题出在环境变量REQUESTS_CA_BUNDLE指向自签名证书的自定义位置。 装箱可以帮助任何人。

  • 迈克尔·霍什

@aboutlo可行-它不适用于其他ca.pem文件,仅适用于此文件。 我也在Windows上,所以我有一个更多的伏都教配置,谢谢!

卸载ndg-httpsclient(使用pip-版本为0.4.0)已为我解决了此问题,请在此处查看我的帖子: https :

我调试了docker-compose和docker-py,发现应该在命令中使用环境变量或选项。 您不应该混合这些。 如果甚至在命令中指定--tls,则必须将所有选项都指定为TLSConfig对象,因为现在TLSConfig对象是完全从命令选项创建的,并且要对从环境变量创建的TFSConfig对象进行操作。

@ m-housh OMG感谢您的提示! 完全一样的事情发生在我身上! 从我的环境中删除了REQUESTS_CA_BUNDLE ,并为我解决了此问题。

我遇到了同样的问题。 首先我虽然是因为OpenSSL版本差异(Pyhton的版本为1.0.2,而OS的版本为0.9.8),但我都将它们都设置为1.0.2,但仍然无法正常工作。
我已经通过简单地SSH到docker解决了我的问题,然后使用授权密钥检查了我的证书并对其进行了更新。 有趣的是,那是错误的证书。

请按照以下步骤操作:

boot2docker ssh
docker<strong i="10">@boot2docker</strong>:~$ cat .ssh/authorized_keys

检查此证书是否真的是您计算机上的证书。 如果不是,只需将您的文件复制到此文件并保存。 然后运行:

docker-compose up

这对我有用,希望对您有所帮助。

问题梳理:这里描述了各种不同的故障模式和用户错误/配置错误情况(大部分都是历史性的)。

我没有看到任何迹象表明正在编写中的一个正在进行的问题,因此我正在关闭问题。 如果你仍然看到了现代版本相关的错误,那么请打开一个新的问题与您的方案等的全部细节

此页面是否有帮助?
0 / 5 - 0 等级