无法建立 SSL/TLS 安全通道的信任关系 -- SOAP

发布于 2024-07-15 22:40:56 字数 410 浏览 4 评论 0原文

我有一个简单的 Web 服务调用,由 .NET (C#) 2.0 Windows 应用程序通过 Visual Studio 生成的 Web 服务代理生成,用于同样用 C# (2.0) 编写的 Web 服务。 这种做法已经行之有效了好几年,并且在十几个正在运行的地方继续如此。

新站点的新安装遇到了问题。 尝试调用 Web 服务时,失败并显示以下消息:

无法建立 SSL/TLS 安全信任关系 频道

Web 服务的 URL 使用 SSL (https://) ——但这已经在许多其他位置工作了很长时间(并且继续如此)。

我该往哪里看? 这可能是 Windows 和 .NET 之间的安全问题,是此安装特有的吗? 如果是这样,我在哪里建立信任关系? 我迷路了!

I have a simple web service call, generated by a .NET (C#) 2.0 Windows app, via the web service proxy generated by Visual Studio, for a web service also written in C# (2.0). This has worked for several years, and continues to do so at the dozen or so places where it is running.

A new installation at a new site is running into a problem. When attempting to invoke the web service, it fails with the message saying:

Could not establish a trust relationship for the SSL/TLS secure
channel

The URL of the web service uses SSL (https://) -- but this has been working for a long time (and continues to do so) from many other locations.

Where do I look? Could this be a security issue between Windows and .NET that is unique to this install? If so, where do I set up trust relationships? I'm lost!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(18

瑾夏年华 2024-07-22 22:40:56

以下代码片段将修复您调用的服务器上的 SSL 证书出现问题的情况。 例如,它可能是自签名的,或者证书和服务器之间的主机名可能不匹配。

如果您正在调用超出您直接控制范围的服务器,这很危险,因为您无法再确定正在与您认为已连接的服务器进行通信。 但是,如果您正在处理内部服务器并且获得“正确”的证书不切实际,请使用以下命令告诉 Web 服务忽略证书问题并勇敢地继续下去。

前两个使用 lambda 表达式,第三个使用常规代码。 第一个接受任何证书。 最后两项至少检查证书中的主机名是否是您期望的主机名。
...希望您觉得它有帮助

//Trust all certificates
System.Net.ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

// trust sender
System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
    bool result = cert.Subject.Contains("YourServerName");
    return result;
}

The following snippets will fix the case where there is something wrong with the SSL certificate on the server you are calling. For example, it may be self-signed or the host name between the certificate and the server may not match.

This is dangerous if you are calling a server outside of your direct control, since you can no longer be as sure that you are talking to the server you think you're connected to. However, if you are dealing with internal servers and getting a "correct" certificate is not practical, use the following to tell the web service to ignore the certificate problems and bravely soldier on.

The first two use lambda expressions, the third uses regular code. The first accepts any certificate. The last two at least check that the host name in the certificate is the one you expect.
... hope you find it helpful

//Trust all certificates
System.Net.ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

// trust sender
System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
    bool result = cert.Subject.Contains("YourServerName");
    return result;
}
转身泪倾城 2024-07-22 22:40:56

非常简单的“包罗万象”解决方案是这样的:

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

sebastian-castaldi 的解决方案更详细一些。

The very simple "catch all" solution is this:

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

The solution from sebastian-castaldi is a bit more detailed.

眼趣 2024-07-22 22:40:56

想法(基于过去的痛苦):

  • 你有 DNS 和服务器的视线吗?
  • 您使用的证书名称是否正确?
  • 证书还有效吗?
  • 配置不当的负载均衡器是否会造成混乱?
  • 新的服务器机器的时钟设置是否正确(即UTC时间是正确的[忽略本地时间,这在很大程度上是无关紧要的]) - 这对于WCF来说当然很重要,因此可能会影响常规的SOAP?
  • 是否存在证书信任链问题? 如果从服务器浏览到soap服务,能得到SSL吗?
  • 与上述相关 - 证书是否安装到正确的位置? (您可能需要受信任的根证书颁发机构中的副本)
  • 服务器的机器级代理设置是否正确? (与用户的代理不同); 请参阅 XP / 2003 的 proxycfg(不确定 Vista 等)

Thoughts (based on pain in the past):

  • do you have DNS and line-of-sight to the server?
  • are you using the correct name from the certificate?
  • is the certificate still valid?
  • is a badly configured load balancer messing things up?
  • does the new server machine have the clock set correctly (i.e. so that the UTC time is correct [ignore local time, it is largely irrelevent]) - this certainly matters for WCF, so may impact regular SOAP?
  • is there a certificate trust chain issue? if you browse from the server to the soap service, can you get SSL?
  • related to the above - has the certificate been installed to the correct location? (you may need a copy in Trusted Root Certification Authorities)
  • is the server's machine-level proxy set correctly? (which different to the user's proxy); see proxycfg for XP / 2003 (not sure about Vista etc)
韵柒 2024-07-22 22:40:56

我个人最喜欢以下解决方案:

using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

...然后在请求收到错误之前,执行以下操作

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

在咨询卢克的解决方案

I personally like the following solution the most:

using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

... then before you do request getting the error, do the following

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

Found this after consulting Luke's Solution

绝影如岚 2024-07-22 22:40:56

如果您不想盲目信任每个人并仅对某些主机设置信任例外,则以下解决方案更合适。

public static class Ssl
{
    private static readonly string[] TrustedHosts = new[] {
      "host1.domain.com", 
      "host2.domain.com"
    };

    public static void EnableTrustedHosts()
    {
      ServicePointManager.ServerCertificateValidationCallback = 
      (sender, certificate, chain, errors) =>
      {
        if (errors == SslPolicyErrors.None)
        {
          return true;
        }

        var request = sender as HttpWebRequest;
        if (request != null)
        {
          return TrustedHosts.Contains(request.RequestUri.Host);
        }

        return false;
      };
    }
}

然后,只需在应用程序启动时调用 Ssl.EnableTrustedHosts 即可。

If you do not wan't to blindly trust everybody and make a trust exception only for certain hosts the following solution is more appropriate.

public static class Ssl
{
    private static readonly string[] TrustedHosts = new[] {
      "host1.domain.com", 
      "host2.domain.com"
    };

    public static void EnableTrustedHosts()
    {
      ServicePointManager.ServerCertificateValidationCallback = 
      (sender, certificate, chain, errors) =>
      {
        if (errors == SslPolicyErrors.None)
        {
          return true;
        }

        var request = sender as HttpWebRequest;
        if (request != null)
        {
          return TrustedHosts.Contains(request.RequestUri.Host);
        }

        return false;
      };
    }
}

Then just call Ssl.EnableTrustedHosts when your app starts.

美人如玉 2024-07-22 22:40:56

如果您使用的是 Windows 2003,您可以尝试以下操作:

打开 Microsoft 管理控制台
(开始-->运行-->mmc.exe);

选择文件--> 添加/删除管理单元;

在“独立”选项卡中,选择“添加”;

选择证书管理单元,然后
单击“添加”;

在向导中,选择计算机
帐户,然后选择本地
电脑。 按完成结束
向导;

关闭“添加/删除管理单元”对话框;

导航到证书(本地
电脑)并选择一家商店
导入:

如果您有根 CA 证书
对于发行该
证书,选择受信任的根
认证机构;

如果您有证书
服务器本身,选择其他人

右键单击商店并选择全部
任务--> 导入

按照向导操作并提供
您拥有的证书文件;

之后,只需重新启动 IIS 并尝试
再次调用网络服务。

参考: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-built-trust-relationship-for-the-SSL/TLS- ...

If you are using Windows 2003, you can try this:

Open Microsoft Management Console
(Start --> Run --> mmc.exe);

Choose File --> Add/Remove Snap-in;

In the Standalone tab, choose Add;

Choose the Certificates snap-in, and
click Add;

In the wizard, choose the Computer
Account, and then choose Local
Computer. Press Finish to end the
wizard;

Close the Add/Remove Snap-in dialog;

Navigate to Certificates (Local
Computer) and choose a store to
import:

If you have the Root CA certificate
for the company that issued the
certificate, choose Trusted Root
Certification Authorities;

If you have the certificate for the
server itself, choose Other People

Right-click the store and choose All
Tasks --> Import

Follow the wizard and provide the
certificate file you have;

After that, simply restart IIS and try
calling the web service again.

Reference: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS-...

逐鹿 2024-07-22 22:40:56

卢克(Luke)就此写了一篇非常好的文章..
非常简单..尝试一下

卢克的解决方案

原因(引自他的文章(减去咒骂))
“..
上面代码的问题是,如果您的证书无效,它就不起作用。 为什么我要发布到带有无效 SSL 证书的网页? 因为我很便宜,而且我不想向 Verisign 或其他 **-* 之一支付我的测试盒证书,所以我自行签署了它。 当我发送请求时,我收到一个可爱的异常:

System.Net.WebException
底层连接已关闭。 无法与远程服务器建立信任关系。

我不了解您的情况,但对我来说,该异常看起来像是由我的代码中的一个愚蠢错误引起的,导致 POST 失败。 所以我一直在寻找、调整、做各种奇怪的事情。 只有在我用谷歌搜索了 ***n 的事情之后,我才发现遇到无效的 SSL 证书后的默认行为是抛出这个异常。
..”

Luke wrote a pretty good article about this ..
pretty straight forward .. give this a try

Luke's Solution

Reason (quote from his article (minus cursing))
"..
The problem with the code above is that it doesn’t work if your certificate is not valid. Why would I be posting to a web page with and invalid SSL certificate? Because I’m cheap and I didn’t feel like paying Verisign or one of the other **-*s for a cert to my test box so I self signed it. When I sent the request I got a lovely exception thrown at me:

System.Net.WebException
The underlying connection was closed. Could not establish trust relationship with remote server.

I don’t know about you, but to me that exception looked like something that would be caused by a silly mistake in my code that was causing the POST to fail. So I kept searching, and tweaking and doing all kinds of weird things. Only after I googled the ***n thing I found out that the default behavior after encountering an invalid SSL cert is to throw this very exception.
.."

夜雨飘雪 2024-07-22 22:40:56

Microsoft 的 SSL 诊断工具也许能够帮助确定问题。

更新链接现已修复。

Microsoft's SSL Diagnostics Tool may be able to help identify the issue.

UPDATE the link has been fixed now.

薯片软お妹 2024-07-22 22:40:56

添加以下内容:

 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;}

