أجد صعوبة في الاتصال بموقع SSL (شهادة موقعة ذاتيًا) يبدو أنه يعمل من أجهزة كمبيوتر / اتصالات إنترنت أخرى. لقد حاولت الوصول إلى الموقع باستخدام wget:

wget https://example.com --no-check-certificate
--2018-02-06 17:07:50--  https://example.com
Resolving example.com... xx.xx.xx.xx
Connecting to example.com|xx.xx.xx.xx|:443... connected.
Unable to establish SSL connection.

ثم استخدمت Python3 ووحدة الطلبات في محاولة أخرى:

>>> r = requests.get("https://example.com", verify=False)
Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/usr/lib/python3.5/site-packages/urllib3/connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "/usr/lib/python3.5/site-packages/urllib3/connectionpool.py", line 850, in _validate_conn
    conn.connect()
  File "/usr/lib/python3.5/site-packages/urllib3/connection.py", line 326, in connect
    ssl_context=context)
  File "/usr/lib/python3.5/site-packages/urllib3/util/ssl_.py", line 329, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/home/linux-dev/target/usr/lib/python3.5/ssl.py", line 377, in wrap_socket
  File "/home/linux-dev/target/usr/lib/python3.5/ssl.py", line 752, in __init__
  File "/home/linux-dev/target/usr/lib/python3.5/ssl.py", line 988, in do_handshake
  File "/home/linux-dev/target/usr/lib/python3.5/ssl.py", line 633, in do_handshake
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/usr/lib/python3.5/site-packages/urllib3/connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/lib/python3.5/site-packages/urllib3/util/retry.py", line 357, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/usr/lib/python3.5/site-packages/urllib3/packages/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/usr/lib/python3.5/site-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/usr/lib/python3.5/site-packages/urllib3/connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "/usr/lib/python3.5/site-packages/urllib3/connectionpool.py", line 850, in _validate_conn
    conn.connect()
  File "/usr/lib/python3.5/site-packages/urllib3/connection.py", line 326, in connect
    ssl_context=context)
  File "/usr/lib/python3.5/site-packages/urllib3/util/ssl_.py", line 329, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/home/linux-dev/target/usr/lib/python3.5/ssl.py", line 377, in wrap_socket
  File "/home/linux-dev/target/usr/lib/python3.5/ssl.py", line 752, in __init__
  File "/home/linux-dev/target/usr/lib/python3.5/ssl.py", line 988, in do_handshake
  File "/home/linux-dev/target/usr/lib/python3.5/ssl.py", line 633, in do_handshake
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/site-packages/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3.5/site-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3.5/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3.5/site-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3.5/site-packages/requests/adapters.py", line 490, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
>>>

ثم حاولت بعد ذلك استخدام openssl لمعرفة المزيد من المعلومات التفصيلية:

# openssl s_client -connect example.com:443 -servername example.com
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 330 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1517926190
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

يؤدي تشغيل نفس الأمر openssl من جهاز كمبيوتر مختلف (مع اتصال إنترنت مختلف) إلى الإخراج التالي:

# openssl s_client -connect example.com:443 -servername example.com
CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = example.com
verify return:1
---
Certificate chain
 0 s:/CN=example.com
   i:/CN=example.com
---
Server certificate
-----BEGIN CERTIFICATE-----
.
.
.
-----END CERTIFICATE-----
subject=/CN=example.com
issuer=/CN=example.com
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 706 bytes and written 456 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-ECDSA-AES256-GCM-SHA384
Server public key is 256 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-ECDSA-AES256-GCM-SHA384
    Session-ID: xxxxxx
    Session-ID-ctx:
    Master-Key: xxxxxx
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1517926278
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
closed

ما الذي يمكن أن يسبب فشل الاتصال؟

answer

مع نتيجتين مختلفتين تمامًا من اتصالين مختلفين تمامًا ، أفترض أن المشكلة هي DNS ، تأكد من حصولك على نفس عنوان IP على كلا المضيفين. قد يكون لديك إدخال ملف مضيف على أحد هذه أيضًا ، لذا تحقق من ذلك.

اتضح أن المشكلة تكمن في قيام مزود خدمة الإنترنت بحظر بعض مجالات المستوى الأعلى. عندما تم الوصول إلى المجال ، عرض جدار الحماية الخاص بهم استجابة HTTP 503 وصفحة HTML تشير إلى أن الموقع قد تم حظره. كان من الصعب تشخيص المشكلة لأن الموقع الأصلي الذي أحاول الاتصال به يستخدم SSL ، وأي رسائل خطأ مختصرة ومختصرة: "تعذر إنشاء اتصال SSL" ، "إعادة تعيين الاتصال بواسطة النظير" إلخ. استخدام wget للوصول إلى الصفحة أيضًا لا تساعد لأنه بمجرد تلقيها الخطأ 503 ، فإنها تخرج ببساطة دون حفظ HTML resopnse.

انتهى بي الأمر إلى حل المشكلة عن طريق إعداد خادم ويب HTTP بسيط غير SSL باستخدام وحدة http.server الخاصة بـ Python 3 على الخادم المعني ثم محاولة الاتصال به من جهاز به مشكلات باستخدام وحدة طلبات Python. سمح لي هذا بعد ذلك بمشاهدة محتوى الاستجابة ومشاهدة صفحة HTML الخاصة بـ ISP "محظورة".