Closed6
mdmcert.downloadでMDMプッシュ証明書を手で(opensslコマンドで)作ってみる

mnicromdmの古いdocを参考に
キーペアとサーバー証明書つくる
openssl genrsa -out server.key 4096
openssl req -sha256 -new -key server.key -out server.csr -subj "/CN=oreore-mdm"
openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
$ tree .
.
├── server.crt
├── server.csr
└── server.key

- micromdmのmdmctlコマンドの実装 https://github.com/micromdm/micromdm/blob/13b6a440e54f458dccc4cd4dc6a0a1c229eba9f3/cmd/mdmctl/mdmcert.download.go
- commandmentの実装 https://github.com/cmdmnt/commandment/blob/17c1dbe3f5301eab0f950f82608c231c15a3ff43/commandment/apns/mdmcert.py
micromdmのmdmcertコマンドを実際に実行してみると...
$ ./mdmctl mdmcert.download -new -email=ひみつ
├── mdmcert.download.pki.crt
├── mdmcert.download.pki.key
├── mdmcert.download.push.csr
├── mdmcert.download.push.key
この4ファイルが作られる。
mdmcert.downloadの、ファイル暗号化のための鍵(これがおそらくmdmcert.download.pki.)と、プッシュ証明書に使われる証明書(これがおそらくmdmcert.download.push.)とが作られている?
具体的なAPIリクエストは↓
POST https://mdmcert.download/api/v1/signrequest
{
key: f847aea2ba06b41264d587b229e2712c89b1490a1208b7ff1aafab5bb40d47bc,
email: Eメールアドレス,
csr: mdmcert.download.push.csrをbase64エンコードしたもの,
encrypt: mdmcert.download.pki.crtをbase64エンコードしたもの,
}
となってそう。

openssl genrsa -out push.key 2048
openssl req -sha256 -new -key push.key -out push.csr -subj "/C=JP/O=oreore-org/CN=oreore-mdm"
$ tree
.
├── push.csr
├── push.key
├── server.crt
├── server.csr
└── server.key
$ jo key=f847aea2ba06b41264d587b229e2712c89b1490a1208b7ff1aafab5bb40d47bc email="ひみつだ@ひみつ.com" csr=$(base64 -i push.csr) encrypt=$(base64 -i server.crt) | http POST https://mdmcert.download/api/v1/signrequest
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 21
Content-Type: application/json
Date: Mon, 20 Feb 2023 02:40:40 GMT
Server: nginx
{
"result": "success"
}
メールが飛んできた!

送られてきたplist.b64.p7、中身はこんな数字の羅列。
- commandmentの解読ロジック https://github.com/cmdmnt/commandment/blob/17c1dbe3f5301eab0f950f82608c231c15a3ff43/commandment/apns/mdmcert.py#L86
- micromdmの解読ロジック https://github.com/micromdm/micromdm/blob/13b6a440e54f458dccc4cd4dc6a0a1c229eba9f3/cmd/mdmctl/mdmcert.download.go#L192
hex文字列をbinaryに復元して、s/mimeの復号をすればよさそう。
./mdmctl mdmcert.download -decrypt=/Users/yusuke-iwaki/Downloads/mdm_signed_request.20230219_181248_1529.plist.b64.p7
これで出来上がる mdmcert.download.push.req
を見てみると、base64エンコードされた状態。
cat ~/Downloads/mdm_signed_request.20230219_184040_1530.plist.b64.p7 | xxd -r -p > mdm_signed_request.20230219_184040_1530.plist.p7
openssl smime -decrypt -inform der -in mdm_signed_request.20230219_184040_1530.plist.p7 -inkey server.key > push_signed.req

MDM_ McMurtrie Consulting LLC_Certificate.pem
というファイルがダウンロードできる。

まとめると
暗号化用のキーペアなどをつくる。
openssl genrsa -out server.key 4096
openssl req -sha256 -new -key server.key -out server.csr -subj "/CN=oreore-mdm"
openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
プッシュ証明書用のCSRを作る
openssl genrsa -out push.key 2048
openssl req -sha256 -new -key push.key -out push.csr -subj "/C=JP/O=oreore-org/CN=oreore-mdm"
mdmcert.downloadにリクエスト
$ jo key=f847aea2ba06b41264d587b229e2712c89b1490a1208b7ff1aafab5bb40d47bc email="ひみつだ@ひみつ.com" csr=$(base64 -i push.csr) encrypt=$(base64 -i server.crt) | http POST https://mdmcert.download/api/v1/signrequest
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 21
Content-Type: application/json
Date: Mon, 20 Feb 2023 02:40:40 GMT
Server: nginx
{
"result": "success"
}
メールで送られてきた mdm_signed_request.20230219_184040_1530.plist.b64.p7
みたいなファイルを復号
cat ~/Downloads/mdm_signed_request.20230219_184040_1530.plist.b64.p7 | xxd -r -p > mdm_signed_request.20230219_184040_1530.plist.p7
openssl smime -decrypt -inform der -in mdm_signed_request.20230219_184040_1530.plist.p7 -inkey server.key > push_signed.req
あとは、push_signed.reqをApple Push Certificate Portalにアップロード。いえい
このスクラップは2023/02/20にクローズされました