在您调用服务的行之前

add this:

 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;}

right before the line that you're calling the service

小傻瓜 2024-07-22 22:40:56

我刚刚遇到这个问题。 我的解决方案是通过手动同步到时间服务器来更新系统时间。 为此,您可以:

  • 右键单击​​任务栏中的时钟
  • 选择调整日期/时间
  • 选择Internet时间选项卡
  • 单击更改设置
  • 选择立即更新

在我的例子中,同步不正确,因此我必须单击它几次才能正确更新。 如果它继续错误更新,您甚至可以尝试使用服务器下拉列表中的不同时间服务器。

I just encountered this issue. My resolution was to update the system time by manually syncing to the time servers. To do this you can:

  • Right-click the clock in the task bar
  • Select Adjust Date/Time
  • Select the Internet Time tab
  • Click Change Settings
  • Select Update Now

In my case this was syncing incorrectly so I had to click it several times before it updated correctly. If it continues to update incorrectly you can even try using a different time server from the server drop-down.

如何视而不见 2024-07-22 22:40:56

尝试一下:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

请注意,您至少必须使用 4.5 .NET 框架

Try this:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

Notice that you have to work at least with 4.5 .NET framework

甩你一脸翔 2024-07-22 22:40:56

我在 Internet Explorer 中的 .NET 应用程序中遇到了类似的问题。

