Flask приложение с использованием TLS - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь выполнить свое приложение Flask по TLS, это мой пример:

from flask import Flask
import ssl
app = Flask(__name__)


@app.route('/ping')
def ping():
    return 'pong'


if __name__ == '__main__':
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
    context.verify_mode = ssl.CERT_REQUIRED
    context.load_verify_locations('./ca-crt.pem')
    context.load_cert_chain('./server.crt', './server.key')
    app.run('0.0.0.0', 8080, ssl_context=context)

и вот как я генерирую сертификаты:

# create server private key and server CSR
openssl req -nodes -new -keyout server.key -out server.csr

# generate certicate based on server's CSR using CA root certificate and CA private key
openssl x509 -req -days 365 -in server.csr -CA ca-crt.pem -CAkey ca.key -CAcreateserial -out server.crt

# verify the certificate (optionally)
openssl verify -CAfile ca-crt.pem server.crt

в то время как для сертификата клиента:

# create client private key and client CSR
openssl req -nodes -new -keyout client.key -out client.csr

# generate certicate based on client's CSR using CA root certificate and CA private key
openssl x509 -req -days 365 -in client.csr -CA ca-crt.pem -CAkey ca.key -CAcreateserial -out client.crt

# verify the certificate (optionally)
openssl verify -CAfile ca-crt.pem client.crt

Но когда я пытаюсь выполнить свой запрос curl:

curl --insecure --cacert ca-crt.pem --key client.key --cert client.crt https://localhost:8080/ping -v
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
* found 1 certificates in ca-crt.pem
* found 597 certificates in /etc/ssl/certs
* ALPN, offering http/1.1
* gnutls_handshake() failed: CA is unknown
* Closing connection 0
curl: (35) gnutls_handshake() failed: CA is unknown

В чем проблема?
В случае удаления детали для идентификации клиента , работает:

if __name__ == '__main__':
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
    context.load_cert_chain('server.crt', 'server.key')
    app.run('0.0.0.0', 8080, ssl_context=context)

curl --insecure https://localhost:8080/ping  
pong

Более того, в случае сертификатов с паролем, как указать пароль PEM при загрузке сертификатов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...