[工具] SSL 证书

2022-10-27  本文已影响0人  巨馍蘸酱

操作记录

创建证书 keytool

keytool 生成私钥和证书

keytool -genkeypair -alias serverkey -keypass 123456 -storepass 123456 \
    -dname "CN=server.com,OU=group,O=comp,L=cz,ST=sx,C=cn" \
    -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore

keytool -genkeypair -alias clientkey -keypass 123456 -storepass 123456 \
    -dname "CN=name,OU=group,O=comp,L=cz,ST=sx,C=cn" \
    -keyalg RSA -keysize 2048 -validity 3650 -keystore client.keystore

# 迁移到行业标准格式 PKCS12 
keytool -importkeystore -srckeystore server.keystore -destkeystore server.keystore -deststoretype pkcs12
keytool -importkeystore -srckeystore client.keystore -destkeystore client.keystore -deststoretype pkcs12

# 导出证书 DER编码格式 (添加  `-rfc` 可输出 PEM 编码格式的证书)
# keytool -exportcert -keystore server.keystore -file server.crt -alias serverkey -storepass 123456
keytool -exportcert -keystore server.keystore -file server.cer -alias serverkey -storepass 123456
keytool -exportcert -keystore client.keystore -file client.cer -alias clientkey -storepass 123456

# 导入信任证书
keytool -importcert -keystore client_trust.keystore -file server.cer -alias client_trust_server -storepass 123456 -noprompt
keytool -importcert -keystore server_trust.keystore -file client.cer -alias server_trust_client -storepass 123456 -noprompt


# jks格式 转 pkcs12
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcalias serverkey -destalias serverkey \
    -srcstoretype jks -deststoretype pkcs12 -srcstorepass 123456 -deststorepass 123456 -noprompt

keytool -importkeystore -srckeystore client.keystore -destkeystore client.p12 -srcalias clientkey -destalias clientkey \
    -srcstoretype jks -deststoretype pkcs12 -srcstorepass 123456 -deststorepass 123456 -noprompt

# p12 证书提取pem证书和私钥
openssl pkcs12 -in server.p12 -clcerts -nokeys -out server.crt
openssl pkcs12 -in server.p12 -nocerts -nodes -out server.key

openssl pkcs12 -in client.p12 -clcerts -nokeys -out client.crt

# Nginx 配置
ssl_certificate /root/keytool/server.crt;
ssl_certificate_key /root/keytool/server.key;
ssl_client_certificate /root/keytool/client.crt;
ssl_verify_client on;

# Android 使用 Portecle 工具修改类型
- client.keystore -> client.p12
- client_trust.keystore -> client_trust.bks

创建证书 openssl

root, 生成CA私钥(.key) --> 生成CA证书请求(.csr) --> 自签名得到根证书(.crt)

  1. 生成根证书密钥 root.key (生成 RSA私钥)
    openssl genrsa -out root.key 2048 -aes256 -passout pass:123456
  2. 生成根证书请求文件 root.csr (从现有的私钥中生成一个 证书签署请求CSR)
    openssl req -key root.key -new -out root.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myCA"
  3. 自签根证书 root.crt (从现有的私钥和 CSR 生成自签证书 crt)
    openssl x509 -req -days 3650 -sha256 -CAcreateserial -signkey root.key -in root.csr -out root.crt

服务端, 用自签根证书 root.crt 给用户证书签名, 生成私钥(.key) --> 生成证书请求(.csr) --> 用CA根证书签名得到证书(.crt)

  1. server.key 服务器端的秘钥文件
  1. server.csr 服务端证书请求文件 (从现有的私钥中生成一个 证书签署请求CSR)
    openssl req -new -sha256 -key server.key -out server.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myserver"
  2. server.crt 有效期十年的服务器端公钥证书,使用根证书和服务器端私钥文件一起生成
    openssl x509 -req -days 3650 -sha256 -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -in server.csr -out server.crt
  3. 将证书转为p12格式, p12格式的证书包含公私钥
    openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12 -passout pass:123456

