网站配置SSL证书后进入系统需要登陆两次问题处理

发布时间 2023-05-30 11:00:05作者: 时光煮酒丶

最近给网站配置了HTTPS,配置后发现系统需要登陆两次才能进入,而测试环境(没有配置SSL)没有这个问题,一通GOOGLE后问题解决了,这里记录一下:
如果网站配置 HTTPS SSL 证书后遇到了需要登录两次才能成功的问题,可能是由于缺少 cookie 安全标志导致的。
当启用 HTTPS SSL 证书后,浏览器会对发送和接收的每个 cookie 进行加密。在这种情况下,如果缺少 cookie 的安全标志,那么浏览器可能无法正确处理 cookie。

为了解决这个问题,您应该确保所有 cookie 都包含一个名为 Secure 的安全标志。该标志告诉浏览器只有在通过 HTTPS SSL 协议连接时才发送 cookie。

另外,还应该将 SameSite 标志设置为 Strict,以确保 cookie 只能与站点的完全等效 URL 一起使用。

以下是使用 Flask 框架的为例:

from flask import Flask, request, make_response, session

app = Flask(__name__)
app.secret_key = 'your_secret_key_here'

# 登录路由
@app.route('/login', methods=['POST'])
def login():
    # 处理用户登录逻辑...

    # 设置 session
    session['username'] = 'your_username_here'

    # 返回响应
    response = make_response('Logged in successfully')
    response.set_cookie('session', value=session.sid, secure=True, httponly=True, samesite='Strict')
    return response

# 主页路由
@app.route('/')
def index():
    # 获取用户信息
    username = session.get('username')

    # 如果未登录,则重定向到登录页面
    if not username:
        return redirect('/login')

    # 处理主页逻辑...

    # 返回响应
    response = make_response('Hello, {}!'.format(username))
    response.set_cookie('session', value=session.sid, secure=True, httponly=True, samesite='Strict')
    return response

if __name__ == '__main__':
    app.run(ssl_context=('cert.pem', 'key.pem'))

在上面的示例代码中,我们使用 Flask 框架实现了登录路由和主页路由。在处理登录和主页请求时,我们都在响应中设置了一个名为 session 的 cookie,并指定了 secure=True 和 samesite='Strict' 参数。

请注意,如果您使用的是其他框架或工具,需要根据其文档中提供的方法来设置 cookie 安全标志。
改代码太麻烦,可以直接在Nnginx添加配置:

server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /path/to/your/cert.pem;
    ssl_certificate_key /path/to/your/key.pem;

    # 添加以下两个指令启用cookie安全标志和SameSite属性
    add_header Set-Cookie "HttpOnly; Secure; SameSite=Strict";

    location / {
        # 处理请求...
    }
}

在上面的 add_header 指令中,我们设置了 Secure 和 SameSite=Strict 标志,以确保 cookie 只能通过 HTTPS SSL 协议发送,并且只能与站点的完全等效 URL 一起使用。

请注意,在使用 Nginx 的 add_header 指令设置 cookie 属性时,应该使用双引号将整个字符串括起来,以确保正确解析所有参数。

此外,如果您的网站同时支持 HTTP 和 HTTPS 访问,您还需要在 HTTP 的访问中禁用 cookie 的传输,避免被劫持或者 XSS 攻击,具体配置如下:

server {
    listen 80;
    server_name your_domain.com;

    # 禁用cookie在HTTP中传输
    add_header Set-Cookie "HttpOnly; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT";

    location / {
        rewrite ^ https://$server_name$request_uri? permanent;
    }
}

在上面的配置中,我们通过 add_header 指令设置了一个名为 HttpOnly 的 cookie,并将路径设置为 /,过期时间设置为 UNIX 时间戳 0,这样就会在 HTTP 访问中禁用 cookie 的传输。

需要注意的是,在 Nginx 配置中启用 cookie 安全标志和 SameSite 属性时,应该根据实际情况进行调整,并确保与您的应用程序兼容。