在开始之前先了解一下相关知识。
公开密钥加密:
公开密钥加密也称作“非对称加密”是一种使用不同密钥进行加密和解密的加密方法,用于加密的密钥称为公开密钥(公钥),用于解密的密钥称为,秘密密钥(私钥)。
约定前提:公钥加密的信息只能由私钥解密。
- 接受方B生成一对密钥,将公钥公开到互联网上,私钥秘密保存。
- 发送方A用B公开的公钥加密原始信息,然后将秘文发送给B,B用私钥解密的到原始信息。
这就解释了非对称加密
如果反过来,使用私钥加密,公钥解密这就变成了“数字签名”
数字签名:
非对称加密过程中公钥加密私钥解密。现在反过来,私钥加密公钥解密。由于公钥是公开的,所以所有人都能通过公钥解出密文,这样的加密是毫无意义的。但是从另一种角度来看,你可以看到密文的创建者保证是拥有密钥的一方,这不就像“签名”吗。
在“数字签名中”,只有A方可以做的密文可以用作“签名”。由于信息的加密过程需要时间,为了缩短时间首先找到信息的哈希值(摘要算法),然后加密哈希值并将其用于签名。
签名过程:
- 首先A方准备一对密钥(公钥和私钥)和想要发送的信息,把私钥公开或者发送给接收方B。
- A方用私钥加密信息,将信息和加密后的密文一起发送出去。
- 接受方B收到信息、公钥,用公钥验证信息得到的密文和收到的密文匹配。由此B可以证实信息的发送方A发送,并且没有被伪造。
这就解释了数字签名。
数字证书:
数字签名提供验证,伪造检测和防止否认的功能,但是存在一个问题就是公开密钥中没有任何信息表示创建者是谁。这个问题可以通过“数字证书”系统来解决。
对数字证书通俗的理解,就像这样的一张电子证书:数字证书机制:
首先A方需要要求认证机构CA颁发证书,证明A方是公开密钥的所有者。认证机构是管理数字证书的组织,像政府或者大公司那样值得信赖的组织都可以成为管理数字证书的组织。
认证机构CA准备一对密钥,A方准备好自己的个人信息、公开密钥、电子邮件等信息,将其发送给认证机构,认证机构CA用私钥给A方的相关信息创建数字签名,创建的数字签名和数据做成单个文件后发送给A方,该文件之后就是A方的数字证书。
接下来A将数字证书代替公钥发送给B或者公开。
B方收到A方的证书,从中得知证书信息属于A方。B方验证数字证书中的数字签名来自认证机构CA(证书中的签名信息只能使用认证机构的公开密钥进行验证),如果验证没问题,就可以确定该数字证书由认证机构CA签发。
由于已经确认该数字证书可信,也就可以认为证书中的数字签名属于A方,进而从数字签名中提取A方的公开密钥。
由此,公开密钥交付完成。
通过数字证书系统,就可以验证公钥的所有者。如果证书不受信任,B方没理由相信未经验证的公钥。
iOS 开发证书相关问题
对数字证书系统了解了之后,然后看iOS证书申请过程。
必须条件:
- 已经加入Apple开发者计划的apple账号(交过费的账号)。
- MAC系统的电脑(黑苹果也可以),MAC系统电脑自带Keychain Access。
- 证书请求文件(CSR)文件,证书请求文件
CSR,全称为:Certificate Signing Request,证书请求文件的缩写。
为了确保我提供的信息在互联网的传输过程中不会被有意或者无意的破坏掉,我们有如下的机制来对传输的内容进行保护:首先在本地生成一对密钥(私钥+公钥),用私钥对“我们需要提供的信息“进行加密,从而生成证书请求文件(.csr), 这个证书请求文件其实就是私钥对应的公钥证书的原始文件,里面含有对应的公钥信息,邮件,...
Mac下的CSR文件从钥匙串创建方式:官方文档。创建完成,试着解析出来的的内容大致如下:
域名:xxxx
组织/公司名称:xxxx
部门/单位:xxxx
国家:CN
邮箱:name@example.com
加密强度:2048
公共密钥:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA216nTo1ce9tJcuZwkpk1
2Td9vd0fznXCD22U+AFzzWCMuDWS0vz58DWJt7yWpUlpvn4qR36tLUnvv6gyQNoA
NE/Uta886j+fslZPna1katPBQ/A0r0M1JeMgVhTaHDDSH7gqF61VsYrJ5hjYR1NG
+l3bZoXFmSRAEU4SwEwFMduG/RdUdubHfy0/Sh74mty/n/7zRJuccq++30Mf4CIv
WrJs99rUmzXS9KRjbWM0cI3nNdp8IorZ0FEhY567Kgj4gpvWK3CvU9Tp2oeDmxrW
57GZnHEposEe1MTXvDrQJI9MzEpyVQ1aWiO6eT0Ro2lP1/YQpbmeWMAECddyvAVY
OQIDAQAB
-----END PUBLIC KEY-----
- 创建好之后就去apple开发者中心创建对应的证书。最后下载下来创建好的证书,双击就自动添加到钥匙串了。
在 Mac 上的“钥匙串访问” 中,选择一个钥匙串,然后点按“我的证书”或“证书”类别来查看该钥匙串中的证书。选择想要查看的证书,然后点按工具栏中的“简介”按钮 。您也可以连按想要查看的证书。
连按查看证书的效果:
主题名称:
用户ID: com.xxxx.xxxx
常用名称:Apple Sandbox Push Services:com.xxxx.xxxx
组织单位: xxxxxxxx
国家或地区:CN
签发者名称:
常用名称: Apple Worldwide Developer Relations Certification Authority
组织单位:G4
组织: Apple Inc.
国家或地区:US
序列号:xxxxxxxxxxxxxxx
版本:3
签名算法:带RSA加密的SHA-256
参数:无
在此之前无效: 2022年3月7日星期一中国标准时间下午3:00:00
在此之后无效: 2023年4月6日星期四中国标准时间下午3:00:00
公共密钥信息:
算法 RSA加密
参数:无
公共密钥: 256字节:DB4EA74E8D5C7BBB...
指数65537 密钥大小 2,048位 密钥使用 加密,验证,派生
签名256字节:5073A02532426E18...
......
整个过程其实就是上文数字证书机制的颁发证书过程......
- 证书创建好了以后,从钥匙串导出证书格式为.p12文件(此文件建议备份保存)。
到此,iOS证书就创建完成了
- Xcode配置证书
安装好最新版的Xcode>preference>Accounts>点击+添加你的Apple开发者账号>剩下的Xcode会自动配置好
如果有多个开发者账号,最好手动在工程里设置。
- 代码签名(Code Signing)
(1) 每个证书(开发/发布)的公钥都有对应的私钥,并且保存在钥匙串(如果没有你可能已经遇到无法真机运行的问题了)。
(2) 私钥会在真机调试/打包的时候用来签名,通常第一次运行Xcode会弹窗提示访问钥匙串! 选择“始终允许”,打包的时候还会把对应的描述文件打包进去,描述文件已经包含证书相关信息了。
- iOS 系统验证签名
(1) App在真机上运行,首先会对app的相关信息和打包进去的描述文件中包含的app信息对比。
(2) 紧接着iOS系统通过预装在iOS系统的受信证书公钥对描述文件中的相关证书解密,取得证书公钥然后对app签名信息验证,证明其是否被篡改。
(3) 验证通过就可以运行了。
其过程就是上文数字证书机制中的B方验证A方证书的流程了
其它问题:
- 根证书CA
CA(Certificate Authority)被称为证书授权中,根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。
受信任证书存储区包含预先安装在 iOS、iPadOS、macOS、Apple tvOS 和 watchOS 中的受信任根证书。
- 授权文件:(Provisioning Profile) .mobileprovision文件
手动在Apple开发者中心创建Provisioning Profile文件:
(1) Apple开发者中心>Certificates, Identifiers & Profiles>Profiles> 点击+ 新建
(2) 依次选择App ID(单选)> 证书(Certificates,可多选)和设备(Devices,可多选)
开发配置文件包含开发所必须的所有内容(app相关信息,开发证书,真机设备)
发布授权文件只包含发布证书、app相关信息
查看一个开发描述文件:
xxxx_development
Expires In 11 months
App ID Name: xxxx
App ID: xxxxxxxx.com.xxxx.xxxx
Team: xxxxxx., Ltd. (xxxxxxxx)
Platform: iOS
UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
Creation Date: Mar 12, 2022 at 12:03:24 PM GMT+8
Expiration Date: Mar 12, 2023 at 12:03:24 PM GMT+8
ENTITLEMENTS
aps-environment: development
get-task-allow: true
com.apple.developer.applesignin: Default
com.apple.developer.associated-domains: *
application-identifier: xxxxxxxx.com.xxxx.xxxx
com.apple.developer.team-identifier: xxxxxxxx
keychain-access-groups: xxxxxxxx.*, com.apple.token
CERTIFICATES
Name: Apple Development: xx x (xxxxxxxx)
Creation Date: Mar 12, 2021 at 12:46:08 AM GMT+8
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SHA-1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PROVISIONED DEVICES
Device ID: xxxxxxxxxxxxxxxxxxxxxx
......
- p12文件:
P12文件是使用PKCS#12(公钥密码标准#12),全称“Public Key Cryptography Standards #12加密的数字证书“,用于存储和传输个人私钥和其他敏感信息的可移植格式。
钥匙串中带有密钥的证书都可以生成.p12文件,其它MAC电脑只要打开这个.p12文件就无需再申请证书,可以直接用来开发相关应用。
对于开发证书,生成p12文件之后还要和描述文件(.mobileprovision)一起发送给其他使用者,才能使用这台电脑就可以用来打包、真机调试等了。
-
apple开发者账号
共三种:个人、公司、企业。
Xcode 常见问题:
no such provisioning profile was found
描述文件错误,需要手动去开发者中心下载描述文件到本地,或者点击Fix issue解决。
No identities from profile
Xcode配置指定UDID的provisioning profile中的DeveloperCertificates在本地KeyChain中不存在[No identities are available]或不一致(KeyPair中的Private Key丢失),此时需去网站检查ProvisioningProfile中的App ID-Certificate-Device配置是否正确。或者试一试Xcode提示的Fix issue解决(可能自动生成iOS Team ProvisioningProfile)。
Code Signing Entitlements file do not match profile
检查对应版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”键值是否与ProvisioningProfile中的Entitlements项相吻合,或者将Build Settings|Code Signing的Provisioning Profile中对应版本(Debug)的Entitlements置空。
Xcode 真机无线调试:
前提:
- 必须能正常连线调试
- 手机和电脑连接同一个局域网
-
连接设备,从Xcode中做如下操作:
Window>Devices and Simulators>你的真机 Connec via network☑️。 然后断开手机,你会发现手机还是保持连接状态。
-
command+R运行后,Xcode会提示
iPhone is not connectioned
,然后去Device and Simulators>左侧选中设备,右健选择Connect via IP Address 在弹出的框中输入手机的IP地址,即可。
可能会遇到的问题:iPhone is busy xxx
多试几次。