Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-如何将服务器证书获取到iOS客户端密钥链中以进行锁定_Ios_Security_Ssl_Pinning - Fatal编程技术网

iOS-如何将服务器证书获取到iOS客户端密钥链中以进行锁定

iOS-如何将服务器证书获取到iOS客户端密钥链中以进行锁定,ios,security,ssl,pinning,Ios,Security,Ssl,Pinning,TL;DR版本:是否有任何方法可以将服务器证书传递给iOS客户端,而不需要同时传递服务器的私钥? 我已经编写了一个iOS客户端应用程序,可以与我的macOS服务器应用程序进行通信(因此我可以控制两端)。我已经使用自签名证书实现了证书固定,以使事情更加安全。为了在开发过程中实现这一点,我将服务器证书硬编码到iOS客户端应用程序中,并告诉客户端仅连接到在TLS握手过程中提供准确证书的服务器。一切都很顺利 然而,在现实世界中,我将此系统作为一个集合销售(1台服务器,每个客户有多个客户端),因此我无法将

TL;DR版本:是否有任何方法可以将服务器证书传递给iOS客户端,而不需要同时传递服务器的私钥?

我已经编写了一个iOS客户端应用程序,可以与我的macOS服务器应用程序进行通信(因此我可以控制两端)。我已经使用自签名证书实现了证书固定,以使事情更加安全。为了在开发过程中实现这一点,我将服务器证书硬编码到iOS客户端应用程序中,并告诉客户端仅连接到在TLS握手过程中提供准确证书的服务器。一切都很顺利

然而,在现实世界中,我将此系统作为一个集合销售(1台服务器,每个客户有多个客户端),因此我无法将服务器证书硬编码到iOS客户端。我的计划是在带外(通过电子邮件)将服务器证书发送到iOS客户端,如下所述:

应用程序只能访问其自己的钥匙链访问组中的钥匙链项目

要在自己的应用程序中使用数字身份,您需要编写代码来导入它们。这通常意味着读取PKCS#12格式的blob,然后使用函数
SecPKCS12Import

提供身份的一种方法是通过电子邮件。配置设备时,向关联用户发送一封电子邮件,并将其客户端身份作为PKCS#12文件附加

我的问题是,.p12文件包含服务器的证书私钥-传递私钥似乎也是非常错误的

是否有其他方法将服务器证书传递给iOS客户端,而不涉及传递服务器的私钥?


谢谢

我在这里想得太多了,解决方法其实很简单

我只需要通过电子邮件将服务器的公共证书带外发送到具有自定义扩展名(如
cert.myCustomExt1234
)的客户端设备。这是因为iOS已经声明了
.crt
扩展名,因此您必须注册应用程序才能处理自定义扩展名。然后在我的应用程序中,我可以使用带外交付的服务器公共证书来执行证书固定的所有逻辑


密钥正在将文件扩展名更改为iOS尚未声明的文件扩展名。

嘿,你有示例或git repo的链接吗。我正在为我的应用程序尝试同样的方法。@amrendersingh很抱歉,我没有任何代码示例可供您使用。但根据我在服务器上的记忆,我们抓取了公钥,创建了一个自定义info.json文件,其中包含一些信息,如serverID、serverName等,并使用带有自定义扩展名的SSZipArchive将其压缩,然后通过电子邮件发送出去。然后,客户端解析info.json并通过保存公钥来处理它(本地保存在文件系统中或keychain中..不记得了)