我解决了将证书(在我的例子中为 VeriSign 3 类证书)添加到受信任的编辑器证书中的问题。

Go to Internet Options-> Content -> Publishers and import it

如果您导出证书即可获得:

Internet Options-> Content -> Certificates -> Intermediate Certification Authorities -> VeriSign Class 3 Public Primary Certification Authority - G5

谢谢

I had a similar problem in .NET app in Internet Explorer.

I solved the problem adding the certificate (VeriSign Class 3 certificate in my case) to trusted editors certificates.

Go to Internet Options-> Content -> Publishers and import it

You can get the certificate if you export it from:

Internet Options-> Content -> Certificates -> Intermediate Certification Authorities -> VeriSign Class 3 Public Primary Certification Authority - G5

thanks

随心而道 2024-07-22 22:40:56

我在一个网络服务器上运行时遇到了这个错误,其网址如下:

a.b.domain.com

但没有证书,所以我得到了一个名为“

a_b.domain.com

Just puthinttothissolutionhere”的 DNS,因为这在谷歌中排名最高。

I had this error running against a webserver with url like:

a.b.domain.com

but there was no certificate for it, so I got a DNS called

a_b.domain.com

Just putting hint to this solution here since this came up top in google.

把人绕傻吧 2024-07-22 22:40:56

