Подключитесь к службе APNS с помощью Mono в Ubuntu

Я пытаюсь установить подключение к службе Apple APNS. Я использую Mono на Ubuntu. Код, используемый для установления соединения, работает в среде Windows без проблем. Код является частью службы NT (системного процесса), а не веб-сайта или службы.

Вот некоторая информация о среде: Ubuntu 12.10. Моно 3.0.5. Используя Certmgr Mono:

  • Я установил сертификат APNS в хранилище сертификатов компьютеров Mono (MY).
  • Я установил закрытый ключ сертификата APNS в хранилище сертификатов компьютера Mono (пары ключей).
  • Я установил корневой сертификат Entrust.net Certification Authority (2048) в хранилище сертификатов компьютеров Mono (TRUST).
  • Я установил Entrust Certification Authority - 1LC Intermediate Certificate в хранилище сертификатов компьютеров Mono (CA).

Telnet может подключиться к gateway.push.apple.com:2195. Я отлаживаю код в MonoDevelop. MonoDevelop работает как Root (gksudo).

Вот ошибка, которую я получаю:

System.IO.IOException: The authentication or decryption has failed. --->
Mono.Security.Protocol.Tls.TlsException: The authentication or decryption has failed.
at Mono.Security.Protocol.Tls.RecordProtocol.ProcessAlert (AlertLevel alertLevel, AlertDescription alertDesc) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 }

Вот код, который я использую для установления соединения:

m_client = new TcpClient("gateway.push.apple.com", 2195);
m_ssl = new SslStream(m_client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
m_ssl.AuthenticateAsClient("gateway.push.apple.com", m_certColl, System.Security.Authentication.SslProtocols.Tls, false);

Дополнительная информация от отладчика:

m_certColl содержит 1 сертификат, сертификат APNS, как и должно быть. В отладчике я подтвердил, что заполняются как открытый, так и закрытый ключ. RemoteCertificateValidationCallback не возвращает SslPolicyErrors. Могу подтвердить, что в цепочке 3 сертификата. 1, содержащий открытый ключ Apple для gateway.push.apple.com, 1, содержащий промежуточный сертификат Entrust, и 1, содержащий корневой сертификат Entrust.

Я дважды и трижды проверил все и просто не знаю, куда идти. Любая помощь будет очень признательна!


person user1585458    schedule 14.12.2012    source источник


Ответы (1)


Разобрался в этом. Оказывается, Windows и Mono (по крайней мере, в Linux) ведут себя по-разному, когда дело доходит до AuthenticateAsClient. На основе вашей цепочки сертификатов Windows сделает «наилучшее предположение» относительно того, какой сертификат использовать при аутентификации (поскольку сертификат APNS является единственным сертификатом в цепочке, это легко догадаться)

Моно вообще не будет «гадать». Вы должны указать сертификат с помощью LocalCertificateSelectionCallback. Вы не можете оставить его "нулевым", как это сделал я

person user1585458    schedule 17.12.2012