发送 Firebase 消息时出现 SSL 问题

Posted

技术标签:

【中文标题】发送 Firebase 消息时出现 SSL 问题【英文标题】:SSL problem while sending Firebase Message 【发布时间】:2021-10-21 16:55:32 【问题描述】:

我正在尝试使用 .Net SDK 通过 Google Firebase 向应用发送通知。 我可以在我的计算机上成功发送消息,但在我的 Windows 2016 Server 上失败。根据错误信息,似乎是 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 协议?

加里

【问题讨论】:

【参考方案1】:

我终于找到了原因。 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

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

加里

【讨论】:

【参考方案2】:

TLS 1.2(当前)似乎是唯一受支持的协议。不需要强制执行,但必须安装它,这样协议协商才会成功。请参阅how-to 在 Windows 2016 服务器上安装 TLS 1.2... 或MSDN,了解如何将其设置为默认值。 IISCrypto 似乎对检查设置很有用。

【讨论】:

以上是关于发送 Firebase 消息时出现 SSL 问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 Firebase 函数发送电子邮件时出现 Firebase SendGrid 错误 - 错误:错误请求

使用 HttpWebRequest 通过 SSL 发送请求时出现错误 502(错误网关)

使用 smtp 和 Python 发送电子邮件时出现 SSL 错误

使用 Devise 发送 PostMark 邮件时出现 SSL 错误

使用 notnoopapns 向 apns 发送推送通知时出现 ssl 错误

Firebase 消息:由于所需的 APNs SSL 证书已过期或未上传,无法向 iOS 设备发送消息