客户端

  1. client.key 客户端的私钥文件
    openssl genrsa -out client.key 2048 -aes256 -passout pass:123456
  2. clinet.csr : 客户端证书请求文件 (从现有的私钥中生成一个 证书签署请求CSR)
    openssl req -key client.key -new -out client.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myclient"
  3. client.crt 有效期十年的客户端证书,使用根证书和客户端私钥一起生成
    openssl x509 -req -days 3650 -sha256 -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -in client.csr -out client.crt
  4. client.p12 客户端p12格式,这个证书文件包含客户端的公钥和私钥,主要用来给浏览器访问使用
    openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 -passout pass:123456
  5. 使用 bcprov-ext-jdk15on-158.jar 生成 Android 的 bks keytool -importcert -v -trustcacerts -alias android -file root.crt -keystore client-trust.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-ext-jdk15on-158.jar -storepass 123456

基础知识

HTTPS = HTTP + SSL

HTTP 和 HTTPs

HTTP(超文本传输协议)是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。[1]

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,易遭受窃听、篡改、劫持等攻击,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。[1]

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密,一次HTTPS协议实现了数据传输过程中的保密性、完整性和身份认证性。[1]

SSL 和 TLS

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。[2]

SSL协议提供的服务主要有:

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。[2]

TLS的最大优势就在于:TLS是独立于应用协议。高层协议可以透明地分布在TLS协议上面。然而,TLS标准并没有规定应用程序如何在TLS上增加安全性;它如何启动TLS握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。

TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS在SSL v3.0的基础上,提供了以下增加内容:

SSL证书

SSL证书也叫安全证书或者数字证书,SSL证书是数字证书的一种,跟驾驶证、护照、营业执照电子副本类似。SSL证书是一种国际通用的Web安全标准,主要通过对敏感数据加密来防止各种攻击非法读取重要信息,保证数据的完整性和安全性,避免受到数据劫持和钓鱼攻击等。[3]

SSL 证书是由受信任的数字证书颁发机构 CA,在验证服务器身份后颁发,且具有服务器身份验证和数据传输加密功能。简单说就是让你网站通过 HTTPS 加密传输协议访问的一个必要文件。[4]

数字证书认证机构(Certificate Authority,缩写为CA),是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。CA 机构是独立的,没有相互关系,这些机构都是在webtrust认证审核下成立的。[4]

签发主流机构:Symantec、Comodo、GeoTrust、DigiCert、GlobalSign 等。

SSL证书根据验证级别,分为三种类型:

自签名SSL证书

自己生成的SSL证书,不是CA机构颁发的SSL证书,就是自签名证书。自签名SSL证书不会被浏览器信任,数据被泄漏级劫持安全漏洞安全风险较高。

如果你想使用 SSL 证书来确保服务的安全,但你不需要 CA 签名的证书,一个有效的(和免费的)解决方案是签署你自己的证书。
你可以自己签发的一种常见证书是自签证书self-signed certificate。自签证书是用自己的私钥签署的证书。自签证书和 CA 签名证书一样可以用来加密数据,但是你的用户会显示一个警告,说这个证书不被他们的计算机或浏览器信任。[5]

如果你想从证书颁发机构certificate authority(CA)那里获得 SSL 证书,你必须生成一个证书签署请求certificate signing request(CSR)。

openssl / keytool

JDK里面内置了一个数字证书生产工具:keytool。但是这个工具只能生成自签名的数字证书。所谓自签名就是指证书只能保证自己是完整的,没有经过非法修改的。

keytool 没办法签发证书,而 openssl 能够进行签发和证书链的管理

常用命令

openssl

设置密码

自动输入
-subj "/C=CN/ST=SX/L=CZ/O=cpmpany/OU=example/CN=example.com/emailAddress=aa@bb.cc"

RSA私钥公钥[6]

默认情况下,openssl 输出格式为 PKCS#1-PEM

加密

非加密

转换

查看密钥

证书签署请求 CSR 文件

如果你想使用 HTTPS(HTTP over TLS)来保护你的 Apache HTTP 或 Nginx Web 服务器的安全,并且你想使用一个证书颁发机构(CA)来颁发 SSL 证书,那么就需要 CSR, 生成的 CSR 可以发送给 CA,请求签发由 CA 签名的 SSL 证书。

使用现有 RSA私钥生成 CSR签名请求 -key指定私钥, -out生成文件

同时生成 RSA私钥 和 CSR签名请求
openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "..."

从现有的证书(cert.crt)和私钥(server.key)生成 CSR(server.csr)
openssl x509 -in cert.crt -signkey server.key -x509toreq -out server.csr

查看 CSR
openssl req -text -in server.csr -noout

证书 CRT

CA

用CA根证书签发应用证书 (server)

