将网络模式设置成桥接模式:
由于是通过Vmare虚拟机部署的Nginx服务,而虚拟机默认的NAT模式是不支持其他机器进行访问的,即只能本机访问(虚拟机或本机),所以要把他改成桥接模式,然后重启虚拟机,之后查看网卡的地址,这个地址稍后有大用,后面的nginx.conf和Dockerfile文件都用到了这个ip地址:
ifconfig
192.168.10.224
安装mkcert,用于生成自签名证书:
# 安装mkcert
sudo wget --no-check-certificate https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
sudo mv mkcert-v1.4.3-linux-amd64 /usr/local/bin/mkcert
sudo chmod +x /usr/local/bin/mkcert
mkcert -install
# 利用mkcert生成自签名证书,输出:localhost-key.pem localhost.pem
mkcert localhost
# 指定生成名称
mkcert -cert-file fd.pem -key-file fd-key.pem localhost
# 也可以同时为多个域名生成证书
mkcert -cert-file fd.pem -key-file fd-key.pem localhost 127.0.0.1
编辑nginx.conf文件,添加常用配置:
sudo mkdir /home/pc/Nginx
sudo chmod 777 /home/pc/Nginx
sudo vim /home/pc/Nginx/nginx.conf
# nginx.conf
events {
use epoll;
worker_connections 65535;
}
http{
server {
listen 80;
server_name localhost 192.168.10.224;
listen 443 ssl;
ssl_certificate /pem/fd.pem;
ssl_certificate_key /pem/fd-key.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
编写Dockerfile文件:
sudo vim /home/pc/Nginx/Dockerfile
# 使用官方的NGINX镜像作为基础镜像
FROM nginx
# 将本地的NGINX配置文件复制到容器中
COPY nginx.conf /etc/nginx/nginx.conf
# 安装mkcert,用于生成自签名证书
RUN apt-get update \
&& apt-get install -y wget \
&& wget --no-check-certificate https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64 \
&& mv mkcert-v1.4.3-linux-amd64 /usr/local/bin/mkcert \
&& chmod +x /usr/local/bin/mkcert \
&& mkcert -install \
&& mkdir /pem \
&& cd /pem \
&& mkcert -cert-file fd.pem -key-file fd-key.pem localhost 192.168.10.224
构建Docker镜像:
docker build -f /home/pc/Nginx/Dockerfile -t m_nginx_img /home/pc/Nginx/
运行NGINX容器:
docker run --name=Nginx -d -p 80:80 -p 443:443 --restart=always m_nginx_img
docker run --name=Nginx -p 80:80 -p 443:443 -v /home/pc/Nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/pc/Nginx/log/:/var/log/nginx/ -d --restart=always m_nginx_img
docker run --name=Nginx -p 80:80 -p 443:443 -v /home/pc/Nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/pc/Nginx/log/:/var/log/nginx/ m_nginx_img
docker exec -it Nginx bash
验证NGINX部署:
http://localhost
https://localhost
将生成的证书从容器中拷贝出来备用:
docker cp Nginx:/pem/fd.pem /home/pc/Nginx/fd.pem
然后我们可以再通过shell客户端将Nginx/fd.pem拷贝到我们的电脑上
as配置CA证书:
若不配置服务器CA证书的话,则as访问https会报错。
先将 服务器提供的CA 证书拷贝到 res/raw/ 目录下
再在 `res/xml/` 目录下创建 `network_security_config.xml` 文件:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<!-- 引入 CA 证书 -->
<trust-anchors>
<certificates src="@raw/证书名(不含后缀,比如.pem)"/>
</trust-anchors>
</base-config>
</network-security-config>
注意填入的证书名称不要包含扩展名,比如fd.pem,则只需填入@raw/fd
高版本的as会不允许直接返回http,cleartextTrafficPermitted="true"的作用可以使得能正常访问http地址。
再在 `AndroidManifest.xml` 中应用网络安全性配置:
android:networkSecurityConfig="@xml/network_security_config"
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
或者直接用本地已经生成好的CA,由于本地和容器内的环境不一致,本地生成的证书放到容器内会出现解析出错,最好不要用下面这种方式,而是通过docker容器内部生成:
#Dockerfile
# 使用官方的NGINX镜像作为基础镜像
FROM nginx
# 将本地的NGINX配置文件复制到容器中
COPY nginx.conf /etc/nginx/nginx.conf
RUN mkdir /pem
# 将提前生成好的CA证书拷贝进容器
COPY localhost-key.pem localhost.pem /pem