文章目录

  • 服务器操作(Linux)
  • 开发机器操作
  • 一键脚本


服务器操作(Linux)

  1. 在任意目录创建证书文件夹,并进入该文件夹,例如
mkdir -p /home/ca
cd /home/ca
  1. 生成ca-key.pem 文件 设置密码
openssl genrsa -aes256 -out ca-key.pem 4096

需要输入两次相同的密码,期间看到的提示为:

Generating RSA private key, 4096 bit long modulus
..............................................................................................................++
..++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:
Verifying - Enter pass phrase for ca-key.pem:

完成后会看到文件夹里出现了 ca-key.pem 文件

  1. 生成 ca.pem 文件,设置国家、省市、组织名、邮箱
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

需要输入刚才的密码,国家填CN,其他信息可以随便填,期间看到的提示为:

Enter pass phrase for ca-key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:xxx
Locality Name (eg, city) [Default City]:xxx
Organization Name (eg, company) [Default Company Ltd]:xxx
Organizational Unit Name (eg, section) []:xxx
Common Name (eg, your name or your server's hostname) []:xxx
Email Address []:xxxxxxx@xxx.com

完成后会看到文件夹里出现了 ca.pem 文件

  1. 生成 server-key.pem 文件
openssl genrsa -out server-key.pem 4096

期间看到的其实为:

Generating RSA private key, 4096 bit long modulus
..........................++
.............................++
e is 65537 (0x10001)

完成后会看到文件夹里出现了 server-key.pem 文件

  1. 生成 server.csr 文件
openssl req -subj "/CN=服务器的IP或域名" -sha256 -new -key server-key.pem -out server.csr

没有报错的话会看到文件夹里出现了 server.csr 文件

  1. 生成配置文件 extfile.cnf
echo subjectAltName = IP:服务器的IP,IP:0.0.0.0 >> extfile.cnf

echo subjectAltName = DNS:服务器的域名,IP:0.0.0.0 >> extfile.cnf

然后将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证

echo extendedKeyUsage = serverAuth >> extfile.cnf

完成后会看到文件夹里出现了 extfile.cnf文件,打开可以看到刚才输入的两行配置

  1. 生成服务器证书,需要输入之前输入的密码
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf

完成后会看到文件夹里出现了 ca.srlserver-cert.pem 文件

  1. 添加配置,使密钥适合客户端身份验证
echo extendedKeyUsage = clientAuth >> extfile.cnf
  1. 生成 key.pem 文件
openssl genrsa -out key.pem 4096

完成后会看到文件夹里出现了 key.pem文件

  1. 创建client.csr文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

完成后会看到文件夹里出现了 client.csr文件

  1. 生成证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf

完成后会看到文件夹里出现了 cert.pem 文件

  1. 删除多余文件
rm -v -f client.csr server.csr
  1. 修改权限,要保护您的密钥免受意外损坏,请删除其写入权限。要使它们只能被您读取,更改文件模式
chmod -v 0400 ca-key.pem key.pem server-key.pem

删除写入权限以防止意外损坏

chmod -v 0444 ca.pem server-cert.pem cert.pem
  1. 复制证书到指定目录
cp server-*.pem  /etc/docker/

cp ca.pem /etc/docker/
  1. 修改Docker配置,使Docker守护程序仅接受来自提供CA信任的证书的客户端的连接
    修改文件 /lib/systemd/system/docker.service将其中的
ExecStart=/usr/bin/dockerd

修改为

ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
  1. 重新加载daemon并重启docker
systemctl daemon-reload

然后

systemctl restart docker
  1. 开放2376端口
    通过防火墙、或阿里云控制台等操作
  2. 重启docker
service docker restart

开发机器操作

  1. 下载如下文件到本地:ca.pem cert.pem key.pem ,将该文件夹配置为证书文件夹
  2. 连接URL: https://服务器IP:2376

一键脚本

#创建 Docker TLS 证书
#!/bin/bash
 

SERVER="服务器IP"
PASSWORD="密码"
COUNTRY="CN"
STATE="state"
CITY="city"
ORGANIZATION="Dev"
ORGANIZATIONAL_UNIT="Dev"
EMAIL="123@139.com"

#临时文件夹
TEMP_DIR='/home/ca'

mkdir -p ${TEMP_DIR}
cd ${TEMP_DIR}

#生成`ca-key.pem` 文件 设置密码
openssl genrsa -aes256 -passout pass:${PASSWORD} -out ca-key.pem 4096 
echo "生成ca私钥完成"


#生成 `ca.pem` 文件,设置国家、省市、组织名、邮箱

openssl req -new -x509  -passin "pass:${PASSWORD}"  -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/C=${COUNTRY}/ST=${STATE}/L=${CITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/emailAddress=${EMAIL}"
echo "填写配置信息完成"

#生成 `server-key.pem` 文件

openssl genrsa -out server-key.pem 4096

#生成 `server.csr` 文件

openssl req -subj "/CN=${SERVER}" -sha256 -new -key server-key.pem -out server.csr

#生成配置文件 `extfile.cnf` 

echo subjectAltName = IP:${SERVER},IP:0.0.0.0 >> extfile.cnf

echo extendedKeyUsage = serverAuth >> extfile.cnf

#生成服务器证书,需要输入之前输入的密码
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem  -passin "pass:${PASSWORD}"  \-CAcreateserial -out server-cert.pem -extfile extfile.cnf

echo "生成自签证书完成"

#添加配置,使密钥适合客户端身份验证
echo extendedKeyUsage = clientAuth >> extfile.cnf
#生成 `key.pem` 文件
openssl genrsa -out key.pem 4096
#创建`client.csr`文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
#生成证书
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:${PASSWORD}" \-CAcreateserial -out cert.pem -extfile extfile.cnf
echo "生成client自签证书完成"
rm -v -f client.csr server.csr
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
echo "复制证书到指定目录"
cp server-*.pem  /etc/docker/
cp ca.pem /etc/docker/

systemctl daemon-reload 
systemctl restart docker