Я пытаюсь установить подключение к службе 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.
Я дважды и трижды проверил все и просто не знаю, куда идти. Любая помощь будет очень признательна!