Foxtable(狐表)用户栏目专家坐堂 → 企业微信 GetJsSignature 报 TLS 错误


  共有171人关注过本帖树形打印复制链接

主题:企业微信 GetJsSignature 报 TLS 错误

帅哥哟,离线,有人找我吗?
zhutangxin
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:476 积分:4084 威望:0 精华:0 注册:2016/10/14 13:40:00
企业微信 GetJsSignature 报 TLS 错误  发帖心情 Post By:2025/2/18 2:57:00 [只看该作者]

老师: 下述问题怎么解决? (已经试过申请SSL证书,启动 https 服务, 错误是一样的。)

在执行企业微信 GetJsSignature时,如果不启用 TLS 1.2/1.3, 报错如下:

获取jsapi_ticket,原因:
{
  "errcode": 48010,
  "errmsg": "you are using TLS 1.0/1.1 which is deprecated, please use TLS 1.2 or higher, hint: [1739816396123491785466345], from ip: 119.45.196.00, more info at https://open.work.weixin.qq.com/devtool/query?e=48010"
}


企业微信 GetJsSignature 的代码如下:

Static CreateTime As Date '记录最近一次生成Ticket 的时间
Static Ticket As String '记录最近一次生成的Ticket

Dim token As String = Functions.Execute("GetQyWxAccessToken") ' 2024-8-24
If token.Length > 0 Then     
    Dim tp As TimeSpan = Date.Now - CreateTime
    Dim ul As String = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token={0}"
    If tp.TotalSeconds > 3600 Then
        
' token 正确
        Dim hc As New HttpClient(CExp(ul, token))
' 可以拼出 url: CExp(ul, token)

        Dim ret As String = hc.GetData()

        CreateTime = Date.Now()
        Dim jo As JObject = JObject.Parse(ret)
        If jo("errcode") = "0" Then
            Ticket = jo("ticket")
        Else
            Output.Logs("token").Add("获取jsapi_ticket,原因:" & vbcrlf & jo.ToString)
            Output.Logs("token").Save(ProjectPath & "token.txt",True) '日志位于当前项目目录里
            Output.Logs("token").Clear
            ' 出错点
        End If
    End If
    Dim signature As String = CExp("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}", Ticket, args(0), args(1), args(2))
    Return Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(signature, "SHA1").ToLower()
End If


在服务器上,按AI的建议,用批处理文件(该文件的代码见最后)修改注册表,启动 TLS 1.2 和 1.3 但登录时会抛出如下错误:


事件/函数: 
基础连接已经关闭: 发送时发生错误。
   在 System.Net.HttpWebRequest.GetResponse()
   在 Foxtable.HttpClient.GetData(Boolean SkipErr)
由于意外的数据包格式,握手失败。
   在 System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   在 System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   在 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   在 System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   在 System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   在 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   在 System.Net.TlsStream.CallProcessAuthentication(Object state)
   在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   在 System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   在 System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   在 System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   在 System.Net.ConnectStream.WriteHeaders(Boolean async)

修改注册表的批处理文件内容如下:

::65001 代表使用UTF-8编码,避免中文提示乱码
chcp 65001
@echo 正在添加TLS1.2和1.3键(项)......
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client"
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server"
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client"
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server"
@echo 正在添加TLS1.2和1.3值(DWORD)......
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v DisabledByDefault /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Client" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server" /v DisabledByDefault /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server" /v Enabled /t REG_DWORD /d 1 /f
@echo 正在添加TLS1.0和1.1键(项)......
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client"
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server"
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client"
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server"
@echo 正在禁用1.0和1.1低版本TLS协议......
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client" /v DisabledByDefault /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client" /v Enabled /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v DisabledByDefault /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client" /v DisabledByDefault /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client" /v Enabled /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v DisabledByDefault /t REG_DWORD /d 1 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v Enabled /t REG_DWORD /d 0 /f
@echo TLS配置已完成,请重启电脑,使TLS协议配置生效!!!
pause

[此贴子已经被作者于2025/2/18 3:19:14编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:112355 积分:572031 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2025/2/18 8:38:00 [只看该作者]

GetJsSignature 第一行前面加上一行

Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls12 

如果不行先恢复注册表再试试

 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:476 积分:4084 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2025/2/19 10:51:00 [只看该作者]

我增加了代码如下,问题解决了。

System.Net.ServicePointManager.SecurityProtocol = DirectCast(3072 Or 192, System.Net.SecurityProtocolType) ' 192 对应 Tls(TLS 1.0); 3072 对应 Tls12(TLS 1.2)

  • .NET Framework 4.0 默认不支持 TLS 1.2/1.3

  • 可以通过直接使用数值 3072 来启用 TLS 1.2。

  • 如果需要支持 TLS 1.3,必须升级到 .NET Framework 4.8 或更高版本。

  • 建议升级到 .NET Framework 4.5 或更高版本,以获得更好的 TLS 支持和安全性。


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:112355 积分:572031 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2025/2/19 11:00:00 [只看该作者]

直接赋值就行

System.Net.ServicePointManager.SecurityProtocol = 3072

 回到顶部