文章目录
- 服务器操作(Linux)
- 开发机器操作
- 一键脚本
服务器操作(Linux)
- 在任意目录创建证书文件夹,并进入该文件夹,例如
mkdir -p /home/ca
cd /home/ca
- 生成
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
文件
- 生成
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
文件
- 生成
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
文件
- 生成
server.csr
文件
openssl req -subj "/CN=服务器的IP或域名" -sha256 -new -key server-key.pem -out server.csr
没有报错的话会看到文件夹里出现了 server.csr
文件
- 生成配置文件
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
文件,打开可以看到刚才输入的两行配置
- 生成服务器证书,需要输入之前输入的密码
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.srl
和 server-cert.pem
文件
- 添加配置,使密钥适合客户端身份验证
echo extendedKeyUsage = clientAuth >> extfile.cnf
- 生成
key.pem
文件
openssl genrsa -out key.pem 4096
完成后会看到文件夹里出现了 key.pem
文件
- 创建
client.csr
文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
完成后会看到文件夹里出现了 client.csr
文件
- 生成证书
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
文件
- 删除多余文件
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
- 复制证书到指定目录
cp server-*.pem /etc/docker/
和
cp ca.pem /etc/docker/
- 修改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
- 重新加载daemon并重启docker
systemctl daemon-reload
然后
systemctl restart docker
- 开放2376端口
通过防火墙、或阿里云控制台等操作 - 重启docker
service docker restart
开发机器操作
- 下载如下文件到本地:
ca.pem
cert.pem
key.pem
,将该文件夹配置为证书文件夹 - 连接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