新版Google浏览器跨域Cookie解决方案

时间:2024-02-18 11:01:35

一、前言

针对Chrome版本67及以上

不能将其他域的Cookie传递过来

注意,这个里面的SameSite不能设为null,设空的话,还是会走默认值Lax

其中,SameSite的值可以填3个:Strict、Lax、None.
缺省的值为Lax,而且当你设置其为空时,在新的Chrome中还是会给予默认值Lax.

注意:IE和FireFox等可以直接跨域携带Cookie

1.1、前端请求

前端发送的请求必须告知携带了Cookie并进行跨域请求

xhrFields: {
    withCredentials: true
},
crossDomain: true,

例如:ajax

        function getTest() {
            $.ajaxSetup({
                type: \'get\',
                url: \'https://manage.hk.com:8443/s/test\',
                // 跨域携带Cookie
                xhrFields: {
                    withCredentials: true
                },
                crossDomain: true,
                success: function (res) {
                    console.log(res);
                    $("#test").html(res);
                    return false;
                },
                error: function () {
                    alert(\'请求错误\');
                    return false;
                }

            });
            $.ajax();
        }

        function postTest() {
            $.ajaxSetup({
                type: \'post\',
                url: \'https://manage.hk.com:8443/s/test1\',
                // 跨域携带Cookie
                xhrFields: {
                    withCredentials: true
                },
                crossDomain: true,
                success: function (res) {
                    console.log(res);
                    $("#test").html(res);
                    return false;
                },
                error: function () {
                    alert(\'请求错误\');
                    return false;
                }
            });
            $.ajax();
        }
    <button onclick="getTest()">Get</button>
    <button onclick="postTest()">POST</button>
    <p id="test"></p>

1.2. 三模式介绍

Strict(严格模式)

Lax(宽松模式 默认)

None(可以在第三方环境中发送cookie 在这种模式下,必须同时启用Secure才行)

Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。

二、Tomcat下配置

位置:apache-tomcat-8.5.66\conf目录下

找到context.xml文件打开

<!-- 加入 -->
<CookieProcessor sameSiteCookies="None"/>

找到web.xml文件打开

<!-- 找到如下配置 大概在627行左右 -->
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

<!-- 修改为该配置  -->
<session-config>
    <session-timeout>30</session-timeout>
    <cookie-config>
        <secure>true</secure>
    </cookie-config>
</session-config>

注意:此时Cookie 只能通过 HTTPS 协议发送

三、Http变Https

3.1、生成SSL证书

通过JDK生成一个SSL证书

自带的keytool命令生成

在需要保存SSL证书的文件目录下打开CMD命令窗口输入一下指令

keytool -genkey -alias tomcat -keyalg RSA

Tomcat口令和密钥口令尽量保持一致,回车即可

不然在tomcat配置完server.xml之后有可能会导致启动失败

 

 注意:密钥库口令和新口令必须一直,具体我也不清楚哈

每一个输完按回车键进入下一项即可

此时在该目录下回看到一个名为 ".keystore" 的证书文件

3.2、配置Tomcat

位置:apache-tomcat-8.5.66\conf目录下

找到server.xml文件打开

<!--  找到如下文件 大概在91行左右  -->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
</Connector> -->

<!--  打开注释,缺少那个补那个,也可直接复制替换所有 -->
<!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
    <Connector port="8443"
    protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" 
               SSLEnabled="true" 
               scheme="https" secure="true"
               keystoreFile="C:\Users\Master\.keystore" 
               keystorePass="123456"
               clientAuth="false" sslProtocol="TLS" />
keystoreFile :SSL证书所在磁盘路径
keystorePass :设置的口令

对于protocol有多种配置方法,如是否启用apr的方式,不同的方式有不同的配置,具体可以参考官方文档
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html ,这里我采用Http11Protocol,它采用的是BIO的方式处理网络连接请求。至于bio,nio,apr三种方式的区别是什么不在本文讨论之列

注意:在Tomcat里配置完成后,如果你使用的idea,记得勾选下面,否则,好像无法加载上面改动的配置信息,具体大家可以自己研究

然后启动tomcat,在启动过程输出的信息中可以看到多了一个监听在8443端口上的连接处理器,如下图所示:

在中间那一行出现了[“http-bio-8443”]这就是用来处理https安全连接的处理器的名字。8443代表的是在Connector中port指定的值,可以配置成其他的,生产环境中显然是配置成默认的443端口。”http-bio-8443”中间的“bio”是因为我们上面配置的是org.apache.coyote.http11.Http11Protocol,它采用的就是bio的方式来处理网络连接请求。(最前面的“http”感觉输出“https”比较合适一点)

此时通过https://codecrazy.cn:8443访问tomcat还是没有建立安全的连接,因为浏览器中并没有安装证书,https的原理以及如何通过CA认证等不在本文讨论之列。本文采用的是一种叫做自签名证书的方法。

3.3、导出SSL证书

通过JDK的keytool指令生成并导出证书

# 一下命令我是在SSL证书所在位置下使用的,所在没有文件路径,默认所在路径
# -keystore \'SSL证书位置\'   -file \'SSL证书导出位置及以.crt为后缀的文件如tomcat.crt\'    -storepass  \'口令\'
keytool -export -alias tomcat -keystore .keystore -file tomcat.crt -storepass 123456

3.4、将文件导入到浏览器中

不同的浏览器会有略有差别

一下以Google浏览器做案例

在地址栏输入chrome://settings/进入设置界面

搜索栏搜索 “安全”

 

 

 

点击进入之后下翻找到 “管理证书” 点击

 

 *切换到如下图红框所示“受信任的根证书颁发机构”*

 

 

 点击导入,再点击下一步,选择“浏览”找到我们上面生成的tomcat.crt文件,然后一路“下一步”,最后完成。 

需要的话,可以重启浏览器后使用https访问应用

3.5、配置应用使用SSL

打开应用的web.xml加入一下配置

<!-- 允许通过SSL连接 -->
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>securedapp</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
  </security-constraint>

将 URL 映射设为 /* ,这样你的整个应用都要求是 HTTPS 访问,而 transport-guarantee 标签设置为 CONFIDENTIAL 以便使应用支持 SSL。

如果你希望关闭 SSL ,只需要将 CONFIDENTIAL 改为 NONE 即可。

重启Tomcat即可

至此大功告成

虽然 JDK 的 keytool 工具也可以免费制作自签名的证书,但这只能用在练习或者测试中,因为如果数字证书颁布商不在浏览器的信任列表中,是会给用户弹出警告框的。作为电子商务网站肯定要用商业的数字证书!

3.6、如访问出现如下提示


您的连接不是私密连接
攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)。了解详情
NET::ERR_CERT_INVALID

将您访问的部分网页的网址、有限的系统信息以及部分网页内容发送给 Google,以帮助我们提升 Chrome 的安全性。隐私权政策
x.x.x.x 通常会使用加密技术来保护您的信息。Google Chrome 此次尝试连接到 x.x.x.x 时,此网站发回了异常的错误凭据。这可能是因为有攻击者在试图冒充 x.x.x.x,或 Wi-Fi 登录屏幕中断了此次连接。请放心,您的信息仍然是安全的,因为 Google Chrome 尚未进行任何数据交换便停止了连接。

您目前无法访问 x.x.x.x,因为此网站发送了 Google Chrome 无法处理的杂乱凭据。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。

 

 或 ‘不是安全连接等’

解决方案:

1、可以不用管,因为我们知道该网站是安全的,点击隐藏详情,高级,继续前往即可

2、解决方法参考百度经验:https://jingyan.baidu.com/article/fdffd1f8f704f7b3e98ca1c6.html

3、在当前页面用键盘输入  thisisunsafe  ,不是在地址栏输入,就直接敲键盘就行了,页面即会自动刷新进入网页

产生原因:

因为Chrome不信任这些自签名ssl证书,为了安全起见,直接禁止访问了,thisisunsafe 这个命令,说明你已经了解并确认这是个不安全的网站,你仍要访问就给你访问了。

 3.7、其他Https方法

可参考一下:https://blog.cat73.org/20170716/2017071601.https/