为IP地址签署服务器证书,使得通过IP访问网站使用https加密,并且使iOS信任证书,不弹不安全警告

流程简单就是 先创建一个CA证书,自己充当证书颁发机构给服务器签一个证书,为了在iOS上面得以信任该证书,有很多细节需要注意

1、生成自签名CA证书

  1. 生成CA私钥

openssl genrsa -out myCA.key 2048

  1. 创建CA根证书

openssl req -x509 -new -nodes -key myCA.key -sha256 -days 3650 -out myCA.pem

2、生成服务器证书

  1. 生成服务器私钥

openssl genrsa -out myserver.key 2048

  1. 创建CSR(证书签名请求)

使用私钥生成 CSR,并指定所需的 SAN 和其他参数:

创建一个 OpenSSL 配置文件 server_cert.cnf,如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[ req ]
default_bits        = 2048
prompt              = no
default_md          = sha256
req_extensions      = req_ext
distinguished_name  = dn

[ dn ]
C  = US
ST = California
L  = San Francisco
O  = My Company
OU = IT Department
CN = your.domain.com #改为服务器IP地址

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ] #没有域名注释,IP改为服务器IP地址
#DNS.1   = your.domain.com
#DNS.2   = www.your.domain.com
IP.1    = 192.168.1.1

然后生成 CSR:

openssl req -new -key myserver.key -out myserver.csr -config server_cert.cnf

  1. 生成证书

使用自签名的 CA 证书来签署这个 CSR,并生成服务器证书:

首先,创建一个 CA 配置文件 ca_cert.cnf,如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[ alt_names ] #IP地址改为服务器地址
#DNS.1   = your.domain.com
#DNS.2   = www.your.domain.com
IP.1    = 192.168.1.1

然后,使用以下命令生成服务器证书,证书的有效期设置为 365 天:

1
openssl x509 -req -in myserver.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out myserver.crt -days 365 -sha256 -extfile ca_cert.cnf -extensions v3_ca

3、验证生成的证书

你可以使用以下命令来查看生成的服务器证书,并验证 SAN、EKU、有效期等是否正确:

openssl x509 -in myserver.crt -text -noout

4、将证书放到服务器上

myserver.keymyserver.crt 文件部署到你的服务器上,并配置服务器(如 Caddy、Nginx、Apache)使用这些证书。

5、Ios\Mac设置信任

  • 对于Mac:

打开自签名CA证书myCA.pem,在钥匙串内选择信任

  • 对于IOS

    1. 将自签名CA证书myCA.pem 隔空投送到iPhone上

    2. 设置- VPN与设备管理-安装证书

    3. 关于本机-证书信任设置-打开完全信任开关


参考

iOS15 如何信任自签名证书?

How do you sign a Certificate Signing Request with your Certification Authority?

Why does iOS 13 not trust my own Root CA?