对于那些通过 VS 客户端遇到此问题的人,一旦成功添加了服务引用并尝试执行第一个调用,就会出现此异常:
“底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系”
如果您使用(如我的情况)带有 IP 地址的端点 URL 并遇到此异常,那么您可能需要执行以下步骤重新添加服务引用:

  • 在 Internet Explorer 上打开端点 URL。
  • 单击证书错误(地址栏中的红色图标)
  • 单击查看证书。
  • 获取发布到:“名称”并替换 IP 地址或我们正在使用的任何名称,并收到此“名称”的错误。

再试一次 :)。
谢谢

For those who are having this issue through a VS client side once successfully added a service reference and trying to execute the first call got this exception:
“The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel”
If you are using (like my case) an endpoint URL with the IP address and got this exception, then you should probably need to re-add the service reference doing this steps:

  • Open the endpoint URL on Internet Explorer.
  • Click on the certificate error (red icon in address bar)
  • Click on View certificates.
  • Grab the issued to: "name" and replace the IP address or whatever name we were using and getting the error for this "name".

Try again :).
Thanks

疯狂的代价 2024-07-22 22:40:56

就我而言,我尝试使用 IIS 7 在 Visual Studio 环境中测试 SSL

这就是我最终所做的使其正常工作:

  • 在我的网站下的“绑定..”在 IIS 右侧的“绑定...”部分中,我必须将“https”绑定添加到端口 443 并选择“IIS Express 开发证书”。

  • 在我的网站右侧的“高级设置...”部分中,我必须将“启用的协议”从“http”更改为“https”。

  • 在“SSL 设置”图标下,我为客户端证书选择了“接受”。

  • 然后我必须回收应用程序池。

  • 我还必须使用 mmc.exe 将本地主机证书导入到我的个人存储中。

我的 web.config 文件已经正确配置,所以在我整理完以上所有内容后,我就可以继续我的测试了。

In my case I was trying to test SSL in my Visual Studio environment using IIS 7.

This is what I ended up doing to get it to work:

  • Under my site in the 'Bindings...' section on the right in IIS, I had to add the 'https' binding to port 443 and select "IIS Express Developement Certificate".

  • Under my site in the 'Advanced Settings...' section on the right I had to change the 'Enabled Protocols' from "http" to "https".

  • Under the 'SSL Settings' icon I selected 'Accept' for client certificates.

  • Then I had to recycle the app pool.

  • I also had to import the local host certificate into my personal store using mmc.exe.

My web.config file was already configured correctly, so after I got all the above sorted out, I was able to continue my testing.

薔薇婲 2024-07-22 22:40:56

我的解决方案(VB.Net,此应用程序的“临时”(UAT)版本需要使用“临时”证书,但一旦请求位于实时站点上,就不会影响请求):

    ...
        Dim url As String = ConfigurationManager.AppSettings("APIURL") & "token"
        If url.ToLower().Contains("staging") Then
           System.Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications
        End If
    ...

    Private  Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function

My solution (VB.Net, the "staging" (UAT) version of this application needs to work with the "staging" certificate but not affect requests once they are on the live site):

    ...
        Dim url As String = ConfigurationManager.AppSettings("APIURL") & "token"
        If url.ToLower().Contains("staging") Then
           System.Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications
        End If
    ...

    Private  Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function
我很OK 2024-07-22 22:40:56

我已经使用了一段时间的一个变体,如果对任何人有帮助的话。

调用者必须明确请求需要不受信任的认证,并在完成后将回调放回到默认状态。

    /// <summary>
    /// Helper method for returning the content of an external webpage
    /// </summary>
    /// <param name="url">URL to get</param>
    /// <param name="allowUntrustedCertificates">Flags whether to trust untrusted or self-signed certificates</param>
    /// <returns>HTML of the webpage</returns>
    public static string HttpGet(string url, bool allowUntrustedCertificates = false) {
        var oldCallback = ServicePointManager.ServerCertificateValidationCallback;
        string webPage = "";
        try {
            WebRequest req = WebRequest.Create(url);

            if (allowUntrustedCertificates) {
                // so we can query self-signed certificates
                ServicePointManager.ServerCertificateValidationCallback = 
                    ((sender, certification, chain, sslPolicyErrors) => true);
            }

            WebResponse resp = req.GetResponse();
        
            using (StreamReader sr = new StreamReader(resp.GetResponseStream())) {
                webPage = sr.ReadToEnd().Trim();
                sr.Close();
            }
            return webPage;
        }
        catch {
            // if the remote site fails to response (or we have no connection)
            return null;
        }
        finally {
            ServicePointManager.ServerCertificateValidationCallback = oldCallback;
        }
    }

