服務器端:使用registry v2.1啓動容器。
客戶端:安裝了Docker的機器,準備pull/push操做html
實驗條件:
registry端生成私鑰以及證書:
node
1 |
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt |
並啓動:
docker
1 |
docker run -d -p 5000:5000 --restart=always \ |
測試不安全的訪問:
docker端不存放證書。直接下載鏡像
安全
1 |
docker pull registry.test.com:5000/test-busybox:v1 |
提示錯誤:服務器
Error response from daemon: unable to ping registry endpoint https://registry.test.com:5000/v0/ v2 ping attempt failed with error: Get https://registry.test.com:5000/v2/: x509: certificate signed by unknown authority v1 ping attempt failed with error: Get https://registry.test.com:5000/v1/_ping: x509: certificate signed by unknown authority
表示訪問的是安全倉庫,可是禁止訪問。一樣若是docker push的話也會提示:dom
The push refers to a repository [registry.test.com:5000/test-busybox] (len: 1) unable to ping registry endpoint https://registry.test.com:5000/v0/ v2 ping attempt failed with error: Get https://registry.test.com:5000/v2/: x509: certificate signed by unknown authority v1 ping attempt failed with error: Get https://registry.test.com:5000/v1/_ping: x509: certificate signed by unknown authority
這個時候能夠開啓docker daemon的不安全訪問,即在/etc/defaults/docker文件裏,找到DOCKER_OPT參數,在後面追加–insecure-registry registry.test.com:5000。並重啓docker daemon。curl
再次測試docker push 和 docker pull。成功。測試
此時測試:
this
1 |
curl -XGET https://registry.test.com:5000/v2/_catalog |
提示禁止訪問:url
curl: (60) SSL certificate problem: self signed certificate More details here: http://curl.haxx.se/docs/sslcerts.html curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option. If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL). If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option.
若是使用-k 或者 –insecure參數的話能夠訪問到registry的相應內容。
測試安全訪問,證書存放在/etc/docker/certs.d/registry.test.com:5000/下面。
實驗條件,首先使用scp命令將registry端前面生成的domain.crt拷貝到docker端。而後建立路徑:/etc/docker/certs.d/registry.test.com:5000/,並將domain.crt複製過去。
測試docker pull / docker push。可成功。說明此證書是即刻生效的。
若是將domain.crt從該路徑移走,docker pull / docker push失敗。
對於curl的測試:
curl -XGET方式提示禁止訪問
curl –insecure方式可訪問
而使用證書的訪問:
1 |
curl --cacert /etc/docker/certs.d/registry.test.com\:5000/domain.crt -XGET https://registry.test.com:5000/v2/_catalog |
是成功的。
測試安全訪問,證書放在/usr/local/share/ca-certificate/domain.crt。
實驗條件,首先使用scp命令將registry端前面生成的domain.crt拷貝到docker端,而後再移動到路徑:/usr/local/share/ca-certificate/下。
此時進行docker push / docker pull是失敗的。須要更新證書。
使用命令更新證書:
1 |
update-ca-certificate |
如今再docker push / docker pull仍失敗。還須要重啓docker daemon。
重啓以後的docker push / docker pull是成功的。
測試curl,若是不帶證書的訪問,一樣能夠正常訪問。
一樣,再移除了/usr/local/share/ca-certificate/domain.crt以後,更新update-ca-certificate以後,docker pull / docker push仍成功。
在重啓了docker daemon以後,docker push / docker pull失敗。
對於使用了SSL方式進行受權訪問的私有docker registry。對於它的訪問,有3種方式:
1. 修改docker daemon的配置,添加--insecure-registry ...的形式訪問。 2. 將證書拷貝到docker的certs.d路徑下,證書只對docker daemon生效,當即生效 3. 將證書拷貝到/usr/local/share/ca-certificate/....的路徑裏,證書在更新update-ca-certificate以後全局生效,docker daemon需重啓
經過將擁有證書的一方視爲可信的一方來受權訪問是沒有問題的。在這種形式裏,雙方都認爲對方是可信的。
但前面也提示了能夠加–insecure參數進行不安全訪問,這表示docker端不在乎registry是否可信,而registry端也並不阻攔docker端的訪問。這樣安全性就下降了不少。
經過update-ca-certificates的man page能夠了解到,
它會更新/etc/ssl/certs,並讀取/etc/ca-certificates.conf,這個文件中每行都是在/usr/share/ca-certificates的文件都是可信的。
而在/usr/local/share/ca-certificates下的.crt文件也視做可信
通常ca-certificate路徑有:
/etc/ca-certificates /usr/share/ca-certificates /usr/share/doc/ca-certificates /usr/local/share/ca-certificates
來源:http://man.he.net/man8/update-ca-certificates
docker 運行以後會在/var/lib/docker/aufs/diff/UID/xxx/ca-certificates,這樣的路徑,是指運行的容器?UID數量和docker ps 對應的容器數是同樣的。