直接生成 私钥和 SSL 自签证书
openssl req -newkey rsa:2048 -days 3650 -nodes -x509 -keyout ca.key -out ca.crt -subj "..."

从现有 私钥 生成 自签名证书, -new生成证书请求, x509直接输出证书, -key指定私钥
openssl req -new -x509 -sha256 -days 3650 -key root.key -out root.crt -passin pass:123456 -subj "..."

从现有 私钥和CSR 生成 自签证书, x509指定格式, -in指定请求文件, -signkey自签名

使用 已有RSA 私钥生成自签名证书 (生成 ca.crt)
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt

使用 CA 证书及CA密钥 对请求签发证书进行签发,生成 x509证书 (使用 ca 签发 server.crt)

查看证书

证书转换

验证

检查私钥是否为有效密钥
openssl rsa -check -in rsa_private.key

验证私钥是否与证书和 CSR 匹配

查看 CSR 条目, 查看和验证纯文本的 CSR 内容
openssl req -text -noout -verify -in server.csr

使用CA证书验证server端证书

验证证书由 CA 签署
openssl verify -verbose -CAFile ca.crt cert.crt

openssl 命令参数

参考 https://cloud.tencent.com/developer/article/1444793

1. openssl list-standard-commands(标准命令)
    1) asn1parse: asn1parse用于解释用ANS.1语法书写的语句(ASN一般用于定义语法的构成) 
    2) ca: ca用于CA的管理 
    openssl ca [options]:
        2.1) -selfsign
        使用对证书请求进行签名的密钥对来签发证书。即"自签名",这种情况发生在生成证书的客户端、签发证书的CA都是同一台机器(也是我们大多数实验中的情况),我们可以使用同一个