A variation I've been using for a while it if helps anyone.

The caller has to explicitly request that untrusted certifications are required and places the callback back into it's default state upon completion.

    /// <summary>
    /// Helper method for returning the content of an external webpage
    /// </summary>
    /// <param name="url">URL to get</param>
    /// <param name="allowUntrustedCertificates">Flags whether to trust untrusted or self-signed certificates</param>
    /// <returns>HTML of the webpage</returns>
    public static string HttpGet(string url, bool allowUntrustedCertificates = false) {
        var oldCallback = ServicePointManager.ServerCertificateValidationCallback;
        string webPage = "";
        try {
            WebRequest req = WebRequest.Create(url);

            if (allowUntrustedCertificates) {
                // so we can query self-signed certificates
                ServicePointManager.ServerCertificateValidationCallback = 
                    ((sender, certification, chain, sslPolicyErrors) => true);
            }

            WebResponse resp = req.GetResponse();
        
            using (StreamReader sr = new StreamReader(resp.GetResponseStream())) {
                webPage = sr.ReadToEnd().Trim();
                sr.Close();
            }
            return webPage;
        }
        catch {
            // if the remote site fails to response (or we have no connection)
            return null;
        }
        finally {
            ServicePointManager.ServerCertificateValidationCallback = oldCallback;
        }
    }
執念 2024-07-22 22:40:56

如果证书不工作,当ServerCertificateValidationCallback返回true;
我的 ServerCertificateValidationCallback 代码:

ServicePointManager.ServerCertificateValidationCallback += delegate
{
    LogWriter.LogInfo("Проверка сертификата отключена, на уровне ServerCertificateValidationCallback");
    return true;
};

我的代码被阻止执行 ServerCertificateValidationCallback:

     if (!(ServicePointManager.CertificatePolicy is CertificateValidation))
    {
        CertificateValidation certValidate = new CertificateValidation();
        certValidate.ValidatingError += new CertificateValidation.ValidateCertificateEventHandler(this.OnValidateCertificateError);
        ServicePointManager.CertificatePolicy = certValidate;
    }

OnValidateCertificateError 函数:

private void OnValidateCertificateError(object sender, CertificateValidationEventArgs e)
{
    string msg = string.Format(Strings.OnValidateCertificateError, e.Request.RequestUri, e.Certificate.GetName(), e.Problem, new Win32Exception(e.Problem).Message);
    LogWriter.LogError(msg);
    //Message.ShowError(msg);
}

我禁用了 CertificateValidation 代码并且 ServerCertificateValidationCallback 运行得很好

If not work bad sertificate, when ServerCertificateValidationCallback return true;
My ServerCertificateValidationCallback code:

ServicePointManager.ServerCertificateValidationCallback += delegate
{
    LogWriter.LogInfo("Проверка сертификата отключена, на уровне ServerCertificateValidationCallback");
    return true;
};

My code which the prevented execute ServerCertificateValidationCallback:

     if (!(ServicePointManager.CertificatePolicy is CertificateValidation))
    {
        CertificateValidation certValidate = new CertificateValidation();
        certValidate.ValidatingError += new CertificateValidation.ValidateCertificateEventHandler(this.OnValidateCertificateError);
        ServicePointManager.CertificatePolicy = certValidate;
    }

OnValidateCertificateError function:

private void OnValidateCertificateError(object sender, CertificateValidationEventArgs e)
{
    string msg = string.Format(Strings.OnValidateCertificateError, e.Request.RequestUri, e.Certificate.GetName(), e.Problem, new Win32Exception(e.Problem).Message);
    LogWriter.LogError(msg);
    //Message.ShowError(msg);
}

I disabled CertificateValidation code and ServerCertificateValidationCallback running very well

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文