2012-10-19 61 views
1

我試圖建立一個MDM服務器是:從iOS設備解開一個PKCS7有效載荷(MDM入學)

p7sign = OpenSSL::PKCS7::PKCS7.new(req.body) 
store = OpenSSL::X509::Store.new 
p7sign.verify(nil, store, nil, OpenSSL::PKCS7::NOVERIFY) 
signers = p7sign.signers 

我有這個很基本的代碼的NodeJS接收&店在POST有效載荷:

exports.profile = function(req, res) { 
    var queryData = ""; 
    req.on('data', function(chunk) { 
     queryData += chunk; 
    }); 
    req.on('end', function() { 
     fs.writeFileSync('out.p7s', queryData); 
    }); 
    res.send('1'); 
}; 

但是給定的文件:https://dl.dropbox.com/u/2310128/ios-mdm.p7s

無法似乎是OpenSSL的所有認可!

openssl pkcs7 -in req.p7s -inform DER -print_certs 

將返回:

unable to load PKCS7 object 
140735186985436:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long:asn1_lib.c:150: 

任何想法可以去錯在這裏?是否有一些額外的填充我應該刪除?給定的文件是不是PKCS7?

請求頭:

{ host: '192.168.22.39:3000', 
    'accept-encoding': 'gzip, deflate', 
    'content-type': 'application/pkcs7-signature', 
    'accept-language': 'fr-fr', 
    cookie: 'connect.sid=s%3Andcjz5pGCdb1AYXhNG8Us5mh.5szK2X1cOpnih9X5kCbqTUdpv8EyJRwNHl4VC6M5Gwk', 
    accept: '*/*', 
    'content-length': '3564', 
    connection: 'keep-alive', 
    'user-agent': 'Profile/1.0' } 

謝謝!

回答

0

我不得不用Buffer.concat正確追加二進制緩存&使其發揮作用。

+0

那麼你的最終代碼最終看起來像什麼?我在我的中間件中使用Buffer.concat將req.rawBody作爲二進制緩衝區。我遇到了你之前遇到的同樣的問題。 – smtlaissezfaire

0

您共享的文件沒有行尾字符。我不是NodeJS的專家,但看起來你並沒有將文件保存爲二進制文件。你可以嘗試進行以下更改以查看這是否有效?

req.on('end', function() { 
    fs.writeFileSync('out.p7s', queryData, 'binary'); 
}); 
+0

沒有工作,我試圖使用緩衝區串聯,也許字符串以某種方式打破二進制數據。 – Olivier

+1

@Oiviv不知道這是否有幫助,但是這是我在MDM註冊期間保存的有效pkcs7文件:[ota-response.p7s](https://dl.dropbox.com/s/wc6mifwx8v4rxoy/ota-response。 p7s) –