Centos7 nginx代理docker私有仓库加SSL验证

关于docker私有库的搭建已经在上一篇文章中写了,下面我们直接进入主题。
(以下配置均在私有仓库所在的服务器上)

步骤一: 安装nginx

1.安装nginx 源

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2.安装nginx

yum install -y nginx

步骤二:nginx配置80端口代理registry

1.创建配置文件

cd /etc/nginx/conf.d/
touch docker-registry.conf

2.编辑配置文件写入以下内容

upstream docker-registry {
	server localhost:5000;
}

server {
	listen 80;
	server_name  192.168.118.207;
	
	location / {
		proxy_pass http://docker-registry;
		proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_read_timeout 900;
	}

这里的配置只要是将对80端口的访问转发到仓库,这里需要注意以下几点
(1)server_name 为你私有库所在服务器的IP或者域名
(2)80端口不能被占用。当然,如果80端口被占用了,你也可以修改成别的没被占用的端口号。
(3)如果你listen 的是80端口,那么server_name 就不能填 localhost,会有冲突,反过来如果server_name 填localhost的话,那么listen除了80端口以外的端口号都可以。
(4)可以删掉server_name 这一行配置,但是会对80端口失效,换其他端口可以。

3 重启nginx使配置生效

nginx -s reload

4.测试nginx

curl   <ip>:<端口号>/v2/_catalog

此处ip和端口为刚刚配置文件配置的server_name和listen
在这里插入图片描述
如果能看到仓库里的数据,说明配置成功。

步骤三: 安装、 配置openssl工具

1.openssl、openssl-devel 安装

yum install -y openssl openssl-devel

2.openssl 配置

OpenSSL工具配置文件openssl.cnf,对于Centos,目录在/etc/pki/tls/中

vim  /etc/pli/tls/openssl.cnf

编辑 openssl.cnf ,在[v3_ca]下面添加:subjectAltName = IP:域名|IP:地址,
这里为私有库所在服务器IP地址或域名

例:

[ v3_ca ]
subjectAltName = IP:192.168.130.107

否则后面使用的时候会报以下错误:

x509: cannot validate certificate for <ipaddress> because it doesn't contain any IP SANs

步骤四:生成证书

1.可以在任意文件夹中生成证书,但是需要记住路径,后面要用到

cd /etc/ssl/certs/

openssl req -newkey rsa:2048 -nodes -keyout registry-docker.key -x509 -days 3650 -out registry-hook.crt -subj /C=CN/ST=GD/L=GZ/O=Acc/OU=NT/CN=172.10.15.110/[email protected]

这里主要是生成RSA私钥和自签名证书

具体的命令解析自行百度,这里只说下 -subj 部分

-subj : 指定证书信息,如果不加的话会有个交互性的输入信息的过程,如下图
在这里插入图片描述
所以 -subj 简化了这个过程,这里/CN=最好是填私有库所在服务器的IP或域名

/C=Country Name
/ST=State or Province Name
/L=Locality Name
/O=Organization Name
/OU=Organizational Unit Name
/CN=Common Name (eg, your name or your server’s hostname)
/emailAddress=emailAddress

执行成功后会生成两个文件在这里插入图片描述
2.将生成的自签名证书追加到系统的证书管理文件中

cat ./registry-docker.crt >> /etc/pki/tls/certs/ca-bundle.crt

否则后面push和login和pull时会报如下错误:

Get https://<IpAddress>/v2/: x509: certificate signed by unknown authority

步骤五 :nginx 中配置 ssl

1.配置

vim /etc/nginx/conf.d/docker-registry.conf

编辑之前新建的nginx配置文件,将之前的内容修改成以下内容

upstream docker-registry {
        server localhost:5000;
}

server {
        listen 80;
        server_name <ip或者域名>;
        location / {
                return 301 https://$host$request_uri;
        }
}

server {
        listen 443;
        server_name <ip或者域名>;

        client_max_body_size 3000m;

        # SSL
        ssl on;
        ssl_certificate /etc/ssl/certs/registry-hook.crt;
        ssl_certificate_key /etc/ssl/certs/registry-hook.key;

        # To add basic authentication to v2 use auth_basic
        #auth_basic "Please Auth First";
        #auth_basic_user_file /etc/ssl/certs/docker_registry.password;

        location / {
                proxy_pass http://docker-registry;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_read_timeout 900;
        }
}

第一个server是将匹配 server_name 指定的IP/域名的80端口的请求全重定向到第二个server上,即将该IP/域名下所有http协议的请求重定向到https协议上(既是屏蔽了http协议)。
第二个server是监听 server_name 指定的IP/域名的443端口(既是https协议)的请求,重定向到到私有库。

开启ssl验证
ssl on ;

指定私钥和证书 (之前生成的)
ssl_certificate /etc/ssl/certs/registry-hook.crt;
ssl_certificate_key /etc/ssl/certs/registry-hook.key;

开启使用“HTTP基本认证”(HTTP Basic Authentication)协议的用户名密码验证,这一块是下个步骤准备做的事情,先注释了。
#To add basic authentication to v2 use auth_basic
#auth_basic “Please Auth First”;
#auth_basic_user_file /usr/local/nginx/auth/htpasswd.txt;

配置好后重启 nginx ,使配置文件生效

nginx -s reload

重启 docker 和私有库容器 ,不重启可能加载私钥失败

systemctl restart docker

docker  start  <私有库容器ID或容器名>

2.测试
在这里插入图片描述
tag命令时直接指定我们配置好的ip和端口号,push成功则我们配置没问题。

步骤六:使用HTTP协议的用户名密码验证

1.安装htpasswd

yum install -y htpasswd

2.生成密码文件

htpasswd -bcd /etc/ssl/certs/docker_registry.password  username passwd

上面这个命令是生成密码文件并添加一个用户和密码
-c 创建文件
-b 直接在命令后输入账号和密码,而不需要交互式的输入
-d 采用CRYPT算法对密码进行加密
路径、文件名 、username 和passwd随你指定,但是要记住,后面用得到。

如果还需要添加用户名密码的话

htpasswd  -b /etc/ssl/certs/docker_registry.passord newusername newpasswd

该命令对于已有的用户名会update 密码。

3.nginx配置auth_basic

vim /etc/nginx/conf.d/docker-registry.conf

把之前注释了的auth_basic两行代码释放出来

 # To add basic authentication to v2 use auth_basic
 auth_basic "Please Auth First";
 auth_basic_user_file /etc/ssl/certs/docker_registry.password;

这里auth_basic_user_file 为我们刚创建的密码文件路径

保存后 重启下 nginx 使配置生效

nginx -s reload

4.测试
在这里插入图片描述
直接push,失败 ,提示no basic auth credentials

然后我们用我们创建的用户名和密码登录

docker login ip 

在这里插入图片描述
用 --username 和–password 可以省略交互式的用户名密码输入过程

登录成功后我们再push
在这里插入图片描述
push 成功!
至此,nginx 代理,ssl验证,HTTP基本认证协议的用户名密码验证配置结束!!

猜你喜欢

转载自blog.csdn.net/Fickle_actor/article/details/88851744