发送 Firebase 消息时出现 SSL 问题

SSL problem while sending Firebase Message

我正在尝试使用 .Net SDK 通过 Google Firebase 向应用程序发送通知。 我可以在我的电脑上成功发送消息,但在我的 Windows 2016 服务器上失败。根据错误信息,这似乎是 SSL/TLS 通信问题。

当我在服务器上启用所有协议和密码套件时,应用程序运行没有问题。但是,当我禁用 TLS 1.0 协议时,它会在调用 SendAsync 函数时导致“客户端和服务器无法通信,因为它们不具备通用算法”错误。如果我再次启用 TLS 1.0 但禁用一些使用 CBC 的弱密码套件,它会导致“请求被中止:无法创建 SSL/TLS 安全通道 。”错误。

[WebException: The request was aborted: Could not create SSL/TLS secure channel.]
   System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context) +337
   System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) +145

[HttpRequestException: An error occurred while sending the request.]
   Google.Apis.Http.<SendAsync>d__69.MoveNext() +4670
   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +32
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
   Google.Apis.Auth.OAuth2.Requests.<ExecuteAsync>d__1.MoveNext() +402
   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +32
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
   Google.Apis.Auth.OAuth2.<RequestAccessTokenAsync>d__38.MoveNext() +492
   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +32
   Google.Apis.Auth.OAuth2.<RefreshTokenAsync>d__12.MoveNext() +766
   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +32
   Google.Apis.Auth.OAuth2.TokenRefreshManager.ResultWithUnwrappedExceptions(Task`1 task) +138
   System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() +104
   System.Threading.Tasks.Task.Execute() +71
...

这真的很奇怪。 C# SDK 是否仅支持 TLS 1.0 和旧密码套件??还是 .Net 框架问题?

这是我的代码,在 vb.net

Async Function sendMessage(ByVal Message As Messaging.Message) As Threading.Tasks.Task(Of String)

    Dim app As FirebaseApp

    Try
        app = FirebaseApp.Create(New AppOptions With { _
            .ProjectId = "xxx", _
            .Credential = GoogleCredential.FromFile(Server.MapPath("xxx-yyyy.json")) _
        }, "lab6")
    Catch ex As Exception
        app = FirebaseApp.GetInstance("lab6")
    End Try


    Dim result As String = ""

    Dim firebaseMessagingInstance As FirebaseMessaging = FirebaseMessaging.GetMessaging(app)

    result = Await firebaseMessagingInstance.SendAsync(Message)

    Return result

End Function

调用SendAsync方法时出现异常

.Net框架版本:4.6.1

FirebaseAdmin SDK 版本:2.2.0

知道为什么会这样吗?有没有办法强制使用 TLS 1.2 协议?

加里

TLS 1.2(当前)似乎是唯一受支持的协议。没有必要强制执行它,但必须安装它,这样协议协商才会成功。请参考这个 how-to install TLS 1.2 on a Windows 2016 Server... or the MSDN, for how to set it as default. IISCrypto 似乎对检查设置很有用。

我终于找到原因了。 Windows Server 2016 原生支持 TLS 1.2,但 .Net framework 4.6.1 并未将其用作默认协议。我们必须设置一个注册表来告诉 .Net 使用强加密。

使用 regedit.exe 添加或设置注册表项:

HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319
HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319
Name: SchUseStrongCrypto
Type: DWORD
Value: 1

通过添加此条目解决了我的问题。

加里