1

Apple の APNS サービスへの接続を確立しようとしています。UbuntuでMonoを実行しています。接続を確立するために使用されているコードは、Windows 環境で問題なく動作します。コードは、Web サイトやサービスではなく、NT サービス (システム プロセス) の一部です。

環境に関する情報は次のとおりです。Ubuntu 12.10。モノ 3.0.5。Mono の Certmgr の使用:

  • APNS 証明書を Mono マシンの証明書ストア (MY) にインストールしました。
  • APNS 証明書の秘密鍵を Mono マシンの証明書ストア (キーペア) にインストールしました。
  • Entrust.net 認証局 (2048) ルート証明書を Mono マシンの証明書ストア (TRUST) にインストールしました。
  • Entrust Certification Authority - 1LC Intermediate Certificate を Mono マシンの証明書ストア (CA) にインストールしました。

Telnet は、gateway.push.apple.com:2195 に到達できます。MonoDevelop でコードをデバッグしています。MonoDevelop はルート (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 つは、gateway.push.apple.com の Apple の公開鍵を含み、1 つは Entrust の中間証明書を含み、1 つは Entrust のルート証明書を含みます。

私はすべてを 2 回、3 回チェックしましたが、ここからどこへ行くべきかわかりません。どんな助けでも大歓迎です!

4

1 に答える 1

0

これを理解しました。AuthenticateAsClientに関しては、WindowsとMono(少なくともLinuxでは)の動作が異なることがわかりました。証明書チェーンに基づいて、Windowsは認証時に使用する証明書について「最良の推測」を行います(APNS証明書はチェーン内の唯一の証明書であるため、簡単に推測できます)。

モノはまったく「推測」しません。LocalCertificateSelectionCallbackを使用して証明書を指定する必要があります。私のように「null」のままにすることはできません

于 2012-12-17T15:00:42.523 に答える