2013-04-04 1 views
2

저는 웹 사이트에 https 연결을 만들고 https 연결의 속성을 반환하는 python (또는 Java) 프로그램을 작성하려고합니다. 나는 파이썬의 SSL (http://docs.python.org/2/library/ssl.html), 특히 .cipher() 메소드를 사용 해왔다. 출력과 함께 내 주요 문제는 매우 구체적인되지 않는 것입니다 :TLS 연결에 대한 정확한 암호 정보를 반환하는 Python API가 있습니까?

('RC4-SHA', 'TLSv1의/SSLv3에', 128)

이 www.amazon.com의 출력이다. 그러나 브라우저에 들어가 수동으로 연결을 검사하면 SHA1 메시지 인증, RSA 키 교환 및 TLS v1.0이 포함 된 RC4가 실제로 표시됩니다. 실제로 .cipher() 메서드는 TLS 버전 1.0, 1.1 및 1.2 용 TLSv1/SSLv3을 출력하고 SHA1 및 SHA256 용 SHA를 출력합니다.

https 연결에 대한 자세한 정보를 제공하는 Python (또는 Java) API가 있습니까?

+0

다른 라이브러리를 연결에 사용하려고합니까 (물론 다른 암호 등을 협상 할 것입니까?)? 아니면 stdlib'ssl' 모듈에서 더 많은 정보를 얻으려면? – abarnert

답변

4

파이썬 ssl 모듈은 OpenSSL을 둘러싼 단순한 래퍼이며 라이브러리가 제공하는 것 이상의 정보를 제공 할 수 없습니다. 그러나 정말로, 나는 당신이 어떤 정보도 놓치고 있다고 생각하지 않는다. 입니다. 당신은 항상 TLSv1.0과 SHA1을 얻고 있습니다.

먼저 OpenSSL 0.9의 TLSv1/SSLv3은 TLSv1.0을 의미합니다. OpenSSL 0.9는 이러한 프로토콜을 지원하지 않기 때문에 1.1 또는 1.2를 의미 할 수 없습니다. (그리고 아마도 OpenSSL 0.9를 사용하고있을 것입니다. 예를 들어 Python.org에서 방금 얻은 64 비트 Mac 바이너리 3.3.0 설치 프로그램은 0.9.8r를 사용합니다.) 파이썬에서 ssl.OPENSSL_VERSION으로 확인할 수 있습니다.

둘째, RC4-SHA은 SHA1을 의미하며 SHA256을 의미하지 않습니다. RC4-SHA은 TLSv1.0 암호 집합 TLS_RSA_WITH_RC4_128_SHA의 OpenSSL 이름 일뿐입니다. 이것은 암호의 완전한 사양입니다. 그들의 이름 끝에 SHA256과 다른 암호가 있습니다. RFC 2246 및 TLS 1.0에 대한 addenda (1.1은 RFC4346, 1.2는 RFC 5246)에 지정된 암호 그룹 목록을 볼 수 있습니다. 나는 OpenSSL 이름에서 RFC 이름으로의 매핑이 코드 내부를 제외하고는 어디에도 지정되어 있지 않다고 생각하지만 명령 행 OpenSSL 도구가 있다면 openssl ciphers을 입력하면 제안 된 모든 암호 스위트의 OpenSSL 이름 목록을 덤프 할 수 있습니다. 전송 한 다음 핸드 셰이크에서 전송 된 값과 일치시킬 수 있습니다. (openssl s_client -connect www.amazon.com:443 -msg, 악수를 보려면, 또는 -msg에 추가/대신 -debug 또는 다른 플래그를보십시오.)

그럼, 왜 브라우저 쇼 TLSv1.2 또는 SHA256는 그 같은 사이트의 일부입니까? 브라우저가 완전히 다른 SSL 라이브러리 (또는 최신 OpenSSL)를 가지고 있으므로 서버와 완전히 다른 핸드 셰이크를 수행하고 다른 암호 제품군에 동의하게되므로 다른 정보가보고됩니다.

그래서 파이썬이 TLSv1.2 나 SHA256을 협상하고 당신을 그냥 숨기는 것은 아닙니다. 동일한 서버로 TLSv1.0과 SHA1을 협상하고 이것이 무엇을했는지 알려줍니다.

OpenSSL 0.9에서 처리 할 수없는 다른 라이브러리를 사용하려면 많은 선택 항목이 있습니다. OpenSSL 1.0.1 이상을 설치하고 그에 대해 PyOpenSSL을 빌드하면 새로운 프로토콜과 암호를 협상 할 수 있어야하고 그렇게했는지 확인해야한다고 생각합니다. 파이썬 또는 독립형 ssl 모듈을 다시 빌드하면 재 작업 할 수도 있습니다. (그 중 어느 것도 작동하지 않는 경우, PyPI에서 OpenSSL wrappers and other SSL 또는 TLS 개의 모듈이 있거나, 직접 ctypes 자신이 될 수 있습니다.)

관련 문제