繁体   English   中英

SSL 发送 Firebase 消息时出现问题

[英]SSL problem while sending Firebase Message

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

当我在服务器上启用所有协议和密码套件时,应用程序运行没有问题。 但是当我禁用 TLS 1.0 协议时,调用 SendAsync function 时会导致“客户端和服务器无法通信,因为它们不具备通用算法”错误。如果我再次启用 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 协议?

加里

我终于知道为什么了。 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

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

加里

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM