使用pythonanywhere ssl证书的隐私错误

Privacy error using pythonanywhere ssl certificate

我的网络应用程序中有一个 ,需要 SSL 证书才能正常工作。

网络应用程序是托管在 pythonanywhere 的 django 网络应用程序。我使用他们的 Auto-renewing Let's Encrypt certificate 添加 SSL 证书并使网站加载为 HTTPS 网站。

该网站现在作为 HTTPS 网站加载,但在退出支付网关时我仍然收到如下隐私错误

Your connection is not private
Attackers might be trying to steal your information from <my domain> (for example, passwords, messages or credit cards). Learn more
NET::ERR_CERT_COMMON_NAME_INVALID

我不确定我做错了什么

[EDIT-1]

  1. 我正在使用从 GoDaddy 购买的自定义域
  2. 我按照这个 link 设置了 SSL 证书
  3. 我还在 pythonanywhere 中启用了 forcing-https
  4. 我将视图中的回调 url 从 http://<my_domain>.org/payment/status/ 更改为 https://<my_domain>.org/payment/status/
  5. 回调 url 页面不包含任何 http 链接。只是一个 css 文件如下 <link rel="stylesheet" href="{% static 'css/paymentstatus.css' %}">

请注意,当我访问该网站时,它显示为 https。仅当调用回调 URL 时才会 return 隐私错误。

当我在本地系统中使用 ngrok 尝试时,我没有遇到此错误。此错误仅在 pythonanywhere.

时发生

[EDIT-2]

nslookup mydomain.org

▶ nslookup mydomain.org
Server:     2405:201:e011:3804::c0a8:1d01
Address:    2405:201:e011:3804::c0a8:1d01#53

Non-authoritative answer:
Name:   mydomain.org
Address: IP_ADDRESS

dig mydomain.org

▶ dig mydomain.org
; <<>> DiG 9.10.6 <<>> mydomain.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8056
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mydomain.org.      IN  A

;; ANSWER SECTION:
mydomain.org.   225 IN  A   IP_ADDRESS

;; Query time: 2 msec
;; SERVER: 2405:201:e011:3804::c0a8:1d01#53(2405:201:e011:3804::c0a8:1d01)
;; WHEN: Fri Jan 15 14:18:23 IST 2021
;; MSG SIZE  rcvd: 51

[EDIT-3]

我将 url 从 https://<my_domain>.org/ 更改为 https://www.<my_domain>.org/。这会导致 404 错误。我在下面添加了 views.py 和 url.py

views.py

def donate(request):
    if request.method == "POST":
        form = DonateForm(request.POST)

        name = request.POST.get('firstName')
        phone = request.POST.get('phone')
        email = request.POST.get('email')
        amount = float("{0:.2f}".format(int(request.POST.get('amount'))))
        ord_id = OrdID()
        cust_id = CustID()

        paytm_params = {
            "MID" : MERCHANTID,
            "WEBSITE" : "DEFAULT",
            "INDUSTRY_TYPE_ID" : "Retail",
            "CHANNEL_ID" : "WEB",
            "ORDER_ID" : ord_id,
            "CUST_ID" : cust_id,
            "MOBILE_NO" : phone,
            "EMAIL" : email,
            "TXN_AMOUNT" : str(amount),
            "CALLBACK_URL" : "https://www.<my_domain>.org/payment/status/",

            }

        paytm_params['CHECKSUMHASH'] = Checksum.generate_checksum(paytm_params, MERCHANTKEY)

        if form.is_valid():
            form.save()

        return render(request, 'paytm.html', {'paytm_params': paytm_params})

    else:
        form = DonateForm()
        context = {'Donate': form}
        return render(request, 'donate.html', context=context)

@csrf_exempt
def handlerequest(request):
    if request.method == "POST":
        form = request.POST
        response_dict = {}

        for i in form.keys():
            response_dict[i] = form[i]

            if i == 'CHECKSUMHASH':
                checksum = form[i]
                print(checksum)

        verify = Checksum.verify_checksum(response_dict, MERCHANTKEY, checksum)

        if verify:
            if response_dict['RESPCODE'] == '01':
                print('order successful')
            else:
                print('error: ' + response_dict['RESPMSG'])

        return render(request, 'paymentstatus.html', {'response': response_dict})

urls.py

urlpatterns = [

    ...

    path('donate', views.donate, name='donate'),
    path('payment/status', views.handlerequest, name='handlerequest'),

    ...
]

[解决方案]

首先是 www. 到 url,正如答案所表明的那样是问题所在。 404错误就这样解决了

原来views中的路径和urls中的路径应该是一样的。这解决了我的问题。


def donate(request):

    ...

    paytm_params = {
            "MID" : MERCHANTID,
            "WEBSITE" : "DEFAULT",
            "INDUSTRY_TYPE_ID" : "Retail",
            "CHANNEL_ID" : "WEB",
            "ORDER_ID" : ord_id,
            "CUST_ID" : cust_id,
            "MOBILE_NO" : phone,
            "EMAIL" : email,
            "TXN_AMOUNT" : str(amount),
            "CALLBACK_URL" : "https://www.<my_domain>.org/payment/status",
    
    ...

urls.py

urlpatterns = [

    ...

    path('donate', views.donate, name='donate'),
    path('payment/status', views.handlerequest, name='handlerequest'),

    ...
]

注意urls.py中的路径如下payment/status。以前在视图中,路径末尾有一个斜线,如 https://www.<my_domain>.org/payment/status/。最后删除斜杠对我有用。

我现在就猜:

  • DNS 需要一些时间来传播支付提供商 DNS 数据库

航站楼内

# check NS record
nslookup yourdomain.org
# try to force refresh for few times
dig yourdomain.org

请分享输出

  • 或者我最担心的是您正在使用 CDN 服务或在您的 https

    中加载在 http 上提供的资产
  • 在浏览器中左击锁定图标并检查证书,如果一切正常,您必须再次联系他们的支持以强制刷新他们的 DNS,通常需要一些时间才能工作自动。

如果您的站点是在 PythonAnywhere 上设置的,它可能位于 https://www.<my_domain>.org/,而不是 https://<my_domain>.org/。因此,如果您的回调 URL 在开始时不包含 www.,请尝试添加它并查看是否可以解决问题。