
/devices/enroll collects an iPhone or iPad’s development identifier without anyone having to read a UDID off a screen. You give the device a label, download a temporary signed profile, and install it — iOS reports the identifier back to the server itself.
The profile uses Apple’s Profile Service payload, the same mechanism that over-the-air enrollment sites use. It is temporary, single-purpose, and requests three attributes and nothing else.
Using the page
Give the device a recognizable label
Apple’s profile service cannot read the name set in iOS Settings, so this label is the only human-readable name the device will ever have here. iPhone is a poor choice once you have three of them; Dana’s iPhone 15 is not.
Consent to the collection
The checkbox covers the device identifier, product, software version, and observed IP addresses. The page lists each item and why it is collected before you agree.
Download the enrollment profile
Download enrollment profile produces a signed
.mobileconfig. Get it onto the target device — AirDrop, or opening the same page on the device itself, both work.Install it on the device
In iOS, open Settings → Profile Downloaded and install. The device posts its response, and it appears on the Devices page within seconds.
How the flow works
- You open the authenticated
/devices/enrollpage, supply a device label, and consent to the disclosed collection. The server mints an enrollment token and issues a profile signed with the enrollment signer. - iOS installs the profile, which requests exactly
UDID,PRODUCT, andVERSION, and carries the token as its challenge. - iOS posts a CMS-signed response to
/api/public/ios/profile-response. The server verifies Apple’s signature, checks that the returned challenge matches the token, consumes the token, and records the device.
Requirements
Enrollment is disabled unless the server is reachable at a public HTTPS address, because iOS posts the device response directly to it and refuses to install a profile whose callback it cannot trust. If the page reports Enrollment is disabled because this address is not public HTTPS, put the server behind a publicly trusted HTTPS reverse proxy, or setPUBLIC_BASE_URL to the address iOS should call back.
The enrollment profile is signed with a self-signed certificate, so iOS displays it as Unverified. That is expected. What matters is the organization name shown on the install screen — confirm it matches the name configured in Settings before installing.
Security properties
The enrollment endpoints are public by necessity, so the token is the whole security boundary and is treated accordingly.The profile signer
The first enrollment automatically generates a ten-year RSA-2048/SHA-256 self-signed signer. Its certificate and private key live in the database and are excluded from ordinary logs and list views. The organization name and reverse-DNS profile identifier shown in iOS are configured in Settings, where the signer can also be regenerated.Notes
- A device enrolled a second time matches on UDID and updates the existing record, refreshing product and iOS version rather than creating a duplicate.
- The enrollment profile serves no purpose once the response is sent. Testers can delete it from Settings → General → VPN & Device Management immediately.
- Failed responses are recorded against the enrollment with a failure code, visible in the device’s enrollment history.
Related pages
Devices
Where enrolled devices land, and how they reach Apple.
Settings
Organization name, profile identifier, and the enrollment signer.
