服务器操作(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