从 HTTPS 请求中找到 json/dict 的客户端证书
Find a json/dict of the client certificate from a HTTPS request
我有一个客户端证书 - 我正在构建的 Flask 端点的服务器证书。目前 HTTPS 请求可以通过,我可以像这样在服务器端打印客户端证书的详细信息:
@app.route('/predict', methods=['POST'])
def predict():
res = "hi"
status = False
if request.url.startswith('https://'):
client_cert = request.headers["CLIENT_CERT"]
res = client_cert["subject"]
print(client_cert)
它打印出来自请求的客户端证书的信息:
"{'subject': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', '*.domainname.com'),)), 'issuer': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', 'SAMPLE CA'),)), 'version': 1, 'serialNumber': '01', 'notBefore': 'Aug 12 07:21:25 2021 GMT', 'notAfter': 'Aug 12 07:21:25 2022 GMT'}"
我希望检索上述字符串中的 commonName
条目以进行进一步验证,因为我只想允许 commonName
采用我期望的特定格式。
如您所见,从请求的 headers 中检索客户端证书会以 字符串 的形式提供证书。因为这不是一个正常的json字符串,所以我不能用json.loads
把这个字符串解析成字典。有没有什么好的方法来解析这个字符串,以便我可以获得 commonName
值,或者是否有任何其他好的方法来访问请求的客户端证书?
谢谢!
响应的格式似乎定义明确。在这种情况下,这将实现 OP 的 objective。毫无疑问,RE 可以解决问题,但这简单有效:-
def getCommonNames(s):
rv = []
offset = 0
try:
while True:
i = s.index('commonName', offset)
offset = i + 14
j = s.index("'", offset)
rv.append(s[offset:j])
except Exception:
pass
return rv
S = "{'subject': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', '*.domainname.com'),)), 'issuer': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', 'SAMPLE CA'),)), 'version': 1, 'serialNumber': '01', 'notBefore': 'Aug 12 07:21:25 2021 GMT', 'notAfter': 'Aug 12 07:21:25 2022 GMT'}"
print(getCommonNames(S))
我有一个客户端证书 - 我正在构建的 Flask 端点的服务器证书。目前 HTTPS 请求可以通过,我可以像这样在服务器端打印客户端证书的详细信息:
@app.route('/predict', methods=['POST'])
def predict():
res = "hi"
status = False
if request.url.startswith('https://'):
client_cert = request.headers["CLIENT_CERT"]
res = client_cert["subject"]
print(client_cert)
它打印出来自请求的客户端证书的信息:
"{'subject': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', '*.domainname.com'),)), 'issuer': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', 'SAMPLE CA'),)), 'version': 1, 'serialNumber': '01', 'notBefore': 'Aug 12 07:21:25 2021 GMT', 'notAfter': 'Aug 12 07:21:25 2022 GMT'}"
我希望检索上述字符串中的 commonName
条目以进行进一步验证,因为我只想允许 commonName
采用我期望的特定格式。
如您所见,从请求的 headers 中检索客户端证书会以 字符串 的形式提供证书。因为这不是一个正常的json字符串,所以我不能用json.loads
把这个字符串解析成字典。有没有什么好的方法来解析这个字符串,以便我可以获得 commonName
值,或者是否有任何其他好的方法来访问请求的客户端证书?
谢谢!
响应的格式似乎定义明确。在这种情况下,这将实现 OP 的 objective。毫无疑问,RE 可以解决问题,但这简单有效:-
def getCommonNames(s):
rv = []
offset = 0
try:
while True:
i = s.index('commonName', offset)
offset = i + 14
j = s.index("'", offset)
rv.append(s[offset:j])
except Exception:
pass
return rv
S = "{'subject': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', '*.domainname.com'),)), 'issuer': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', 'SAMPLE CA'),)), 'version': 1, 'serialNumber': '01', 'notBefore': 'Aug 12 07:21:25 2021 GMT', 'notAfter': 'Aug 12 07:21:25 2022 GMT'}"
print(getCommonNames(S))