发送 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 错误