密钥对来进行"自签名"
        2.2) -in file
        需要进行处理的PEM格式的证书
        2.3) -out file
        处理结束后输出的证书文件
        2.4) -cert file
        用于签发的根CA证书
        2.5) -days arg 
        指定签发的证书的有效时间
        2.6) -keyfile arg   
        CA的私钥证书文件
        2.7) -keyform arg
        CA的根私钥证书文件格式:
            2.7.1) PEM
            2.7.2) ENGINE 
        2.8) -key arg   
        CA的根私钥证书文件的解密密码(如果加密了的话)
        2.9) -config file    
        配置文件
    example1: 利用CA证书签署请求证书
    openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key  

    3) req: X.509证书签发请求(CSR)管理
    openssl req [options] <infile >outfile
        3.1) -inform arg
        输入文件格式
            3.1.1) DER
            3.1.2) PEM
        3.2) -outform arg   
        输出文件格式
            3.2.1) DER
            3.2.2) PEM
        3.3) -in arg
        待处理文件
        3.4) -out arg
        待输出文件
        3.5) -passin        
        用于签名待生成的请求证书的私钥文件的解密密码
        3.6) -key file
        用于签名待生成的请求证书的私钥文件
        3.7) -keyform arg  
            3.7.1) DER
            3.7.2) NET
            3.7.3) PEM
        3.8) -new
        新的请求
        3.9) -x509          
        输出一个X509格式的证书 
        3.10) -days
        X509证书的有效时间  
        3.11) -newkey rsa:bits 
        生成一个bits长度的RSA私钥文件,用于签发  
        3.12) -[digest]
        HASH算法
            3.12.1) md5
            3.12.2) sha1
            3.12.3) md2
            3.12.4) mdc2
            3.12.5) md4
        3.13) -config file   
        指定openssl配置文件
        3.14) -text: text显示格式
    example1: 利用CA的RSA密钥创建一个自签署的CA证书(X.509结构) 
    openssl req -new -x509 -days 3650 -key server.key -out ca.crt 
    example2: 用server.key生成证书签署请求CSR(这个CSR用于之外发送待CA中心等待签发)
    openssl req -new -key server.key -out server.csr
    example3: 查看CSR的细节
    openssl req -noout -text -in server.csr

    4) genrsa: 生成RSA参数
    openssl genrsa [args] [numbits]
        [args]
        4.1) 对生成的私钥文件是否要使用加密算法进行对称加密:
            4.1.1) -des: CBC模式的DES加密
            4.1.2) -des3: CBC模式的DES加密
            4.1.3) -aes128: CBC模式的AES128加密
            4.1.4) -aes192: CBC模式的AES192加密
            4.1.5) -aes256: CBC模式的AES256加密
        4.2) -passout arg: arg为对称加密(des、des、aes)的密码(使用这个参数就省去了console交互提示输入密码的环节)
        4.3) -out file: 输出证书私钥文件
        [numbits]: 密钥长度
    example: 生成一个1024位的RSA私钥,并用DES加密(密码为1111),保存为server.key文件
    openssl genrsa -out server.key -passout pass:1111 -des3 1024 

    5) rsa: RSA数据管理
    openssl rsa [options] <infile >outfile
        5.1) -inform arg
        输入密钥文件格式:
            5.1.1) DER(ASN1)
            5.1.2) NET
            5.1.3) PEM(base64编码格式)
         5.2) -outform arg
         输出密钥文件格式
            5.2.1) DER
            5.2.2) NET
            5.2.3) PEM
        5.3) -in arg
        待处理密钥文件 
        5.4) -passin arg
        输入这个加密密钥文件的解密密钥(如果在生成这个密钥文件的时候,选择了加密算法了的话)
        5.5) -out arg
        待输出密钥文件
        5.6) -passout arg  
        如果希望输出的密钥文件继续使用加密算法的话则指定密码 
        5.7) -des: CBC模式的DES加密
        5.8) -des3: CBC模式的DES加密
        5.9) -aes128: CBC模式的AES128加密
        5.10) -aes192: CBC模式的AES192加密
        5.11) -aes256: CBC模式的AES256加密
        5.12) -text: 以text形式打印密钥key数据 
        5.13) -noout: 不打印密钥key数据 
        5.14) -pubin: 检查待处理文件是否为公钥文件
        5.15) -pubout: 输出公钥文件
    example1: 对私钥文件进行解密
    openssl rsa -in server.key -passin pass:111 -out server_nopass.key
    example:2: 利用私钥文件生成对应的公钥文件
    openssl rsa -in server.key -passin pass:111 -pubout -out server_public.key

    6) x509:
    本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等X.509证书的管理工作
    openssl x509 [args]    
        6.1) -inform arg
        待处理X509证书文件格式
            6.1.1) DER
            6.1.2) NET
            6.1.3) PEM
        6.2) -outform arg   
        待输出X509证书文件格式
            6.2.1) DER
            6.2.2) NET
            6.2.3) PEM
        6.3) -in arg 
        待处理X509证书文件
        6.4) -out arg       
        待输出X509证书文件
        6.5) -req            
        表明输入文件是一个"请求签发证书文件(CSR)",等待进行签发 
        6.6) -days arg       
        表明将要签发的证书的有效时间 
        6.7) -CA arg 
        指定用于签发请求证书的根CA证书 
        6.8) -CAform arg     
        根CA证书格式(默认是PEM) 
        6.9) -CAkey arg      
        指定用于签发请求证书的CA私钥证书文件,如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有
        6.10) -CAkeyform arg  
        指定根CA私钥证书文件格式(默认为PEM格式)
        6.11) -CAserial arg   
        指定序列号文件(serial number file)
        6.12) -CAcreateserial 
        如果序列号文件(serial number file)没有指定,则自动创建它     
    example1: 转换DER证书为PEM格式
    openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
    example2: 使用根CA证书对"请求签发证书"进行签发,生成x509格式证书
    openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    example3: 打印出证书的内容
    openssl x509 -in server.crt -noout -text 

keytool


keytool --help
密钥和证书管理工具

命令:

 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥   genkey
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importpass         导入口令
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令     私钥加解密密码
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令   文件存储密码

删除

查看证书
keytool -list -v -keystore trustKeys.jks -keypass 123456 -storepass 123456

keystore[7]

生成ca/server/client的keypair
keytool -genkeypair -alias ca -keystore ca.keystore -storepass 123456

生成证书请求文件 client.csr
keytool -certreq -alias client -keystore client.keystore -storepass 123456 -file client.csr

用ca进行 client.cer 证书签发
keytool -gencert -alias ca -keystore ca.keystore -storepass 123456 -infile client.csr -outfile client.cer

导出ca证书 (含ca公钥)
keytool -exportcert -alias ca -keystore ca.keystore -storepass 123456 -file ca.cer

把ca证书和ca签名的client证书都导入到client的keystore中, 导入的client.cer将会替换原来client.keystore中相同别名的证书
keytool -importcert -alias ca -keystore client.keystore -storepass 123456 -file ca.cer
keytool -importcert -alias client -keystore client.keystore -storepass 123456 -file client.cer

