openssl生成自签名证书

将网络模式设置成桥接模式:

由于是通过Vmare虚拟机部署的Nginx服务,而虚拟机默认的NAT模式是不支持其他机器进行访问的,即只能本机访问(虚拟机或本机),所以要把他改成桥接模式,然后重启虚拟机,之后查看网卡的地址,这个地址稍后有大用,后面的nginx.conf和fd.ext文件都用到了这个ip地址:

ifconfig
192.168.10.224

首先在本地创建一个Nginx目录,用于存放nginx.conf

sudo mkdir /home/pc/Nginx
sudo chmod 777 /home/pc/Nginx

安装openssl,用于生成自签名证书:

sudo apt-get update && apt-get install openssl

# 查看openssl版本
openssl version

# openssl生成自签名:fd.key fd.crt
openssl genpkey -out pem/fd.key \
    -algorithm EC  \
    -pkeyopt ec_paramgen_curve:P-256 \
    && openssl req -new -x509 -days 365 -key pem/fd.key -out pem/fd.crt \
    -subj "/CN=localhost"

# openssl通过fd.ext生成自签名
  openssl genpkey -out /pem/fd.key \
    -algorithm EC  \
    -pkeyopt ec_paramgen_curve:P-256 \
    && openssl req -new -config /pem/fd.cnf -key /pem/fd.key -out /pem/fd.csr \
    && openssl x509 -req -days 365 \
    -in /pem/fd.csr -signkey /pem/fd.key -out /pem/fd.crt \
    -extfile /pem/fd.ext
 
#fd.ext
[ req ]
default_bits        = 1024
distinguished_name  = req_distinguished_name
req_extensions      = san
extensions          = san
[ req_distinguished_name ]
countryName         = CN
stateOrProvinceName = Definesys
localityName        = Definesys
organizationName    = Definesys
[SAN]
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
DNS.2 = 192.168.10.224

编辑nginx.conf文件,添加常用配置:

sudo vim /home/pc/Nginx/nginx.conf
events {
    use epoll;
    worker_connections 65535;
}

http{
    server {
        listen 80;
        server_name localhost 192.168.10.224;

        listen 443 ssl;
        #ssl_password_file /pem/pass.txt;
        ssl_certificate /pem/fd.crt;
        ssl_certificate_key /pem/fd.key;
        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;
        }
    }   
}

编写fd.cnf文件用于生成csr:

sudo vim /home.pc/Nginx/fd.cnf
#fd.cnf

[req]
prompt = no
distinguished_name = dn
req_extensions = ext
input_password = PASSPHRASE

[dn]
CN = localhost
emailAddress = webmaster@feistyduck.com
O = Feisty Duck Ltd
L = London
C = GB

[ext]
subjectAltName = DNS:localhost,DNS:192.168.10.224

编写fd.ext文件用于生成crt:

sudo vim /home.pc/Nginx/fd.ext
#fd.ext

subjectAltName = DNS:localhost, DNS:192.168.10.224

编写Dockerfile文件:

sudo vim /home/pc/Nginx/Dockerfile
#Dockerfile
# 使用官方的NGINX镜像作为基础镜像
FROM nginx

# 将本地的NGINX配置文件复制到容器中
COPY nginx.conf /etc/nginx/nginx.conf


RUN mkdir /pem

COPY fd.cnf fd.ext /pem

RUN openssl genpkey -out /pem/fd.key \
    -algorithm EC  \
    -pkeyopt ec_paramgen_curve:P-256 \
    && openssl req -new -config /pem/fd.cnf -key /pem/fd.key -out /pem/fd.csr \
    && openssl x509 -req -days 365 \
    -in /pem/fd.csr -signkey /pem/fd.key -out /pem/fd.crt \
    -extfile /pem/fd.ext

构建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

openssl s_client -crlf \
-connect localhost:443 \
-servername localhost

将生成的证书从容器中拷贝出来备用:

docker cp Nginx:/pem/fd.crt /home/pc/Nginx/fd.crt

验证证书:
openssl x509 -text -in /home/pc/Nginx/fd.crt -noout

然后我们可以再通过shell客户端将Nginx/fd.crt拷贝到我们的电脑上

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/证书名(不含后缀,比如.crt)"/>
        </trust-anchors>
    </base-config>
</network-security-config>

注意填入的证书名称不要包含扩展名,比如fd.crt,则只需填入@raw/fd
高版本的as会不允许直接返回http,cleartextTrafficPermitted="true"的作用可以使得能正常访问http地址。

再在 `AndroidManifest.xml` 中应用网络安全性配置:

android:networkSecurityConfig="@xml/network_security_config"

<application
    android:networkSecurityConfig="@xml/network_security_config"
    ...>
    ...
</application>

但是经测试发现as好像不支持访问openssl生成的证书的https,就算配置了CA证书也没用,所以最好还是用mkcert生成自签名CA证书

或者直接用本地已经生成好的CA,要注意的是本地的openssl版本和容器内的openssl版本不一致,会导致容器内解析签名文件出错,所以请不要用下面这种方式,最好由容器内部的openssl来生成:

#Dockerfile
# 使用官方的NGINX镜像作为基础镜像
FROM nginx

# 将本地的NGINX配置文件复制到容器中
COPY nginx.conf /etc/nginx/nginx.conf

RUN mkdir /pem

# 将提前生成好的CA证书拷贝进容器
COPY fd.key fd.crt /pem
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容