2015-06-02 22 views
10

Tôi dường như không thể bắt tay làm việc đúng cách.Yêu cầu Python gửi chứng chỉ dưới dạng chuỗi

cert = 'path/to/cert_file.pem' 
url = 'https://example.com/api' 

requests.get(url, cert=cert, verify=True) 

Điều này là tốt khi tôi sử dụng tại địa phương nơi tôi có tệp. Chúng tôi lưu trữ ứng dụng của chúng tôi trên heroku và sử dụng environvariables.

Mô-đun yêu cầu dường như không chấp nhận chứng chỉ dưới dạng chuỗi. ví dụ.

$ export CERTIFICATE="long-list-of-characters" 

requests.get(url, cert=get_env('CERTIFICATE'), verify=True) 

Tôi cũng đã thử một cái gì đó như thế này:

cert = tempfile.NamedTemporaryFile() 
cert.write(CERTIFICATE) 
cert.seek(0) 
requests.get(url, cert=cert.name, verify=True) 

Trước hết, nó hoạt động tại địa phương nhưng không phải trên Heroku. Dù sao, nó không cảm thấy như một giải pháp vững chắc. Tôi gặp lỗi bắt tay SSL.

Mọi đề xuất?

+1

Có thể trùng lặp của [Làm thế nào để mở ssl socket bằng cách sử dụng chứng chỉ được lưu trữ trong các biến chuỗi trong python] (http://stackoverflow.com/questions/12336239/how -to-open-ssl-socket-using-certificate-được lưu-trong-chuỗi-biến-in-python) –

+0

@Gelbander, người đã ký cert_file.pem? Nó có được ký tự bởi Cơ quan cấp chứng chỉ gốc/tùy chỉnh của bạn không? Bạn đã thử tải lên tệp pem của mình lên Heroku chưa, chỉ để chắc chắn rằng nó hoạt động thông qua đường dẫn đầy đủ của pem trong Heroku? –

+0

Ngoài ra tôi không chắc chắn bằng cách sử dụng các biến env là cách ưa thích. Nó có thể tốt hơn bằng cách sử dụng "heroku certs: thêm server.crt server.key" –

Trả lời

1

Theo tài liệu requests:

Các khóa riêng để chứng địa phương của bạn phải được mã hóa. Hiện tại, Yêu cầu không hỗ trợ sử dụng các khóa được mã hóa.

Bạn có thể [cũng] chỉ định một cert địa phương để sử dụng như giấy chứng nhận phía khách hàng, như một tập tin duy nhất (chứa khóa riêng và giấy chứng nhận) hoặc như một tuple của con đường của cả hai tập tin:

requests.get('https://kennethreitz.com', cert=('/path/client.cert', '/path/client.key')) 

Bạn phải bao gồm đường dẫn cho cả khóa công cộng và khóa riêng tư ... hoặc bạn có thể bao gồm đường dẫn đến một tệp có chứa cả hai.

1

Câu trả lời của Vasili về mặt kỹ thuật là chính xác, mặc dù nó không trả lời câu hỏi của bạn. Các keyfile, thực sự, phải được mã hóa để bắt đầu với.

Bản thân tôi vừa giải quyết một tình huống giống như của bạn. Bạn đang đi đúng hướng; tất cả các bạn phải làm là

1. đèo delete=False-NamedTemporaryFile(), vì vậy các tập tin sẽ không bị xóa sau khi gọi close()

2.close() các tempfile trước khi sử dụng nó, vì vậy nó sẽ được lưu

Lưu ý rằng đây là điều rất không an toàn để thực hiện. delete=False, như tôi hiểu, làm cho tệp ở lại trên đĩa ngay cả sau khi xóa tham chiếu đến nó. Vì vậy, để xóa tệp, bạn nên gọi theo cách thủ công os.unlink(tmpfile.name).

Thực hiện việc này với chứng chỉ là rủi ro bảo mật rất lớn: bạn phải đảm bảo rằng chuỗi có chứng chỉ được bảo mật và ẩn và không ai có quyền truy cập vào máy chủ. Tuy nhiên, đây là một thực tế hữu ích trong trường hợp, ví dụ như quản lý ứng dụng của bạn trên máy chủ Heroku như môi trường thử nghiệm và trong hình ảnh Docker được tạo trong đám mây, nơi chỉ thị COPY không phải là một tùy chọn.Nó cũng chắc chắn tốt hơn so với lưu trữ các tập tin trong kho git của bạn: D

Các vấn đề liên quan