#python #ssl #request #openssl #certificate
Вопрос:
У меня есть сертификат клиента — сертификат сервера для конечной точки колбы, которую я создаю. В настоящее время 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
, чтобы она была в определенном формате, который я ожидаю.
Как вы можете видеть, получение сертификата клиента из заголовков запроса дает сертификат в виде строки. Поскольку это не строка правильного json, я не могу использовать json.loads
ее для анализа строки в словаре. есть ли какой-либо хороший способ проанализировать эту строку, чтобы я мог получить commonName
значение, или есть какой-либо другой хороший способ получить доступ к сертификату клиента запроса?
Спасибо!
Ответ №1:
Формат ответа, по-видимому, четко определен. В этом случае это позволит достичь цели операции. Несомненно, есть огонь, который сделает свое дело, но это просто и эффективно:-
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))