MASTG-TECH-0079: Como obter um Developer Provisioning Profile
O provisioning profile (perfil de provisionamento) é um arquivo plist assinado pela Apple, que adiciona seu certificado de assinatura de código à sua lista de certificados aceitos em um ou mais dispositivos. Em outras palavras, isso representa a Apple permitindo explicitamente que seu aplicativo seja executado por certos motivos, como depuração em dispositivos selecionados (perfil de desenvolvimento). O perfil de provisionamento também inclui os entitlements (permissões) concedidos ao seu aplicativo. O certificate (certificado) contém a chave privada que você usará para assinar.
Um perfil de provisionamento válido só pode ser obtido da Apple. Isso significa que você precisa de uma conta Apple válida.
Info
Você pode obter um perfil de provisionamento válido tanto para contas Apple normais quanto para contas Apple Developer. Existem duas diferenças importantes entre os dois tipos:
Expiração do certificado
- Conta Apple: Os certificados expiram 7 dias após a criação
- Conta Developer: Os certificados expiram 1 ano após a criação
Certificados curinga
- Conta Apple: Os certificados são válidos apenas para um Bundle Identifier. Este Bundle Identifier deve ser único.
- Conta Developer: Os certificados podem ser curingas, permitindo que você mantenha o Bundle Identifier original
Uma conta Apple Developer custa US$ 99 por ano e é interessante devido à expiração mais longa, mas não é um requisito.
As etapas abaixo funcionam tanto para uma conta Apple normal quanto para uma conta Apple Developer, mas exigem um host macOS.
Criando uma identidade de assinatura¶
Instale Xcode e crie um novo aplicativo iOS com qualquer linguagem e configuração. Configure o projeto para usar assinatura automática e implante o aplicativo em seu dispositivo iOS. Durante esse fluxo, você terá que aceitar seu certificado de desenvolvimento no dispositivo, bem como habilitar o modo de desenvolvimento.
Após essas etapas, você pode usar o comando segurança para listar suas identidades de assinatura:
$ security find-identity -v -p codesigning
1) 50034388646913B117AF1D6E51D9E045B77EA916 "Apple Development: MAS@owasp.org (LVGBSLUQB4)"
1 valid identities found
Além disso, o perfil de provisionamento é armazenado em seu host na pasta ~/Library/Developer/Xcode/DerivedData:
$ find ~/Library/Developer/Xcode/DerivedData | grep embedded
/Users/MAS/Library/Developer/Xcode/DerivedData/apptest-aijwmhfiximgzkhcmnluxrscflyc/Build/Products/Debug-iphoneos/apptest.app/embedded.mobileprovision
Este arquivo pode ser copiado para seu diretório local e pode ser usado para assinar qualquer arquivo IPA, mesmo aqueles com um identificador diferente.
cp /Users/MAS/Library/Developer/Xcode/DerivedData/apptest-aijwmhfiximgzkhcmnluxrscflyc/Build/Products/Debug-iphoneos/apptest.app/embedded.mobileprovision ./embedded.mobileprovision
Inspecionando o Perfil de Provisionamento¶
Uma vez obtido o perfil de provisionamento, você pode inspecionar seu conteúdo com o comando segurança. Você encontrará os entitlements concedidos ao aplicativo no perfil, junto com os certificados e dispositivos permitidos.
$ security cms -D -i embedded.mobileprovision
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AppIDName</key>
<string>XC org mas testapp</string>
<key>ApplicationIdentifierPrefix</key>
<array>
<string>QH868V5764</string>
</array>
<key>CreationDate</key>
<date>2024-12-26T07:22:22Z</date>
<key>Platform</key>
<array>
<string>iOS</string>
<string>xrOS</string>
<string>visionOS</string>
</array>
<key>IsXcodeManaged</key>
<true/>
<key>DeveloperCertificates</key>
<array>
<data>...SNIP...</data>
</array>
<key>DER-Encoded-Profile</key>
<data>...SNIP...</data>
<key>Entitlements</key>
<dict>
<key>application-identifier</key>
<string>QH868V5764.org.mas.apptest</string>
<key>keychain-access-groups</key>
<array>
<string>QH868V5764.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>QH868V5764</string>
</dict>
<key>ExpirationDate</key>
<date>2025-01-02T07:22:22Z</date>
<key>Name</key>
<string>iOS Team Provisioning Profile: org.mas.testapp</string>
<key>ProvisionedDevices</key>
<array>
<string>...SNIP...</string>
</array>
<key>LocalProvision</key>
<true/>
<key>TeamIdentifier</key>
<array>
<string>QH868V5764</string>
</array>
<key>TeamName</key>
<string>OWASP MAS</string>
<key>TimeToLive</key>
<integer>7</integer>
<key>UUID</key>
<string>...SNIP...</string>
<key>Version</key>
<integer>1</integer>
</dict>
</plist>