首页 > 解决方案 > Spring Boot SSL webapp iOS 测试

问题描述

我正在尝试使用 Spring Boot 创建一个 WebApp。

为了创建 SSL 证书,我发出以下命令:

keytool -alias devssl -keystore devssl.p12 -genkeypair -keyalg RSA -sigalg SHA256withRSA /
-keysize 2048 -storetype PKCS12 -validity 365 -dname "CN=Frankie, OU=Frankie O=Frankie, /
L=City, S=State, C=UK" -ext SAN=DNS:localhost,DNS:blueye,IP:127.0.0.1,IP:10.1.1.2"

据我了解,这意味着此类证书将对以下地址有效:

证书很容易在 Spring 上安装:

server.ssl.key-store-type=PKCS12
server.ssl.key-store=devssl.p12
server.ssl.key-store-password=password
server.ssl.key-alias=devssl
security.require-ssl=true

在 Windows 中的受信任的根证书颁发机构下安装证书后,它也很好用。

我只是无法让它在iOS下工作。

我将证书通过电子邮件发送给自己。
在 iPhone 上安装它。
但我总是得到“这个连接不是私人的”。

在此处输入图像描述

知道如何在 iOS 上进行这项工作吗?

标签: spring-bootssl-certificatekeytool

解决方案


我一直在努力让 iOS 接受自签名证书作为唯一的事实来源。我必须通过颁发适当的个人证书颁发机构来解决它。让 iOS 信任这个权威。然后使用该机构验证的证书对网站进行签名。

我将描述所需的命令,因为它们可能会为某人节省几个小时。以下是我们将要做的事情的“鸟瞰”。

AUTHORITY - 这将作为您签署的所有证书的信任来源。您必须使用自定义证书在您想要的每台机器/电话上安装授权

  1. 为证书颁发机构 (CA) 生成私钥
  2. 为证书颁发机构 (CA) 生成证书
  3. 在 Windows 上安装证书颁发机构
  4. 在 iOS 上安装证书颁发机构

客户- 我们可以为我们网络内的所有项目颁发私钥。这些私钥将由我们自己生成和安装的权限进行验证。

  1. 为客户端生成私钥
  2. 生成证书签名请求 (CSR)
  3. 让 CA 签署 CSR 从而生成客户端证书
  4. 将客户端证书和 CA 证书合并成一个 pkcs12 文件,由 Spring 读取

现在对于实际的命令:

生成一个私钥,我们还将使用相同的命令为客户端生成一个:

openssl genrsa -des3 -out myCA.key 2048

为您的证书颁发机构生成证书。您将被问到几个问题,它们都不重要,它们只会用于向您自己识别您的证书。

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

您现在有三个文件。myCA.key(私钥)以及 myCA.pem 和 myCA.crt,它们是您的证书颁发机构的证书文件。

在 Windows 上安装: 单击 Windows 上的myCA.crt文件并按照屏幕说明进行操作。然后单击开始 -> 运行 -> ``certmgr.msc`。它将打开 Windows 证书管理器。您将在“中间证书颁发机构”下找到您安装的证书。您需要将该文件拖到“受信任的根证书颁发机构”。

在 iOS 上安装: 将文件通过电子邮件myCA.pem发送给自己。使用 Apple Mail App 在 iOS 上打开电子邮件。按照说明安装证书。要卸载,您可以转到设置 -> 常规 -> 配置文件。正确安装后,iOS 需要第二步才能信任证书,您必须转到设置 -> 常规 -> 关于 -> 证书信任设置并启用对根证书的完全信任。


现在,您的 Windows 机器和 iOS 手机上都安装了本地 CA(证书颁发机构)。让我们创建一个网站证书。


为网站生成私钥。

openssl genrsa -des3 -out myWebsite.key 2048

生成 CSR(证书签名请求):

openssl req -new -key myWebSite.key -out myWebsite.csr

现在我们有了网站密钥和证书签名请求,我们需要创建一个配置文件,openssl 将使用它来生成我们的网站证书。创建一个myWebsite.ext使用以下信息调用的文件。您唯一必须确保的是 alt 名称。您可以同时拥有 IP 和 DNS。请务必输入您的站点将使用的所有替代项。

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
DNS.2 = mywebsite
DNS.3 = mywebsite.local
IP.1 = 10.1.1.3
IP.2 = 127.0.0.1

现在我们将使用 CA 证书和私钥以及 CSR(证书签名请求)和配置文件为网站生成适当的证书。由于 iOS 13 Apple 只允许最多 825 天的证书,所以这就是我们将使用的。

openssl x509 -req -in myWebsite.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out myWebsite.crt -days 825 -sha256 -extfile myWebsite.ext

您现在将拥有以下文件:

myCA.key      - certificate authority private key  
myCA.pem      - certificate authority certificate pem format
myCA.crt      - certificate authority certificate crt format
myWebsite.key - website private key  
myWebsite.csr - website certificate sign request  
myWebsite.ext - website config file for openssl sign request  
myWebsite.crt - website certificate crt format

唯一缺少的是将 myWebsite.crt 转换为 p12 格式,我们可以使用以下命令:

openssl pkcs12 -export -in myCA.crt -inkey myCA.key -in myWebsite.crt -inkey myWebsite.key -name myWebsite -out myWebsite.p12

现在,要让 Spring Boot 使用这个证书,只需打开application.properties文件并确保它有这些行:

server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate, place it src/main/resources
server.ssl.key-store=classpath:myWebsite.p12
# The password used to generate the certificate
server.ssl.key-store-password=PASSWORD-USED
# The alias mapped to the certificate (the -name myWebsite on the last command)
server.ssl.key-alias=myWebsite 
# force SSL 
security.require-ssl=true

你有它。具有适当 SSL 验证的开发或内部项目。希望这可以节省一些时间。


推荐阅读