目录
一、Docker中启用HTTPS有几个重要的原因
二、https介绍
三、https过程
四、安装docker-20.10.18
五、如何获取证书
通过阿里云获取证书
六、docker部署nginx并且实现https
6.1准备证书
6.2准备nginx.conf 和 index.html文件
6.3生成容器
6.4浏览器验证证书
一、Docker中启用HTTPS有几个重要的原因
-
安全性:HTTPS通过加密数据传输,可以确保数据在传输过程中不被窃听或篡改。这对于保护敏感信息(如用户凭据、支付信息等)的传输至关重要。
-
数据完整性:HTTPS可以验证数据的完整性,确保数据在传输过程中没有被篡改或损坏。
-
信任度:使用HTTPS可以增强用户对网站的信任度,因为浏览器通常会显示安全的锁图标或绿色地址栏来指示连接是安全的。
-
SEO优化:搜索引擎(如Google)通常会更喜欢使用HTTPS的网站,并将其排名更靠前。因此,启用HTTPS可以对网站的搜索引擎优化(SEO)产生积极影响。
-
合规性:一些法规和标准要求网站必须使用HTTPS来保护用户数据,如GDPR(欧盟一般数据保护条例)。
总的来说,启用HTTPS可以提高网站的安全性、可信度,同时符合法规要求,因此在Docker中启用HTTPS是一个很好的实践。
二、https介绍
Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
三、https过程
-
客户端发起HTTPS请求
用户在浏览器里输入一个 https 网址,然后连接到服务器的 443 端口
-
服务端的配置 采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥
-
传送服务器的证书给客户端 证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等
-
客户端解析验证服务器证书 这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书中公钥对该随机值进行非对称加密
-
客户端将加密信息传送服务器 这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加感解密了
-
服务端解密信息 服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值
-
服务器加密信息并发送信息 服务器将数据利用随机值进行对称加密,再发送给客户端
-
客户端接收并解密信息 客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容
四、安装docker-20.10.18
systemctl stop firewalld.service
setenforce 0
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
-----------------------------------------------------------------------------------------
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
-----------------------------------------------------------------------------------------
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce-20.10.18 docker-ce-cli containerd.io ##安装20版本
systemctl start docker.service
systemctl enable docker.service
-----------------------------------------------------------------------------------------
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
-----------------------------------------------------------------------------------------
docker version #查看 docker 版本信息
五、如何获取证书
-
在阿里云、华为云、腾讯云等云服务商那里申请一年有效期的免费证书或者购买证书
-
在本地使用 openssl、mkcert、cfssl、certbot(Let's Encrypt)的工具生成本地私钥证书
通过阿里云获取证书
https://www.aliyun.com/product/cas?userCode=r3yteowb
六、docker部署nginx并且实现https
6.1准备证书
cd /opt
--------------------------------------
vim certificate.sh
CA_SUBJECT="/O=kgc/CN=ca.kgc.com"
SUBJECT="/C=CN/ST=js/L=nj/O=kgc/CN=www.kgc.com"
SERIAL=34
EXPIRE=202002
FILE=kgc.com
openssl req -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt
openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key -subj $SUBJECT -out ${FILE}.csr
openssl x509 -req -in ${FILE}.csr -CA ca.crt -CAkey ca.key -set_serial $SERIAL -days $EXPIRE -out ${
FILE}.crt
chmod 600 ${FILE}.key ca.key
bash certificate.sh
#执行该脚本后执行后会生成ca.crt ca.key certificate.sh kgc.com.crt kgc.com.csr kgc.com.key 这几个文件,需要对其进行处理
# kgc.com.crt(购买者) ca.crt(b颁发者) www.kgc.com.key(验证钥匙)
cat kgc.com.crt ca.crt > www.kgc.com.crt
mv kgc.com.key www.kgc.com.key
#在/mnt下创建一个cert的文件夹,用于存放证书文件
[root@localhost opt]#hostnamectl set-hostname zzz
[root@localhost opt]#su
[root@zzz opt]#mkdir /mnt/cert
[root@zzz opt]#mv /opt/www.kgc.com.crt /opt/www.kgc.com.key /mnt/cert
[root@zzz opt]#
[root@zzz opt]#ll /mnt/cert
总用量 8
-rw-r--r-- 1 root root 2201 5月 4 13:59 www.kgc.com.crt
-rw------- 1 root root 1704 5月 4 13:56 www.kgc.com.key
6.2准备nginx.conf 和 index.html文件
[root@zzz opt]#cd /mnt
[root@zzz mnt]#ls
cert
[root@zzz mnt]#echo "hello nanjing" > index.html
[root@zzz mnt]#ls
cert index.html
[root@zzz mnt]#cat index.html
hello nanjing
[root@zzz mnt]#rz -E
rz waiting to receive.
[root@zzz mnt]#ls
cert index.html nginx(1).conf
[root@zzz mnt]#mv nginx\(1\).conf nginx.conf
[root@zzz mnt]#ls
cert index.html nginx.conf
[root@zzz mnt]#pwd
/mnt
[root@zzz mnt]#
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
listen 443 ssl;
ssl_certificate /mnt/www.kgc.com.crt;
ssl_certificate_key /mnt/www.kgc.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.kgc.com;
root /usr/share/nginx/html;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
6.3生成容器
[root@zzz mnt]#docker run -itd -p 8080:80 -p 8082:443 -v /mnt/nginx.conf:/etc/nginx/nginx.conf -v /mnt/index.html:/usr/share/nginx/html/index.html -v /mnt/cert/:/mnt/ --name nginx nginx:latest
48944bdf4b31909ee2fc37c3acd16bf1fd4f804f6a00e9a011b9f8a5223657b5
[root@zzz mnt]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48944bdf4b31 nginx:latest "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:8082->443/tcp, :::8082->443/tcp nginx
[root@zzz mnt]#
[root@zzz mnt]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
#生成容器,指定容器内80端口映射到本机的8080端口,指定容器内443端口映射到本机的8082端口
#将/mnt/nginx.conf挂载到容器内/etc/nginx/nginx.conf下,
#将/mnt/index.html挂载到容器内的/usr/share/nginx/html/index.html,将容器内的index.html覆盖掉
#将/mnt/cert挂载到容器内的/mnt下,/mnt/cert下的所有文件都会出现在容器的/mnt下
#别名为 nginx 使用 nginx:latest 镜像生成并启动