使用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]
- 我正在使用从 GoDaddy 购买的自定义域
- 我按照这个 link 设置了 SSL 证书
- 我还在 pythonanywhere 中启用了 forcing-https。
- 我将视图中的回调 url 从
http://<my_domain>.org/payment/status/
更改为 https://<my_domain>.org/payment/status/
- 回调 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.
,请尝试添加它并查看是否可以解决问题。
我的网络应用程序中有一个 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]
- 我正在使用从 GoDaddy 购买的自定义域
- 我按照这个 link 设置了 SSL 证书
- 我还在 pythonanywhere 中启用了 forcing-https。
- 我将视图中的回调 url 从
http://<my_domain>.org/payment/status/
更改为https://<my_domain>.org/payment/status/
- 回调 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.
,请尝试添加它并查看是否可以解决问题。