从 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))