在開始之前先了解一下相關(guān)知識。
公開密鑰加密:
公開密鑰加密也稱作“非對稱加密”是一種使用不同密鑰進行加密和解密的加密方法,用于加密的密鑰稱為公開密鑰(公鑰),用于解密的密鑰稱為,秘密密鑰(私鑰)。
約定前提:公鑰加密的信息只能由私鑰解密。
- 接受方B生成一對密鑰,將公鑰公開到互聯(lián)網(wǎng)上,私鑰秘密保存。
- 發(fā)送方A用B公開的公鑰加密原始信息,然后將秘文發(fā)送給B,B用私鑰解密的到原始信息。
這就解釋了非對稱加密
如果反過來,使用私鑰加密,公鑰解密這就變成了“數(shù)字簽名”
數(shù)字簽名:
非對稱加密過程中公鑰加密私鑰解密?,F(xiàn)在反過來,私鑰加密公鑰解密。由于公鑰是公開的,所以所有人都能通過公鑰解出密文,這樣的加密是毫無意義的。但是從另一種角度來看,你可以看到密文的創(chuàng)建者保證是擁有密鑰的一方,這不就像“簽名”嗎。
在“數(shù)字簽名中”,只有A方可以做的密文可以用作“簽名”。由于信息的加密過程需要時間,為了縮短時間首先找到信息的哈希值(摘要算法),然后加密哈希值并將其用于簽名。
簽名過程:
- 首先A方準備一對密鑰(公鑰和私鑰)和想要發(fā)送的信息,把私鑰公開或者發(fā)送給接收方B。
- A方用私鑰加密信息,將信息和加密后的密文一起發(fā)送出去。
- 接受方B收到信息、公鑰,用公鑰驗證信息得到的密文和收到的密文匹配。由此B可以證實信息的發(fā)送方A發(fā)送,并且沒有被偽造。
這就解釋了數(shù)字簽名。
數(shù)字證書:
數(shù)字簽名提供驗證,偽造檢測和防止否認的功能,但是存在一個問題就是公開密鑰中沒有任何信息表示創(chuàng)建者是誰。這個問題可以通過“數(shù)字證書”系統(tǒng)來解決。
對數(shù)字證書通俗的理解,就像這樣的一張電子證書:
數(shù)字證書機制:
首先A方需要要求認證機構(gòu)CA頒發(fā)證書,證明A方是公開密鑰的所有者。認證機構(gòu)是管理數(shù)字證書的組織,像政府或者大公司那樣值得信賴的組織都可以成為管理數(shù)字證書的組織。
認證機構(gòu)CA準備一對密鑰,A方準備好自己的個人信息、公開密鑰、電子郵件等信息,將其發(fā)送給認證機構(gòu),認證機構(gòu)CA用私鑰給A方的相關(guān)信息創(chuàng)建數(shù)字簽名,創(chuàng)建的數(shù)字簽名和數(shù)據(jù)做成單個文件后發(fā)送給A方,該文件之后就是A方的數(shù)字證書。
接下來A將數(shù)字證書代替公鑰發(fā)送給B或者公開。
B方收到A方的證書,從中得知證書信息屬于A方。B方驗證數(shù)字證書中的數(shù)字簽名來自認證機構(gòu)CA(證書中的簽名信息只能使用認證機構(gòu)的公開密鑰進行驗證),如果驗證沒問題,就可以確定該數(shù)字證書由認證機構(gòu)CA簽發(fā)。
由于已經(jīng)確認該數(shù)字證書可信,也就可以認為證書中的數(shù)字簽名屬于A方,進而從數(shù)字簽名中提取A方的公開密鑰。
由此,公開密鑰交付完成。
通過數(shù)字證書系統(tǒng),就可以驗證公鑰的所有者。如果證書不受信任,B方?jīng)]理由相信未經(jīng)驗證的公鑰。
iOS 開發(fā)證書相關(guān)問題
對數(shù)字證書系統(tǒng)了解了之后,然后看iOS證書申請過程。
必須條件:
- 已經(jīng)加入Apple開發(fā)者計劃的apple賬號(交過費的賬號)。
- MAC系統(tǒng)的電腦(黑蘋果也可以),MAC系統(tǒng)電腦自帶Keychain Access。
- 證書請求文件(CSR)文件,證書請求文件
CSR,全稱為:Certificate Signing Request,證書請求文件的縮寫。
為了確保我提供的信息在互聯(lián)網(wǎng)的傳輸過程中不會被有意或者無意的破壞掉,我們有如下的機制來對傳輸?shù)膬?nèi)容進行保護:首先在本地生成一對密鑰(私鑰+公鑰),用私鑰對“我們需要提供的信息“進行加密,從而生成證書請求文件(.csr), 這個證書請求文件其實就是私鑰對應(yīng)的公鑰證書的原始文件,里面含有對應(yīng)的公鑰信息,郵件,...
Mac下的CSR文件從鑰匙串創(chuàng)建方式:官方文檔。創(chuàng)建完成,試著解析出來的的內(nèi)容大致如下:
域名: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-----
- 創(chuàng)建好之后就去apple開發(fā)者中心創(chuàng)建對應(yīng)的證書。最后下載下來創(chuàng)建好的證書,雙擊就自動添加到鑰匙串了。
在 Mac 上的“鑰匙串訪問” 中,選擇一個鑰匙串,然后點按“我的證書”或“證書”類別來查看該鑰匙串中的證書。選擇想要查看的證書,然后點按工具欄中的“簡介”按鈕 。您也可以連按想要查看的證書。
連按查看證書的效果:
主題名稱:
用戶ID: com.xxxx.xxxx
常用名稱:Apple Sandbox Push Services:com.xxxx.xxxx
組織單位: xxxxxxxx
國家或地區(qū):CN
簽發(fā)者名稱:
常用名稱: Apple Worldwide Developer Relations Certification Authority
組織單位:G4
組織: Apple Inc.
國家或地區(qū):US
序列號:xxxxxxxxxxxxxxx
版本:3
簽名算法:帶RSA加密的SHA-256
參數(shù):無
在此之前無效: 2022年3月7日星期一中國標準時間下午3:00:00
在此之后無效: 2023年4月6日星期四中國標準時間下午3:00:00
公共密鑰信息:
算法 RSA加密
參數(shù):無
公共密鑰: 256字節(jié):DB4EA74E8D5C7BBB...
指數(shù)65537 密鑰大小 2,048位 密鑰使用 加密,驗證,派生
簽名256字節(jié):5073A02532426E18...
......
整個過程其實就是上文數(shù)字證書機制的頒發(fā)證書過程......
- 證書創(chuàng)建好了以后,從鑰匙串導(dǎo)出證書格式為.p12文件(此文件建議備份保存)。
到此,iOS證書就創(chuàng)建完成了
- Xcode配置證書
安裝好最新版的Xcode>preference>Accounts>點擊+添加你的Apple開發(fā)者賬號>剩下的Xcode會自動配置好
如果有多個開發(fā)者賬號,最好手動在工程里設(shè)置。
- 代碼簽名(Code Signing)
(1) 每個證書(開發(fā)/發(fā)布)的公鑰都有對應(yīng)的私鑰,并且保存在鑰匙串(如果沒有你可能已經(jīng)遇到無法真機運行的問題了)。
(2) 私鑰會在真機調(diào)試/打包的時候用來簽名,通常第一次運行Xcode會彈窗提示訪問鑰匙串! 選擇“始終允許”,打包的時候還會把對應(yīng)的描述文件打包進去,描述文件已經(jīng)包含證書相關(guān)信息了。
- iOS 系統(tǒng)驗證簽名
(1) App在真機上運行,首先會對app的相關(guān)信息和打包進去的描述文件中包含的app信息對比。
(2) 緊接著iOS系統(tǒng)通過預(yù)裝在iOS系統(tǒng)的受信證書公鑰對描述文件中的相關(guān)證書解密,取得證書公鑰然后對app簽名信息驗證,證明其是否被篡改。
(3) 驗證通過就可以運行了。
其過程就是上文數(shù)字證書機制中的B方驗證A方證書的流程了
其它問題:
- 根證書CA
CA(Certificate Authority)被稱為證書授權(quán)中,根證書是CA認證中心給自己頒發(fā)的證書,是信任鏈的起始點。安裝根證書意味著對這個CA認證中心的信任。
受信任證書存儲區(qū)包含預(yù)先安裝在 iOS、iPadOS、macOS、Apple tvOS 和 watchOS 中的受信任根證書。
- 授權(quán)文件:(Provisioning Profile) .mobileprovision文件
手動在Apple開發(fā)者中心創(chuàng)建Provisioning Profile文件:
(1) Apple開發(fā)者中心>Certificates, Identifiers & Profiles>Profiles> 點擊+ 新建
(2) 依次選擇App ID(單選)> 證書(Certificates,可多選)和設(shè)備(Devices,可多選)
開發(fā)配置文件包含開發(fā)所必須的所有內(nèi)容(app相關(guān)信息,開發(fā)證書,真機設(shè)備)
發(fā)布授權(quán)文件只包含發(fā)布證書、app相關(guān)信息
查看一個開發(fā)描述文件:
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加密的數(shù)字證書“,用于存儲和傳輸個人私鑰和其他敏感信息的可移植格式。
鑰匙串中帶有密鑰的證書都可以生成.p12文件,其它MAC電腦只要打開這個.p12文件就無需再申請證書,可以直接用來開發(fā)相關(guān)應(yīng)用。
對于開發(fā)證書,生成p12文件之后還要和描述文件(.mobileprovision)一起發(fā)送給其他使用者,才能使用這臺電腦就可以用來打包、真機調(diào)試等了。
-
apple開發(fā)者賬號
共三種:個人、公司、企業(yè)。
Xcode 常見問題:
no such provisioning profile was found
描述文件錯誤,需要手動去開發(fā)者中心下載描述文件到本地,或者點擊Fix issue解決。
No identities from profile
Xcode配置指定UDID的provisioning profile中的DeveloperCertificates在本地KeyChain中不存在[No identities are available]或不一致(KeyPair中的Private Key丟失),此時需去網(wǎng)站檢查ProvisioningProfile中的App ID-Certificate-Device配置是否正確?;蛘咴囈辉嘪code提示的Fix issue解決(可能自動生成iOS Team ProvisioningProfile)。
Code Signing Entitlements file do not match profile
檢查對應(yīng)版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”鍵值是否與ProvisioningProfile中的Entitlements項相吻合,或者將Build Settings|Code Signing的Provisioning Profile中對應(yīng)版本(Debug)的Entitlements置空。
Xcode 真機無線調(diào)試:
前提:
- 必須能正常連線調(diào)試
- 手機和電腦連接同一個局域網(wǎng)
-
連接設(shè)備,從Xcode中做如下操作:
Window>Devices and Simulators>你的真機 Connec via network??。 然后斷開手機,你會發(fā)現(xiàn)手機還是保持連接狀態(tài)。
-
command+R運行后,Xcode會提示
iPhone is not connectioned,然后去Device and Simulators>左側(cè)選中設(shè)備,右健選擇Connect via IP Address 在彈出的框中輸入手機的IP地址,即可。
可能會遇到的問題:iPhone is busy xxx多試幾次。