转为jks格式
keytool -importkeystore -srckeystore hanclientk.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore client.jks -keypass 123456 -storepass 123456

p12

根CA (自签CA, 使用者和颁发者都是它自己), rootca.keystore (pkcs12)
keytool -genkeypair -alias rootca -storetype PKCS12 -keystore rootca.keystore -validity 3650 -keysize 2048 -keyalg RSA -sigalg SHA256withRSA -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=127.0.0.1" -keypass 123456 -storepass 123456

从密钥库中导出 cer 证书, rootca.cer
keytool -exportcert -alias rootca -keystore rootca.keystore -file rootca.cer -keypass 123456 -storepass 123456

生成 pkcs12 的keystore文件 serverKeystore.jks / clientKeystore.jks

生成证书请求 csr 文件, server.csr / client.csr

用ca进行证书签发 server.cer / client.cer

把ca证书和ca签名的client证书都导入到client的keystore中, 导入的client.cer将会替换原来client.keystore中相同别名的证书

从keystore中导出证书 server.cer / client.cer

将 cer 证书导入信任证书库 clientTruststore.jks / serverTruststore.jks

jks

需要生成双方的密钥文件,并把对方的cert导入自己的密钥文件里[8]

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore server.jks -destkeystore server.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

以jks格式生成服务器端包含Public key和Private Key的keystore文件 server.jks
keytool -genkey -alias server -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore server.jks -validity 3650 -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=myserver" -keypass 123456 -storepass 123456

从keystore中导出别名为server的服务端证书 server.cer
keytool -keystore server.jks -export -alias server -file server.cer -keypass 123456 -storepass 123456

以jks格式生成服务器端包含Public key和Private Key的keystore文件 client.jks
keytool -genkey -alias client -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore client.jks -validity 3650 -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=myclient" -keypass 123456 -storepass 123456

从keystore中导出别名为client的客户端证书 client.cer
keytool -keystore client.jks -export -alias client -file client.cer -keypass 123456 -storepass 123456

把客户端的 cer 导入到服务端
keytool -import -alias client -file client.cer -keystore server.jks -keypass 123456 -storepass 123456

把服务端的 cer 导入到客户端
keytool -import -alias server -file server.cer -keystore client.jks -keypass 123456 -storepass 123456

分别把 cer 导入 信任库 serverTruststore.jks / clientTruststore.jks / 公共的truststore.jks

检验服务端是否具有自己的private key和客户端的cert
keytool -list -keystore server.jks


转换JKS格式为P12, JKS是Java的密钥文件格式,转换成通用的PKCS12格式 (*.p12 / *.pfx)
keytool -importkeystore -srckeystore client.jks -destkeystore client.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass 123456 -deststorepass 123456 -srckeypass 123456 -destkeypass 123456 -srcalias client -destalias client -noprompt

SpringBoot yml 配置

server:
  ssl:
    enabled: true
    key-store-type: JKS # PKCS12 #JKS
    key-store: classpath:certificate/server.jks
    key-store-password: 123456
    key-alias: server
    client-auth: need
    trust-store-provider: SUN
    trust-store-type: JKS
    trust-store: classpath:certificate/server.jks # serverTruststore.jks
    trust-store-password: 123456

测试验证

curl

导出客户端的cert文件
openssl pkcs12 -nokeys -in client.p12 -out client.pem

导出客户端的key文件
openssl pkcs12 -nocerts -nodes -in client.p12 -out client.key

使用 cert 和 key 测试

使用密码测试

  1. openssl pkcs12 -in client.p12 -nodes -out client.pem -password pass:123456 导出 pem
  2. curl -k --cert client.pem:123456 https://localhost/hello 测试

参考资料


  1. https://www.jianshu.com/p/a7292b4db7bd

  2. https://blog.csdn.net/enweitech/article/details/81781405

  3. https://www.jianshu.com/p/3f20772cd0be

  4. https://www.cnblogs.com/mafly/p/ssl.html

  5. https://linux.cn/article-12293-1.html

  6. https://cloud.tencent.com/developer/article/1444793

  7. https://bbs.huaweicloud.com/blogs/288569

  8. https://www.cnblogs.com/larrydpk/p/12830365.html

上一篇下一篇

猜你喜欢

热点阅读